diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..457ee303 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the nf-core/ampliseq devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..64befd4a --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @d4straub @erikrikarddaniel diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index bf44d961..3b9724c7 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -25,9 +25,9 @@ runs: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install nf-test uses: nf-core/setup-nf-test@v1 @@ -52,6 +52,8 @@ runs: with: auto-update-conda: true conda-solver: libmamba + channels: conda-forge + channel-priority: strict conda-remove-defaults: true - name: Run nf-test diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index a3675efb..1339d5c9 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -25,21 +25,21 @@ jobs: - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ steps.revision.outputs.revision }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/ampliseq/work-${{ steps.revision.outputs.revision }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/ampliseq/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/ampliseq/results-${{ steps.revision.outputs.revision }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/ampliseq/results-${{ steps.revision.outputs.revision }}" } profiles: test_full - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index b548138f..9dbf4ccc 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -14,20 +14,20 @@ jobs: - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/ampliseq/work-${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/ampliseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/ampliseq/results-test-${{ github.sha }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/ampliseq/results-test-${{ github.sha }}" } profiles: test - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index ac030fd5..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 9a9d77c2..b48af73d 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -44,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -57,7 +57,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | @@ -138,7 +138,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 45b9f120..7fb79553 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,21 +67,21 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8b0f88c3..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - name: Set up Python 3.13 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index d43797d9..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 6514b3ac..cf815a15 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,7 +18,7 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.2" + NFT_VER: "0.9.3" NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -64,7 +64,7 @@ jobs: runs-on: # use self-hosted runners - runs-on=${{ github.run_id }}-nf-test - runner=4cpu-linux-x64 - - disk=large # '-profile test_multiregion' with singularity requires the larger disk + - volume=80gb # '-profile test_multiregion' with singularity requires the larger disk strategy: fail-fast: false matrix: @@ -79,14 +79,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.04.0" - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -96,6 +96,7 @@ jobs: continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 0f732495..431d3d44 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -14,6 +14,10 @@ jobs: run: | echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT + - name: get description + id: get_description + run: | + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -22,7 +26,7 @@ jobs: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release message: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! - + ${{ steps.get_description.outputs.description }} Please see the changelog: ${{ github.event.release.html_url }} ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index beb5c77f..e8560fc7 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index 29d1b868..ceb8d60e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -8,7 +8,7 @@ lint: - params.report_template - params.report_css - params.report_logo -nf_core_version: 3.3.2 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Daniel Straub, Alexander Peltzer @@ -20,7 +20,7 @@ template: outdir: . skip_features: - igenomes - version: 2.15.0 + version: 2.16.0 update: https://github.com/nf-core/modules.git: nf-core: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bb41beec..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: additional_dependencies: - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] diff --git a/.prettierignore b/.prettierignore index edd29f01..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,7 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/CHANGELOG.md b/CHANGELOG.md index e9e53b50..4ddc0804 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,33 @@ 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). +## nf-core/ampliseq version 2.16.0 - 2025-12-19 + +### `Added` + +### `Changed` + +[#928](https://github.com/nf-core/ampliseq/pull/928) - Resource allocations were reduced for most smaller processes. +[#931](https://github.com/nf-core/ampliseq/pull/931) - For `--dada_ref_taxonomy`, replace `sbdi-gtdb=R10-RS226-1` with updated database `sbdi-gtdb=R10-RS226-2` (see https://figshare.scilifelab.se/articles/dataset/SBDI_Sativa_curated_16S_GTDB_database/14869077/10) + +### `Fixed` + +[#926](https://github.com/nf-core/ampliseq/pull/926),[932](https://github.com/nf-core/ampliseq/pull/932) - Template update for nf-core/tools version 3.5.1 +[#929](https://github.com/nf-core/ampliseq/pull/929),[#935](https://github.com/nf-core/ampliseq/pull/935) - A bug in a dependency of MultiQC can lead (rarely) to plot generation being omitted, without warning. In that case, the subsequent pipeline summary report failed previously, now it gracefully handles that issue. + +### `Dependencies` + +- [#936](https://github.com/nf-core/ampliseq/pull/936) - Updated some software versions + +| software | previously | now | +| -------- | ---------- | ------ | +| Cutadapt | 4.6 | 5.2 | +| DADA2 | 1.30.0 | 1.34.0 | +| Phyloseq | 1.46.0 | 1.50.0 | +| MultiQC | 1.29 | 1.33 | + +### `Removed` + ## nf-core/ampliseq version 2.15.0 - 2025-10-06 ### `Added` diff --git a/README.md b/README.md index bbed8260..760c1d0c 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,14 @@ +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/ampliseq) [![GitHub Actions CI Status](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/ampliseq/results)[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1493841-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1493841)[![Cite Publication](https://img.shields.io/badge/Cite%20Us!-Cite%20Publication-important?labelColor=000000)](https://doi.org/10.3389/fmicb.2020.550420) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index b73d3438..2a714f7f 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,8 +1,5 @@ report_comment: > - This report has been generated by the nf-core/ampliseq analysis pipeline. For information about how - to interpret these results, please see the documentation. + This report has been generated by the nf-core/ampliseq analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: "nf-core-ampliseq-methods-description": order: -1000 diff --git a/assets/report_template.Rmd b/assets/report_template.Rmd index 03ca4b96..c521dfeb 100644 --- a/assets/report_template.Rmd +++ b/assets/report_template.Rmd @@ -245,8 +245,20 @@ MultiQC report, which can be found in [multiqc/multiqc_report.html](../multiqc/m ")) ``` + + ```{r, eval = !isFALSE(params$mqc_plot), out.width='100%', dpi=1200, fig.align='center'} -knitr::include_graphics(params$mqc_plot) +if ( file.exists(params$mqc_plot) ) { + knitr::include_graphics(params$mqc_plot) +} +``` +```{r, eval = !isFALSE(params$mqc_plot), results='asis'} +if ( !file.exists(params$mqc_plot) ) { + cat(paste0(" +_This plot is missing. That is only a visual mishap, all data can be found in the MultiQC report._ +_The cause is likely a bug in Kaleido, a dependency of MultiQC. There is no need to take action._ + ")) +} ``` diff --git a/conf/base.config b/conf/base.config index b8517d4c..d0d7d8de 100644 --- a/conf/base.config +++ b/conf/base.config @@ -12,8 +12,8 @@ process { // nf-core: Check the defaults for all processes cpus = { 1 * task.attempt } - memory = { 6.GB * task.attempt } - time = { 4.h * task.attempt } + memory = { 1.GB * task.attempt } + time = { 1.h * task.attempt } errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 3 @@ -27,30 +27,38 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { cpus = { 1 } - memory = { 6.GB * task.attempt } + memory = { 1.GB * (2 ** (task.attempt - 1)) } time = { 4.h * task.attempt } } withLabel:process_low { - cpus = { 2 * task.attempt } - memory = { 12.GB * task.attempt } - time = { 4.h * task.attempt } + cpus = { 2 * task.attempt } + memory = { 3.GB * (2 ** (task.attempt - 1)) } + time = { 4.h * task.attempt } } withLabel:process_medium { - cpus = { 6 * task.attempt } - memory = { 36.GB * task.attempt } - time = { 12.h * task.attempt } + cpus = { 6 * task.attempt } + memory = { 6.GB * (2 ** (task.attempt - 1)) } + time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { 20 * task.attempt } - memory = { 120.GB* task.attempt } - time = { 36.h * task.attempt } + cpus = { 10 * task.attempt } + memory = { 20.GB * (2 ** (task.attempt - 1)) } + time = { 24.h * task.attempt } + } + withLabel:process_huge { + cpus = { 20 * task.attempt } + memory = { 120.GB * task.attempt } + time = { 36.h * task.attempt } } withLabel:process_long { time = { 48.h * task.attempt } } - withLabel:single_cpu { + withLabel:process_cpu_single { cpus = 1 } + withLabel:process_medium_memory { + memory = { 50.GB* (2 ** (task.attempt - 1)) } + } withLabel:process_high_memory { memory = { 200.GB * task.attempt } } @@ -65,10 +73,4 @@ process { ext.use_gpu = { workflow.profile.contains('gpu') } accelerator = { workflow.profile.contains('gpu') ? 1 : null } } - - withName:QIIME2_EXTRACT { - cpus = { 12 * task.attempt } - memory = { 12.GB * task.attempt } - time = { 24.h * task.attempt } - } } diff --git a/conf/modules.config b/conf/modules.config index 4bdc5796..77512956 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -91,6 +91,7 @@ process { withName: CUTADAPT_TAXONOMY { ext.args = { "--discard-untrimmed --minimum-length 1 -g ${meta.fw_primer}...${meta.rv_primer_revcomp}" } + ext.outformat = "fasta" publishDir = [ path: { "${params.outdir}/cutadapt" }, mode: params.publish_dir_mode, diff --git a/conf/ref_databases.config b/conf/ref_databases.config index df4692ee..eb03c0b1 100644 --- a/conf/ref_databases.config +++ b/conf/ref_databases.config @@ -159,19 +159,19 @@ params { dbversion = "RDP 18/11.5 (https://zenodo.org/records/4310151/)" } 'sbdi-gtdb' { - title = "SBDI-GTDB - Sativa curated 16S GTDB database - Release R10-RS226-1" - file = [ "https://figshare.scilifelab.se/ndownloader/files/54036401", "https://figshare.scilifelab.se/ndownloader/files/54036416" ] - citation = "Lundin D, Andersson A. SBDI Sativa curated 16S GTDB database. FigShare. doi: 10.17044/scilifelab.14869077.v9" + title = "SBDI-GTDB - Sativa curated 16S GTDB database - Release R10-RS226-2" + file = [ "https://figshare.scilifelab.se/ndownloader/files/59220347", "https://figshare.scilifelab.se/ndownloader/files/59220356" ] + citation = "Lundin D, Andersson A. SBDI Sativa curated 16S GTDB database. FigShare. doi: 10.17044/scilifelab.14869077.v10" fmtscript = "taxref_reformat_sbdi-gtdb.sh" - dbversion = "SBDI-GTDB-R10-RS226-1 (https://figshare.scilifelab.se/articles/dataset/SBDI_Sativa_curated_16S_GTDB_database/14869077/9)" + dbversion = "SBDI-GTDB-R10-RS226-2 (https://figshare.scilifelab.se/articles/dataset/SBDI_Sativa_curated_16S_GTDB_database/14869077/10)" taxlevels = "Domain,Kingdom,Phylum,Class,Order,Family,Genus,Species" } - 'sbdi-gtdb=R10-RS226-1' { - title = "SBDI-GTDB - Sativa curated 16S GTDB database - Release R10-RS226-1" - file = [ "https://figshare.scilifelab.se/ndownloader/files/54036401", "https://figshare.scilifelab.se/ndownloader/files/54036416" ] - citation = "Lundin D, Andersson A. SBDI Sativa curated 16S GTDB database. FigShare. doi: 10.17044/scilifelab.14869077.v9" + 'sbdi-gtdb=R10-RS226-2' { + title = "SBDI-GTDB - Sativa curated 16S GTDB database - Release R10-RS226-2" + file = [ "https://figshare.scilifelab.se/ndownloader/files/59220347", "https://figshare.scilifelab.se/ndownloader/files/59220356" ] + citation = "Lundin D, Andersson A. SBDI Sativa curated 16S GTDB database. FigShare. doi: 10.17044/scilifelab.14869077.v10" fmtscript = "taxref_reformat_sbdi-gtdb.sh" - dbversion = "SBDI-GTDB-R10-RS226-1 (https://figshare.scilifelab.se/articles/dataset/SBDI_Sativa_curated_16S_GTDB_database/14869077/9)" + dbversion = "SBDI-GTDB-R10-RS226-2 (https://figshare.scilifelab.se/articles/dataset/SBDI_Sativa_curated_16S_GTDB_database/14869077/10)" taxlevels = "Domain,Kingdom,Phylum,Class,Order,Family,Genus,Species" } 'sbdi-gtdb=R09-RS220-2' { diff --git a/docs/output.md b/docs/output.md index 391b7d87..6da68308 100644 --- a/docs/output.md +++ b/docs/output.md @@ -194,6 +194,7 @@ Optionally, ASV sequences can be filtered for rRNA sequences identified by Barrn - `barrnap/` - `rrna..gff`: GFF3 output for rRNA matches per kingdom, where kingdom is one of `bac,arc,mito,euk`. - `summary.tsv`: Summary of evalues for each ASV and kingdom + - `result.tsv`: Classification of ASVs into domains based on the lowest evalue, only if `--filter_ssu` is set. - `ASV_seqs.ssu.fasta`: Fasta file with filtered ASV sequences, only if `--filter_ssu` is set. - `ASV_table.ssu.tsv`: Counts for each filtered ASV sequence, only if `--filter_ssu` is set. - `stats.ssu.tsv`: Tracking read numbers through filtering, for each sample, only if `--filter_ssu` is set. diff --git a/docs/usage.md b/docs/usage.md index fd4362de..be3b0d2f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -369,7 +369,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 001bbc94..1dc5788e 100644 --- a/main.nf +++ b/main.nf @@ -57,7 +57,11 @@ workflow { params.validate_params, params.monochrome_logs, args, - params.outdir + params.outdir, + [], + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index 33cd186f..fe36fd75 100644 --- a/modules.json +++ b/modules.json @@ -7,8 +7,9 @@ "nf-core": { "cutadapt": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "git_sha": "624977dfaf562211e68a8a868ca80acc8461f1ac", + "installed_by": ["modules"], + "patch": "modules/nf-core/cutadapt/cutadapt.diff" }, "epang/place": { "branch": "master", @@ -22,7 +23,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", "installed_by": ["modules"] }, "gappa/examineassign": { @@ -62,7 +63,7 @@ }, "kraken2/kraken2": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "1a9dc0fd9f8f61099b3c912df1ab97fac72a1f86", "installed_by": ["modules"], "patch": "modules/nf-core/kraken2/kraken2/kraken2-kraken2.diff" }, @@ -73,33 +74,33 @@ }, "multiqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "9656d955b700a8707c4a67821ab056f8c1095675", "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", - "git_sha": "4ef7becf6a2bbc8df466885d10b4051d1f318a6a", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"], "patch": "modules/nf-core/pigz/uncompress/pigz-uncompress.diff" }, "untar": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", "installed_by": ["modules"] }, "vsearch/cluster": { "branch": "master", - "git_sha": "f10b2465108305544f708389324480db1b5e9f34", + "git_sha": "3bc4793d82c7bf7b10d29b1aa49a5ebe10c0cdd9", "installed_by": ["modules"] }, "vsearch/sintax": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "vsearch/usearchglobal": { "branch": "master", - "git_sha": "087a2003d9709be9cd580b432a799805777794be", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } @@ -113,17 +114,17 @@ }, "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/local/combine_table.nf b/modules/local/combine_table.nf index 724cb8dc..ebd53fb2 100644 --- a/modules/local/combine_table.nf +++ b/modules/local/combine_table.nf @@ -1,5 +1,5 @@ process COMBINE_TABLE { - label 'process_low' + label 'process_single' conda "bioconda::bioconductor-biostrings=2.58.0 conda-forge::r-base=4.0.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/cutadapt_summary.nf b/modules/local/cutadapt_summary.nf index 944a0492..ab6c4600 100644 --- a/modules/local/cutadapt_summary.nf +++ b/modules/local/cutadapt_summary.nf @@ -1,6 +1,6 @@ process CUTADAPT_SUMMARY { tag "${name}" - label 'process_low' + label 'process_single' conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/cutadapt_summary_merge.nf b/modules/local/cutadapt_summary_merge.nf index 7dbc1ad5..eb7a81b2 100644 --- a/modules/local/cutadapt_summary_merge.nf +++ b/modules/local/cutadapt_summary_merge.nf @@ -1,11 +1,11 @@ process CUTADAPT_SUMMARY_MERGE { tag "${files}" - label 'process_low' + label 'process_single' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: val(action) diff --git a/modules/local/dada2_addspecies.nf b/modules/local/dada2_addspecies.nf index c2e3d2ab..a89a0550 100644 --- a/modules/local/dada2_addspecies.nf +++ b/modules/local/dada2_addspecies.nf @@ -1,12 +1,13 @@ process DADA2_ADDSPECIES { tag "${taxtable},${database}" - label 'process_high' - label 'single_cpu' + label 'process_cpu_single' + label 'process_medium_memory' + label 'process_long' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: path(taxtable) diff --git a/modules/local/dada2_denoising.nf b/modules/local/dada2_denoising.nf index 52d583af..43f91263 100644 --- a/modules/local/dada2_denoising.nf +++ b/modules/local/dada2_denoising.nf @@ -1,12 +1,13 @@ process DADA2_DENOISING { tag "$meta.run" - label 'process_medium' + label 'process_high' label 'process_long' + label 'error_retry' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path("filtered/*"), path(errormodel) diff --git a/modules/local/dada2_err.nf b/modules/local/dada2_err.nf index 41796faf..37d21df6 100644 --- a/modules/local/dada2_err.nf +++ b/modules/local/dada2_err.nf @@ -2,10 +2,10 @@ process DADA2_ERR { tag "$meta.run" label 'process_medium' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(reads) diff --git a/modules/local/dada2_filtntrim.nf b/modules/local/dada2_filtntrim.nf index 38057245..385c35c1 100644 --- a/modules/local/dada2_filtntrim.nf +++ b/modules/local/dada2_filtntrim.nf @@ -1,11 +1,11 @@ process DADA2_FILTNTRIM { tag "$meta.id" - label 'process_medium' + label 'process_low' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(reads), val(trunclenf_in), val(trunclenr_in) diff --git a/modules/local/dada2_quality.nf b/modules/local/dada2_quality.nf index 65159c1c..f28145b1 100644 --- a/modules/local/dada2_quality.nf +++ b/modules/local/dada2_quality.nf @@ -2,10 +2,10 @@ process DADA2_QUALITY { tag "$meta" label 'process_low' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(reads) diff --git a/modules/local/dada2_rmchimera.nf b/modules/local/dada2_rmchimera.nf index f6ab56b7..0f2b57f6 100644 --- a/modules/local/dada2_rmchimera.nf +++ b/modules/local/dada2_rmchimera.nf @@ -2,10 +2,10 @@ process DADA2_RMCHIMERA { tag "$meta.run" label 'process_medium' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(seqtab) diff --git a/modules/local/dada2_stats.nf b/modules/local/dada2_stats.nf index c6a6d1d4..90b16b86 100644 --- a/modules/local/dada2_stats.nf +++ b/modules/local/dada2_stats.nf @@ -2,10 +2,10 @@ process DADA2_STATS { tag "$meta.run" label 'process_low' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path("filter_and_trim_files/*"), path(denoised), path(mergers), path(seqtab_nochim) diff --git a/modules/local/dada2_taxonomy.nf b/modules/local/dada2_taxonomy.nf index 11373cf3..017a06e2 100644 --- a/modules/local/dada2_taxonomy.nf +++ b/modules/local/dada2_taxonomy.nf @@ -2,10 +2,10 @@ process DADA2_TAXONOMY { tag "${fasta},${database}" label 'process_high' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: path(fasta) diff --git a/modules/local/filter_clusters.nf b/modules/local/filter_clusters.nf index f33d32e8..157608e1 100644 --- a/modules/local/filter_clusters.nf +++ b/modules/local/filter_clusters.nf @@ -1,6 +1,6 @@ process FILTER_CLUSTERS { tag "${meta.id}" - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/filter_codons.nf b/modules/local/filter_codons.nf index b141bd52..44cccb47 100644 --- a/modules/local/filter_codons.nf +++ b/modules/local/filter_codons.nf @@ -1,6 +1,6 @@ process FILTER_CODONS { tag "${fasta}" - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/filter_len.nf b/modules/local/filter_len.nf index c8f458f6..7af8017d 100644 --- a/modules/local/filter_len.nf +++ b/modules/local/filter_len.nf @@ -1,6 +1,6 @@ process FILTER_LEN { tag "${fasta}" - label 'process_low' + label 'process_single' conda "bioconda::bioconductor-biostrings=2.58.0 conda-forge::r-base=4.0.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/filter_ssu.nf b/modules/local/filter_ssu.nf index c8dfdb0f..2284d67e 100644 --- a/modules/local/filter_ssu.nf +++ b/modules/local/filter_ssu.nf @@ -1,6 +1,6 @@ process FILTER_SSU { tag "${fasta}" - label 'process_low' + label 'process_single' conda "bioconda::bioconductor-biostrings=2.58.0 conda-forge::r-base=4.0.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,6 +13,7 @@ process FILTER_SSU { path(barrnap_summary) output: + path( "result.tsv" ) , emit: result, optional: true path( "stats.ssu.tsv" ) , emit: stats, optional: true path( "ASV_table.ssu.tsv" ) , emit: asv, optional: true path( "ASV_seqs.ssu.fasta" ) , emit: fasta @@ -39,6 +40,7 @@ process FILTER_SSU { df[is.na(df)] <- 1 df\$result = colnames(df[,2:5])[apply(df[,2:5],1,which.min)] df\$result = gsub("_eval", "", df\$result) + write.table(df, file = "result.tsv", row.names=FALSE, sep="\t", col.names = TRUE, quote = FALSE, na = '') # filter ASVs df_filtered = subset(df, df\$result %in% kingdom) diff --git a/modules/local/filter_stats.nf b/modules/local/filter_stats.nf index f10fb94e..b387d3b8 100644 --- a/modules/local/filter_stats.nf +++ b/modules/local/filter_stats.nf @@ -1,5 +1,5 @@ process FILTER_STATS { - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_fastainput.nf b/modules/local/format_fastainput.nf index b221fa5e..f09946f7 100644 --- a/modules/local/format_fastainput.nf +++ b/modules/local/format_fastainput.nf @@ -1,5 +1,5 @@ process FORMAT_FASTAINPUT { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_pplacetax.nf b/modules/local/format_pplacetax.nf index fa297b48..633c684d 100644 --- a/modules/local/format_pplacetax.nf +++ b/modules/local/format_pplacetax.nf @@ -2,10 +2,10 @@ process FORMAT_PPLACETAX { tag "${tax.baseName}" label 'process_high' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(tax) diff --git a/modules/local/format_taxonomy.nf b/modules/local/format_taxonomy.nf index bd739d07..009bb570 100644 --- a/modules/local/format_taxonomy.nf +++ b/modules/local/format_taxonomy.nf @@ -1,5 +1,5 @@ process FORMAT_TAXONOMY { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxonomy_qiime.nf b/modules/local/format_taxonomy_qiime.nf index ed3a0a51..72117083 100644 --- a/modules/local/format_taxonomy_qiime.nf +++ b/modules/local/format_taxonomy_qiime.nf @@ -1,6 +1,6 @@ process FORMAT_TAXONOMY_QIIME { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxonomy_sidle.nf b/modules/local/format_taxonomy_sidle.nf index 1dc79c2e..5f4086c3 100644 --- a/modules/local/format_taxonomy_sidle.nf +++ b/modules/local/format_taxonomy_sidle.nf @@ -1,5 +1,5 @@ process FORMAT_TAXONOMY_SIDLE { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxonomy_sintax.nf b/modules/local/format_taxonomy_sintax.nf index bcf3f270..fead3e5f 100644 --- a/modules/local/format_taxonomy_sintax.nf +++ b/modules/local/format_taxonomy_sintax.nf @@ -1,5 +1,5 @@ process FORMAT_TAXONOMY_SINTAX { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxresults.nf b/modules/local/format_taxresults.nf index 1b40df8a..2f423748 100644 --- a/modules/local/format_taxresults.nf +++ b/modules/local/format_taxresults.nf @@ -1,5 +1,5 @@ process FORMAT_TAXRESULTS { - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxresults_kraken2.nf b/modules/local/format_taxresults_kraken2.nf index c020a2b4..11600046 100644 --- a/modules/local/format_taxresults_kraken2.nf +++ b/modules/local/format_taxresults_kraken2.nf @@ -1,5 +1,5 @@ process FORMAT_TAXRESULTS_KRAKEN2 { - label 'process_low' + label 'process_single' conda "conda-forge::r-base=4.2.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/format_taxresults_sintax.nf b/modules/local/format_taxresults_sintax.nf index dc4779e0..11ecee40 100644 --- a/modules/local/format_taxresults_sintax.nf +++ b/modules/local/format_taxresults_sintax.nf @@ -1,5 +1,5 @@ process FORMAT_TAXRESULTS_SINTAX { - label 'process_low' + label 'process_single' conda "conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/merge_stats.nf b/modules/local/merge_stats.nf index 32b1863e..b9cbddd2 100644 --- a/modules/local/merge_stats.nf +++ b/modules/local/merge_stats.nf @@ -1,10 +1,10 @@ process MERGE_STATS { - label 'process_low' + label 'process_single' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: path('file1.tsv') diff --git a/modules/local/metadata_all.nf b/modules/local/metadata_all.nf index de5a96d3..9770be66 100644 --- a/modules/local/metadata_all.nf +++ b/modules/local/metadata_all.nf @@ -1,11 +1,11 @@ process METADATA_ALL { tag "$metadata" - label 'process_low' + label 'process_single' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: path(metadata) diff --git a/modules/local/metadata_pairwise.nf b/modules/local/metadata_pairwise.nf index 9dfa789e..82b82adf 100644 --- a/modules/local/metadata_pairwise.nf +++ b/modules/local/metadata_pairwise.nf @@ -1,11 +1,11 @@ process METADATA_PAIRWISE { tag "$metadata" - label 'process_low' + label 'process_single' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: path(metadata) diff --git a/modules/local/novaseq_err.nf b/modules/local/novaseq_err.nf index 4dec15b0..ec94680f 100644 --- a/modules/local/novaseq_err.nf +++ b/modules/local/novaseq_err.nf @@ -2,10 +2,10 @@ process NOVASEQ_ERR { tag "$meta.run" label 'process_medium' - conda "bioconda::bioconductor-dada2=1.30.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-dada2=1.34.0 conda-forge::r-base=4.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.30.0--r43hf17093f_0' : - 'biocontainers/bioconductor-dada2:1.30.0--r43hf17093f_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-dada2:1.34.0--r44he5774e6_2' : + 'biocontainers/bioconductor-dada2:1.34.0--r44he5774e6_2' }" input: tuple val(meta), path(errormodel) diff --git a/modules/local/phyloseq.nf b/modules/local/phyloseq.nf index 1f37c466..11f283bc 100644 --- a/modules/local/phyloseq.nf +++ b/modules/local/phyloseq.nf @@ -2,10 +2,10 @@ process PHYLOSEQ { tag "$prefix" label 'process_low' - conda "bioconda::bioconductor-phyloseq=1.46.0 conda-forge::r-base=4.3.2" + conda "bioconda::bioconductor-phyloseq=1.50.0 conda-forge::r-base=4.4.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bioconductor-phyloseq:1.46.0--r43hdfd78af_0' : - 'biocontainers/bioconductor-phyloseq:1.46.0--r43hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/bioconductor-phyloseq:1.50.0--r44hdfd78af_0' : + 'biocontainers/bioconductor-phyloseq:1.50.0--r44hdfd78af_0' }" input: tuple val(prefix), path(tax_tsv), path(otu_tsv), path(sam_tsv), path(tree) diff --git a/modules/local/phyloseq_inasv.nf b/modules/local/phyloseq_inasv.nf index e4b42826..4372a604 100644 --- a/modules/local/phyloseq_inasv.nf +++ b/modules/local/phyloseq_inasv.nf @@ -1,5 +1,5 @@ process PHYLOSEQ_INASV { - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/phyloseq_intax.nf b/modules/local/phyloseq_intax.nf index 7552e904..c83ff464 100644 --- a/modules/local/phyloseq_intax.nf +++ b/modules/local/phyloseq_intax.nf @@ -1,5 +1,5 @@ process PHYLOSEQ_INTAX { - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/picrust.nf b/modules/local/picrust.nf index f001672d..1b81595b 100644 --- a/modules/local/picrust.nf +++ b/modules/local/picrust.nf @@ -1,11 +1,11 @@ process PICRUST { tag "${seq},${abund}" - label 'process_medium' + label 'process_high' - conda "bioconda::picrust2=2.5.3" + conda "bioconda::picrust2=2.6.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picrust2:2.5.3--pyhdfd78af_0' : - 'biocontainers/picrust2:2.5.3--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picrust2:2.6.3--pyhdfd78af_0' : + 'biocontainers/picrust2:2.6.3--pyhdfd78af_0' }" input: path(seq) diff --git a/modules/local/qiime2_ancom_asv.nf b/modules/local/qiime2_ancom_asv.nf index fc90a61f..95288a06 100644 --- a/modules/local/qiime2_ancom_asv.nf +++ b/modules/local/qiime2_ancom_asv.nf @@ -1,7 +1,7 @@ process QIIME2_ANCOM_ASV { tag "${table.baseName}" label 'process_medium' - label 'single_cpu' + label 'process_cpu_single' label 'process_long' label 'error_ignore' diff --git a/modules/local/qiime2_ancom_tax.nf b/modules/local/qiime2_ancom_tax.nf index 44f5156f..781479f9 100644 --- a/modules/local/qiime2_ancom_tax.nf +++ b/modules/local/qiime2_ancom_tax.nf @@ -1,7 +1,7 @@ process QIIME2_ANCOM_TAX { tag "${table.baseName}-taxonomic_level:${taxlevel}" label 'process_medium' - label 'single_cpu' + label 'process_cpu_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_ancombc_asv.nf b/modules/local/qiime2_ancombc_asv.nf index d896b411..c2d6efa6 100644 --- a/modules/local/qiime2_ancombc_asv.nf +++ b/modules/local/qiime2_ancombc_asv.nf @@ -1,7 +1,7 @@ process QIIME2_ANCOMBC_ASV { tag "${table.baseName}-${formula_in}" label 'process_medium' - label 'single_cpu' + label 'process_cpu_single' label 'process_long' label 'error_ignore' diff --git a/modules/local/qiime2_ancombc_tax.nf b/modules/local/qiime2_ancombc_tax.nf index adab4d2e..a309f172 100644 --- a/modules/local/qiime2_ancombc_tax.nf +++ b/modules/local/qiime2_ancombc_tax.nf @@ -1,7 +1,7 @@ process QIIME2_ANCOMBC_TAX { tag "${table.baseName}-${formula_in}-${taxlevel}" label 'process_medium' - label 'single_cpu' + label 'process_cpu_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_barplot.nf b/modules/local/qiime2_barplot.nf index 169658fd..38454693 100644 --- a/modules/local/qiime2_barplot.nf +++ b/modules/local/qiime2_barplot.nf @@ -1,5 +1,5 @@ process QIIME2_BARPLOT { - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_classify.nf b/modules/local/qiime2_classify.nf index 595e0ab7..a9062264 100644 --- a/modules/local/qiime2_classify.nf +++ b/modules/local/qiime2_classify.nf @@ -1,6 +1,6 @@ process QIIME2_CLASSIFY { tag "${repseq},${trained_classifier}" - label 'process_high' + label 'process_huge' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_diversity_betaord.nf b/modules/local/qiime2_diversity_betaord.nf index dd453018..a2d899ce 100644 --- a/modules/local/qiime2_diversity_betaord.nf +++ b/modules/local/qiime2_diversity_betaord.nf @@ -1,6 +1,6 @@ process QIIME2_DIVERSITY_BETAORD { tag "${core.baseName}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_diversity_core.nf b/modules/local/qiime2_diversity_core.nf index 8535fde0..d19d56c2 100644 --- a/modules/local/qiime2_diversity_core.nf +++ b/modules/local/qiime2_diversity_core.nf @@ -1,5 +1,5 @@ process QIIME2_DIVERSITY_CORE { - label 'process_low' + label 'process_medium' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_export_absolute.nf b/modules/local/qiime2_export_absolute.nf index 9bd22d84..d194ec9d 100644 --- a/modules/local/qiime2_export_absolute.nf +++ b/modules/local/qiime2_export_absolute.nf @@ -1,5 +1,5 @@ process QIIME2_EXPORT_ABSOLUTE { - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_export_relasv.nf b/modules/local/qiime2_export_relasv.nf index e3b72b2e..1402fbfb 100644 --- a/modules/local/qiime2_export_relasv.nf +++ b/modules/local/qiime2_export_relasv.nf @@ -1,5 +1,5 @@ process QIIME2_EXPORT_RELASV { - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_export_reltax.nf b/modules/local/qiime2_export_reltax.nf index 29dabd5c..95ead547 100644 --- a/modules/local/qiime2_export_reltax.nf +++ b/modules/local/qiime2_export_reltax.nf @@ -1,5 +1,5 @@ process QIIME2_EXPORT_RELTAX { - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_extract.nf b/modules/local/qiime2_extract.nf index 71278082..d51f1d32 100644 --- a/modules/local/qiime2_extract.nf +++ b/modules/local/qiime2_extract.nf @@ -1,5 +1,7 @@ process QIIME2_EXTRACT { tag "${meta.FW_primer}-${meta.RV_primer}" + label 'process_medium' + label 'process_long' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_featuretable_group.nf b/modules/local/qiime2_featuretable_group.nf index 2248dffe..c8d4765f 100644 --- a/modules/local/qiime2_featuretable_group.nf +++ b/modules/local/qiime2_featuretable_group.nf @@ -1,6 +1,6 @@ process QIIME2_FEATURETABLE_GROUP { tag "${category}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_filtersamples.nf b/modules/local/qiime2_filtersamples.nf index f30cd14a..853a1686 100644 --- a/modules/local/qiime2_filtersamples.nf +++ b/modules/local/qiime2_filtersamples.nf @@ -1,6 +1,6 @@ process QIIME2_FILTERSAMPLES { tag "${filter}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_inasv.nf b/modules/local/qiime2_inasv.nf index dd2d5281..0562d781 100644 --- a/modules/local/qiime2_inasv.nf +++ b/modules/local/qiime2_inasv.nf @@ -1,6 +1,6 @@ process QIIME2_INASV { tag "${asv}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_inseq.nf b/modules/local/qiime2_inseq.nf index 3736c3e4..9b38fc7a 100644 --- a/modules/local/qiime2_inseq.nf +++ b/modules/local/qiime2_inseq.nf @@ -1,6 +1,6 @@ process QIIME2_INSEQ { tag "${seq}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_intax.nf b/modules/local/qiime2_intax.nf index 378f6df9..09a6792c 100644 --- a/modules/local/qiime2_intax.nf +++ b/modules/local/qiime2_intax.nf @@ -1,6 +1,6 @@ process QIIME2_INTAX { tag "${tax}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_intree.nf b/modules/local/qiime2_intree.nf index 61614fa4..46e03e66 100644 --- a/modules/local/qiime2_intree.nf +++ b/modules/local/qiime2_intree.nf @@ -1,6 +1,6 @@ process QIIME2_INTREE { tag "${meta.id}:${meta.model}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_seqfiltertable.nf b/modules/local/qiime2_seqfiltertable.nf index 5d5d8f25..a8f5a1bf 100644 --- a/modules/local/qiime2_seqfiltertable.nf +++ b/modules/local/qiime2_seqfiltertable.nf @@ -1,6 +1,6 @@ process QIIME2_SEQFILTERTABLE { tag "${repseq}-filter-by-${table}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_tablefiltertaxa.nf b/modules/local/qiime2_tablefiltertaxa.nf index 91aec98e..762e764e 100644 --- a/modules/local/qiime2_tablefiltertaxa.nf +++ b/modules/local/qiime2_tablefiltertaxa.nf @@ -1,6 +1,6 @@ process QIIME2_TABLEFILTERTAXA { tag "taxa:${exclude_taxa};min-freq:${min_frequency};min-samples:${min_samples}" - label 'process_low' + label 'process_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/qiime2_train.nf b/modules/local/qiime2_train.nf index 586f3e80..3e33184f 100644 --- a/modules/local/qiime2_train.nf +++ b/modules/local/qiime2_train.nf @@ -1,7 +1,7 @@ process QIIME2_TRAIN { tag "${meta.FW_primer}-${meta.RV_primer}" - label 'process_high' - label 'single_cpu' + label 'process_huge' + label 'process_cpu_single' conda "${projectDir}/modules/local/envs/qiime2-amplicon-2024.10-py310-linux-conda.yml" container "qiime2/amplicon:2024.10" diff --git a/modules/local/rename_raw_data_files.nf b/modules/local/rename_raw_data_files.nf index 088c33d3..aadb1f62 100644 --- a/modules/local/rename_raw_data_files.nf +++ b/modules/local/rename_raw_data_files.nf @@ -1,6 +1,6 @@ process RENAME_RAW_DATA_FILES { tag "$meta.id" - label 'process_low' + label 'process_single' conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/sidle_seqrecon.nf b/modules/local/sidle_seqrecon.nf index 57a6eef4..ea06e621 100644 --- a/modules/local/sidle_seqrecon.nf +++ b/modules/local/sidle_seqrecon.nf @@ -1,6 +1,6 @@ process SIDLE_SEQRECON { label 'process_medium' - label 'single_cpu' + label 'process_cpu_single' conda "${projectDir}/modules/local/envs/pipesidle-0-1-0-beta.yml" container 'nf-core/pipesidle:0.1.0-beta' diff --git a/modules/local/trunclen.nf b/modules/local/trunclen.nf index 60661802..ed693d14 100644 --- a/modules/local/trunclen.nf +++ b/modules/local/trunclen.nf @@ -1,6 +1,6 @@ process TRUNCLEN { tag "$meta" - label 'process_low' + label 'process_single' conda "conda-forge::pandas=1.1.5 conda-forge::python=3.9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/cutadapt/cutadapt.diff b/modules/nf-core/cutadapt/cutadapt.diff new file mode 100644 index 00000000..6f34e475 --- /dev/null +++ b/modules/nf-core/cutadapt/cutadapt.diff @@ -0,0 +1,30 @@ +Changes in component 'nf-core/cutadapt' +'modules/nf-core/cutadapt/meta.yml' is unchanged +Changes in 'cutadapt/main.nf': +--- modules/nf-core/cutadapt/main.nf ++++ modules/nf-core/cutadapt/main.nf +@@ -11,7 +11,7 @@ + tuple val(meta), path(reads) + + output: +- tuple val(meta), path('*.trim.fastq.gz'), emit: reads ++ tuple val(meta), path("*.trim.${outformat}.gz"), emit: reads + tuple val(meta), path('*.log') , emit: log + tuple val("${task.process}"), val("cutadapt"), eval('cutadapt --version'), topic: versions, emit: versions_cutadapt + +@@ -21,7 +21,8 @@ + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" +- def trimmed = meta.single_end ? "-o ${prefix}.trim.fastq.gz" : "-o ${prefix}_1.trim.fastq.gz -p ${prefix}_2.trim.fastq.gz" ++ outformat = task.ext.outformat ?: "fastq" ++ def trimmed = meta.single_end ? "-o ${prefix}.trim.${outformat}.gz" : "-o ${prefix}_1.trim.${outformat}.gz -p ${prefix}_2.trim.${outformat}.gz" + """ + cutadapt \\ + --cores $task.cpus \\ + +'modules/nf-core/cutadapt/environment.yml' is unchanged +'modules/nf-core/cutadapt/tests/main.nf.test' is unchanged +'modules/nf-core/cutadapt/tests/main.nf.test.snap' is unchanged +'modules/nf-core/cutadapt/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/cutadapt/environment.yml b/modules/nf-core/cutadapt/environment.yml index dfdbd1c2..cf84fbfa 100644 --- a/modules/nf-core/cutadapt/environment.yml +++ b/modules/nf-core/cutadapt/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::cutadapt=4.6 + - bioconda::cutadapt=5.2 diff --git a/modules/nf-core/cutadapt/main.nf b/modules/nf-core/cutadapt/main.nf index 3d3e5716..5699a675 100644 --- a/modules/nf-core/cutadapt/main.nf +++ b/modules/nf-core/cutadapt/main.nf @@ -3,17 +3,17 @@ process CUTADAPT { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cutadapt:4.6--py39hf95cd2a_1' : - 'biocontainers/cutadapt:4.6--py39hf95cd2a_1' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cutadapt:5.2--py311haab0aaa_0' : + 'biocontainers/cutadapt:5.2--py311haab0aaa_0'}" input: tuple val(meta), path(reads) output: - tuple val(meta), path('*.trim.fastq.gz'), emit: reads + tuple val(meta), path("*.trim.${outformat}.gz"), emit: reads tuple val(meta), path('*.log') , emit: log - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("cutadapt"), eval('cutadapt --version'), topic: versions, emit: versions_cutadapt when: task.ext.when == null || task.ext.when @@ -21,31 +21,28 @@ process CUTADAPT { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def trimmed = meta.single_end ? "-o ${prefix}.trim.fastq.gz" : "-o ${prefix}_1.trim.fastq.gz -p ${prefix}_2.trim.fastq.gz" + outformat = task.ext.outformat ?: "fastq" + def trimmed = meta.single_end ? "-o ${prefix}.trim.${outformat}.gz" : "-o ${prefix}_1.trim.${outformat}.gz -p ${prefix}_2.trim.${outformat}.gz" """ cutadapt \\ - -Z \\ --cores $task.cpus \\ $args \\ $trimmed \\ $reads \\ > ${prefix}.cutadapt.log - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cutadapt: \$(cutadapt --version) - END_VERSIONS """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" - def trimmed = meta.single_end ? "${prefix}.trim.fastq.gz" : "${prefix}_1.trim.fastq.gz ${prefix}_2.trim.fastq.gz" + def prefix = task.ext.prefix ?: "${meta.id}" + if (meta.single_end) { + output_command = "echo '' | gzip > ${prefix}.trim.fastq.gz ;" + } + else { + output_command = "echo '' | gzip > ${prefix}_1.trim.fastq.gz ;" + output_command += "echo '' | gzip > ${prefix}_2.trim.fastq.gz ;" + } """ + ${output_command} touch ${prefix}.cutadapt.log - touch ${trimmed} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cutadapt: \$(cutadapt --version) - END_VERSIONS """ } diff --git a/modules/nf-core/cutadapt/meta.yml b/modules/nf-core/cutadapt/meta.yml index 8844d86c..a4717b56 100644 --- a/modules/nf-core/cutadapt/meta.yml +++ b/modules/nf-core/cutadapt/meta.yml @@ -1,18 +1,22 @@ name: cutadapt -description: Perform adapter/quality trimming on sequencing reads +description: Removes adapter sequences from sequencing reads keywords: + - adapter + - primers + - poly-A tails - trimming - - adapter trimming - - adapters - - quality trimming + - fastq tools: - - cuatadapt: + - cutadapt: description: | - Cutadapt finds and removes adapter sequences, primers, poly-A tails and other types of unwanted sequence from your high-throughput sequencing reads. - documentation: https://cutadapt.readthedocs.io/en/stable/index.html + Cutadapt finds and removes adapter sequences, primers, poly-A tails + and other types of unwanted sequence from your high-throughput sequencing reads. + homepage: https://cutadapt.readthedocs.io/en/stable/index.html + documentation: https://github.com/marcelm/cutadapt doi: 10.14806/ej.17.1.200 licence: ["MIT"] identifier: biotools:cutadapt + input: - - meta: type: map @@ -24,9 +28,12 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + pattern: "*.{fq,fastq,fq.gz,fastq.gz}" + ontologies: + - edam: "http://edamontology.org/format_1930" # FASTQ output: - - reads: - - meta: + reads: + - - meta: type: map description: | Groovy Map containing sample information @@ -35,24 +42,48 @@ output: type: file description: The trimmed/modified fastq reads pattern: "*fastq.gz" - - log: - - meta: + ontologies: + - edam: "http://edamontology.org/format_1930" # FASTQ + - edam: http://edamontology.org/format_3989 # GZIP format + log: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.log": type: file - description: cuatadapt log file + description: cutadapt log file pattern: "*cutadapt.log" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: "http://edamontology.org/format_2330" # Textual format + versions_cutadapt: + - - ${task.process}: + type: string + description: The name of the process + - cutadapt: + type: string + description: The name of the tool + - cutadapt --version: + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cutadapt: + type: string + description: The name of the tool + - cutadapt --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@kevinmenden" maintainers: - "@drpatelh" - "@kevinmenden" + - "@vagkaratzas" diff --git a/modules/nf-core/cutadapt/tests/main.nf.test b/modules/nf-core/cutadapt/tests/main.nf.test index 36927bd7..0e3f7fef 100644 --- a/modules/nf-core/cutadapt/tests/main.nf.test +++ b/modules/nf-core/cutadapt/tests/main.nf.test @@ -3,16 +3,14 @@ nextflow_process { name "Test Process CUTADAPT" script "../main.nf" process "CUTADAPT" + tag "modules" tag "modules_nfcore" tag "cutadapt" - test("sarscov2 Illumina single end [fastq]") { + test("sarscov2 - fastq - single-end") { when { - params { - outdir = "$outputDir" - } process { """ input[0] = [ @@ -28,20 +26,18 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert process.out.reads != null }, - { assert process.out.reads.get(0).get(1) ==~ ".*.trim.fastq.gz" }, - { assert snapshot(process.out.versions).match("versions_single_end") }, - { assert snapshot(path(process.out.reads.get(0).get(1)).linesGzip[0]).match() } + { assert snapshot( + process.out.reads, + file(process.out.log[0][1]).readLines()[1..10], // python versions differ in the default conda env and container + process.out.findAll { key, val -> key.startsWith("versions")} + ).match() } ) } } - test("sarscov2 Illumina paired-end [fastq]") { + test("sarscov2 - fastq - paired-end") { when { - params { - outdir = "$outputDir" - } process { """ input[0] = [ @@ -58,11 +54,39 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert process.out.reads != null }, - { assert process.out.reads.get(0).get(1).get(0) ==~ ".*.1.trim.fastq.gz" }, - { assert process.out.reads.get(0).get(1).get(1) ==~ ".*.2.trim.fastq.gz" }, - { assert snapshot(path(process.out.reads.get(0).get(1).get(1)).linesGzip[0]).match() }, - { assert snapshot(process.out.versions).match("versions_paired_end") } + { assert snapshot( + process.out.reads, + file(process.out.log[0][1]).readLines()[1..14], // python versions differ in the default conda env and container + process.out.findAll { key, val -> key.startsWith("versions")} + ).match() } + ) + } + } + + test("sarscov2 - fastq - single-end - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test', single_end:true ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll ( + { assert snapshot( + process.out.reads, + process.out.log, + process.out.findAll { key, val -> key.startsWith("versions")} + ).match() } ) } } diff --git a/modules/nf-core/cutadapt/tests/main.nf.test.snap b/modules/nf-core/cutadapt/tests/main.nf.test.snap index 3df7389e..baf5c4a2 100644 --- a/modules/nf-core/cutadapt/tests/main.nf.test.snap +++ b/modules/nf-core/cutadapt/tests/main.nf.test.snap @@ -1,46 +1,123 @@ { - "sarscov2 Illumina single end [fastq]": { + "sarscov2 - fastq - single-end - stub": { "content": [ - "@ERR5069949.2151832 NS500628:121:HK3MMAFX2:2:21208:10793:15304/1" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-06T10:27:15.235936866" - }, - "sarscov2 Illumina paired-end [fastq]": { - "content": [ - "@ERR5069949.2151832 NS500628:121:HK3MMAFX2:2:21208:10793:15304/2" + [ + [ + { + "id": "test", + "single_end": true + }, + "test.trim.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.cutadapt.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + { + "versions_cutadapt": [ + [ + "CUTADAPT", + "cutadapt", + "5.2" + ] + ] + } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-03-06T10:27:24.38468252" + "timestamp": "2025-12-11T12:48:07.964157954" }, - "versions_paired_end": { + "sarscov2 - fastq - paired-end": { "content": [ [ - "versions.yml:md5,bc9892c68bfa7084ec5dbffbb9e8322f" - ] + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.trim.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec", + "test_2.trim.fastq.gz:md5,2ebae722295ea66d84075a3b042e2b42" + ] + ] + ], + [ + "Command line parameters: --cores 2 -o test_1.trim.fastq.gz -p test_2.trim.fastq.gz test_1.fastq.gz test_2.fastq.gz", + "Processing paired-end reads on 2 cores ...", + "", + "=== Summary ===", + "", + "Total read pairs processed: 100", + "Pairs written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 27,645 bp", + " Read 1: 13,897 bp", + " Read 2: 13,748 bp", + "Total written (filtered): 27,645 bp (100.0%)", + " Read 1: 13,897 bp", + " Read 2: 13,748 bp" + ], + { + "versions_cutadapt": [ + [ + "CUTADAPT", + "cutadapt", + "5.2" + ] + ] + } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-03-06T10:27:24.38799189" + "timestamp": "2025-12-11T14:12:08.287985982" }, - "versions_single_end": { + "sarscov2 - fastq - single-end": { "content": [ [ - "versions.yml:md5,bc9892c68bfa7084ec5dbffbb9e8322f" - ] + [ + { + "id": "test", + "single_end": true + }, + "test.trim.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + [ + "Command line parameters: --cores 2 -o test.trim.fastq.gz test_1.fastq.gz", + "Processing single-end reads on 2 cores ...", + "", + "=== Summary ===", + "", + "Total reads processed: 100", + "Reads written (passing filters): 100 (100.0%)", + "", + "Total basepairs processed: 13,897 bp", + "Total written (filtered): 13,897 bp (100.0%)" + ], + { + "versions_cutadapt": [ + [ + "CUTADAPT", + "cutadapt", + "5.2" + ] + ] + } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-03-06T10:27:15.219246449" + "timestamp": "2025-12-11T14:06:44.706447277" } } \ No newline at end of file diff --git a/modules/nf-core/cutadapt/tests/tags.yml b/modules/nf-core/cutadapt/tests/tags.yml deleted file mode 100644 index f64f9975..00000000 --- a/modules/nf-core/cutadapt/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cutadapt: - - modules/nf-core/cutadapt/** diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e16634..4b3041dc 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -11,9 +11,9 @@ process FASTQC { tuple val(meta), path(reads) output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta) , path("*.html") , emit: html + tuple val(meta) , path("*.zip") , emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when @@ -43,11 +43,6 @@ process FASTQC { --threads ${task.cpus} \\ --memory ${fastqc_memory} \\ ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ stub: @@ -55,10 +50,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d025..3e812b30 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -53,13 +53,29 @@ output: description: FastQC report archive pattern: "*_{fastqc.zip}" ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index e9d79a07..66c44da9 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -30,7 +30,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -58,7 +58,7 @@ nextflow_process { { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -82,7 +82,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -106,7 +106,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -142,7 +142,7 @@ nextflow_process { { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -166,7 +166,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index d5db3092..c8ee120f 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,15 +1,21 @@ { "sarscov2 custom_prefix": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:16.374038" + "timestamp": "2025-10-28T16:39:14.518503" }, "sarscov2 single-end [fastq] - stub": { "content": [ @@ -33,7 +39,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -44,8 +54,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -59,10 +73,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:24.993809" + "timestamp": "2025-10-28T16:39:19.309008" }, "sarscov2 custom_prefix - stub": { "content": [ @@ -86,7 +100,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -97,8 +115,12 @@ "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -112,58 +134,82 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:10.93942" + "timestamp": "2025-10-28T16:39:44.94888" }, "sarscov2 interleaved [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:42.355718" + "timestamp": "2025-10-28T16:38:45.168496" }, "sarscov2 paired-end [bam]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:53.276274" + "timestamp": "2025-10-28T16:38:53.268919" }, "sarscov2 multiple [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:05.527626" + "timestamp": "2025-10-28T16:39:05.050305" }, "sarscov2 paired-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:31.188871" + "timestamp": "2025-10-28T16:38:37.2373" }, "sarscov2 paired-end [fastq] - stub": { "content": [ @@ -187,7 +233,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -198,8 +248,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -213,10 +267,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:34.273566" + "timestamp": "2025-10-28T16:39:24.450398" }, "sarscov2 multiple [fastq] - stub": { "content": [ @@ -240,7 +294,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -251,8 +309,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -266,22 +328,28 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:02.304411" + "timestamp": "2025-10-28T16:39:39.758762" }, "sarscov2 single-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:19.095607" + "timestamp": "2025-10-28T16:38:29.555068" }, "sarscov2 interleaved [fastq] - stub": { "content": [ @@ -305,7 +373,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -316,8 +388,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -331,10 +407,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:44.640184" + "timestamp": "2025-10-28T16:39:29.193136" }, "sarscov2 paired-end [bam] - stub": { "content": [ @@ -358,7 +434,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -369,8 +449,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -384,9 +468,9 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:53.550742" + "timestamp": "2025-10-28T16:39:34.144919" } } \ No newline at end of file diff --git a/modules/nf-core/kraken2/kraken2/environment.yml b/modules/nf-core/kraken2/kraken2/environment.yml index ba776d31..aca72ddb 100644 --- a/modules/nf-core/kraken2/kraken2/environment.yml +++ b/modules/nf-core/kraken2/kraken2/environment.yml @@ -1,7 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - "bioconda::kraken2=2.1.3" - - "coreutils=9.4" - - "pigz=2.8" + - bioconda::kraken2=2.1.6 + - coreutils=9.5 + - pigz=2.8 diff --git a/modules/nf-core/kraken2/kraken2/kraken2-kraken2.diff b/modules/nf-core/kraken2/kraken2/kraken2-kraken2.diff index c6c57ad4..51f421c4 100644 --- a/modules/nf-core/kraken2/kraken2/kraken2-kraken2.diff +++ b/modules/nf-core/kraken2/kraken2/kraken2-kraken2.diff @@ -1,4 +1,4 @@ -Changes in module 'nf-core/kraken2/kraken2' +Changes in component 'nf-core/kraken2/kraken2' 'modules/nf-core/kraken2/kraken2/meta.yml' is unchanged Changes in 'kraken2/kraken2/main.nf': --- modules/nf-core/kraken2/kraken2/main.nf @@ -15,5 +15,4 @@ Changes in 'kraken2/kraken2/main.nf': 'modules/nf-core/kraken2/kraken2/environment.yml' is unchanged 'modules/nf-core/kraken2/kraken2/tests/main.nf.test' is unchanged 'modules/nf-core/kraken2/kraken2/tests/main.nf.test.snap' is unchanged -'modules/nf-core/kraken2/kraken2/tests/tags.yml' is unchanged ************************************************************ diff --git a/modules/nf-core/kraken2/kraken2/main.nf b/modules/nf-core/kraken2/kraken2/main.nf index 6978e3dc..54285f2d 100644 --- a/modules/nf-core/kraken2/kraken2/main.nf +++ b/modules/nf-core/kraken2/kraken2/main.nf @@ -4,8 +4,8 @@ process KRAKEN2_KRAKEN2 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-8706a1dd73c6cc426e12dd4dd33a5e917b3989ae:c8cbdc8ff4101e6745f8ede6eb5261ef98bdaff4-0' : - 'biocontainers/mulled-v2-8706a1dd73c6cc426e12dd4dd33a5e917b3989ae:c8cbdc8ff4101e6745f8ede6eb5261ef98bdaff4-0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0f/0f827dcea51be6b5c32255167caa2dfb65607caecdc8b067abd6b71c267e2e82/data' : + 'community.wave.seqera.io/library/kraken2_coreutils_pigz:920ecc6b96e2ba71' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/kraken2/kraken2/meta.yml b/modules/nf-core/kraken2/kraken2/meta.yml index 86937646..a6a09061 100644 --- a/modules/nf-core/kraken2/kraken2/meta.yml +++ b/modules/nf-core/kraken2/kraken2/meta.yml @@ -25,22 +25,23 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. - - - db: - type: directory - description: Kraken2 database - - - save_output_fastqs: - type: string - description: | - If true, optional commands are added to save classified and unclassified reads - as fastq files - - - save_reads_assignment: - type: string - description: | - If true, an optional command is added to save a file reporting the taxonomic - classification of each input read + ontologies: [] + - db: + type: directory + description: Kraken2 database + - save_output_fastqs: + type: string + description: | + If true, optional commands are added to save classified and unclassified reads + as fastq files + - save_reads_assignment: + type: string + description: | + If true, an optional command is added to save a file reporting the taxonomic + classification of each input read output: - - classified_reads_fastq: - - meta: + classified_reads_fastq: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +52,9 @@ output: Reads classified as belonging to any of the taxa on the Kraken2 database. pattern: "*{fastq.gz}" - - unclassified_reads_fastq: - - meta: + ontologies: [] + unclassified_reads_fastq: + - - meta: type: map description: | Groovy Map containing sample information @@ -63,8 +65,9 @@ output: Reads not classified to any of the taxa on the Kraken2 database. pattern: "*{fastq.gz}" - - classified_reads_assignment: - - meta: + ontologies: [] + classified_reads_assignment: + - - meta: type: map description: | Groovy Map containing sample information @@ -74,8 +77,9 @@ output: description: | Kraken2 output file indicating the taxonomic assignment of each input read - - report: - - meta: + ontologies: [] + report: + - - meta: type: map description: | Groovy Map containing sample information @@ -84,13 +88,16 @@ output: type: file description: | Kraken2 report containing stats about classified - and not classifed reads. + and not classified reads. pattern: "*.{report.txt}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/kraken2/kraken2/tests/main.nf.test b/modules/nf-core/kraken2/kraken2/tests/main.nf.test index c0843df2..40f471e6 100644 --- a/modules/nf-core/kraken2/kraken2/tests/main.nf.test +++ b/modules/nf-core/kraken2/kraken2/tests/main.nf.test @@ -133,10 +133,80 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.report, + process.out.versions, process.out.classified_reads_assignment, + ).match() + }, + ) + } + } + + test("single_end - stub") { + + tag "stub" + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + [ file("dummy1", checkIfExists: false)] + ] + input[1] = file("dummy2", checkIfExists: false) + input[2] = true + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.report, + process.out.versions, + ).match() + }, + { assert process.out.classified_reads_fastq.get(0).get(1) ==~ ".*/test.classified.fastq.gz" }, + { assert process.out.unclassified_reads_fastq.get(0).get(1) ==~ ".*/test.unclassified.fastq.gz" }, + ) + } + } + + test("paired_end - stub") { + + tag "stub" + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ file("dummy1", checkIfExists: false)] + ] + input[1] = file("dummy2", checkIfExists: false) + input[2] = true + input[3] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.report, process.out.versions, ).match() }, + { assert process.out.classified_reads_fastq.get(0).get(1).get(0) + ==~ ".*/test.classified_1.fastq.gz" }, + { assert process.out.classified_reads_fastq.get(0).get(1).get(1) + ==~ ".*/test.classified_2.fastq.gz" }, + { assert process.out.unclassified_reads_fastq.get(0).get(1).get(0) + ==~ ".*/test.unclassified_1.fastq.gz" }, + { assert process.out.unclassified_reads_fastq.get(0).get(1).get(1) + ==~ ".*/test.unclassified_2.fastq.gz" }, ) } } diff --git a/modules/nf-core/kraken2/kraken2/tests/main.nf.test.snap b/modules/nf-core/kraken2/kraken2/tests/main.nf.test.snap index b432f878..defe4e24 100644 --- a/modules/nf-core/kraken2/kraken2/tests/main.nf.test.snap +++ b/modules/nf-core/kraken2/kraken2/tests/main.nf.test.snap @@ -9,16 +9,61 @@ }, "test.kraken2.report.txt:md5,4227755fe40478b8d7dc8634b489761e" ] + ], + [ + "versions.yml:md5,3f1efbca96594bcbd7759bd992f3ffda" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2025-10-29T10:39:33.16840511" + }, + "paired_end - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.kraken2.report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + "versions.yml:md5,3f1efbca96594bcbd7759bd992f3ffda" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2025-10-29T10:57:46.285333986" + }, + "sarscov2 custom_prefix - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.kraken2.report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + ], [ "versions.yml:md5,79adf2ca1cfc625cb77e391b27142c43" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2024-04-04T18:47:03.745692" + "timestamp": "2025-10-16T13:56:24.287200136" }, "sarscov2 illumina paired end [fastq]": { "content": [ @@ -32,14 +77,14 @@ ] ], [ - "versions.yml:md5,79adf2ca1cfc625cb77e391b27142c43" + "versions.yml:md5,3f1efbca96594bcbd7759bd992f3ffda" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-04-04T18:47:13.75649" + "timestamp": "2025-09-26T10:40:12.99538483" }, "sarscov2 illumina single end [fastq] + save_reads_assignment": { "content": [ @@ -52,6 +97,9 @@ "test.kraken2.report.txt:md5,4227755fe40478b8d7dc8634b489761e" ] ], + [ + "versions.yml:md5,3f1efbca96594bcbd7759bd992f3ffda" + ], [ [ { @@ -60,15 +108,33 @@ }, "test.kraken2.classifiedreads.txt:md5,e7a90531f0d8d777316515c36fe4cae0" ] + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-11-04T16:53:38.496195464" + }, + "single_end - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.kraken2.report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], [ - "versions.yml:md5,79adf2ca1cfc625cb77e391b27142c43" + "versions.yml:md5,3f1efbca96594bcbd7759bd992f3ffda" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2024-04-04T18:47:22.459465" + "timestamp": "2025-10-29T10:44:44.698158761" } } \ No newline at end of file diff --git a/modules/nf-core/kraken2/kraken2/tests/tags.yml b/modules/nf-core/kraken2/kraken2/tests/tags.yml deleted file mode 100644 index 9ebfd7ab..00000000 --- a/modules/nf-core/kraken2/kraken2/tests/tags.yml +++ /dev/null @@ -1,3 +0,0 @@ -kraken2/kraken2: - - modules/nf-core/kraken2/kraken2/** - - modules/nf-core/untar/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 812fc4c5..009874d4 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.29 + - bioconda::multiqc=1.33 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 0ac3c369..3b0e975b 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,11 +3,11 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : - 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : + 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" input: - path multiqc_files, stageAs: "?/*" + path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) @@ -15,10 +15,11 @@ process MULTIQC { path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + path "*.html" , emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever when: task.ext.when == null || task.ext.when @@ -26,38 +27,29 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def config = multiqc_config ? "--config ${multiqc_config}" : '' + def extra_config = extra_multiqc_config ? "--config ${extra_multiqc_config}" : '' def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${extra_config} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb73..e4b8f94d 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -57,10 +57,10 @@ input: - edam: http://edamontology.org/format_3475 # TSV output: report: - - "*multiqc_report.html": + - "*.html": type: file description: MultiQC report file - pattern: "multiqc_report.html" + pattern: ".html" ontologies: [] data: - "*_data": @@ -74,12 +74,16 @@ output: pattern: "*_data" ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool + authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 00000000..b30b1358 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7d..d1ae8b06 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -30,7 +30,33 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + ) + } + + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, + { assert process.out.data[0] ==~ ".*/custom_prefix_data" } ) } @@ -56,7 +82,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } } @@ -84,7 +110,7 @@ nextflow_process { { assert snapshot(process.out.report.collect { file(it).getName() } + process.out.data.collect { file(it).getName() } + process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + process.out.findAll { key, val -> key.startsWith("versions")} ).match() } ) } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 88e90571..d72d35b7 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,61 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-05-22T11:50:41.182332996" + "timestamp": "2025-12-09T10:10:43.020315838" }, - "multiqc_stub": { + "sarscov2 single-end [fastqc] - stub": { "content": [ [ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-05-22T11:51:22.448739369" + "timestamp": "2025-12-09T10:11:14.131950776" }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] [config]": { "content": [ - [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-05-22T11:51:06.198928424" + "timestamp": "2025-12-09T10:11:07.15692209" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/modules/nf-core/pigz/uncompress/main.nf b/modules/nf-core/pigz/uncompress/main.nf index d82cfe1d..db712811 100644 --- a/modules/nf-core/pigz/uncompress/main.nf +++ b/modules/nf-core/pigz/uncompress/main.nf @@ -1,4 +1,5 @@ process PIGZ_UNCOMPRESS { + tag "$meta.id" label 'process_low' //stageInMode 'copy' // this directive can be set in case the original input should be kept @@ -8,11 +9,11 @@ process PIGZ_UNCOMPRESS { 'biocontainers/pigz:2.8' }" input: - path zip + tuple val(meta), path(zip) output: - path "${uncompressed_filename}" , emit: file - path "versions.yml" , emit: versions + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -30,7 +31,7 @@ process PIGZ_UNCOMPRESS { cat <<-END_VERSIONS > versions.yml "${task.process}": - pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) END_VERSIONS """ @@ -38,11 +39,11 @@ process PIGZ_UNCOMPRESS { def args = task.ext.args ?: '' uncompressed_filename = zip.toString() - '.gz' """ - touch ${zip.dropRight(3)} + touch $uncompressed_filename cat <<-END_VERSIONS > versions.yml "${task.process}": - pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) END_VERSIONS """ } diff --git a/modules/nf-core/pigz/uncompress/meta.yml b/modules/nf-core/pigz/uncompress/meta.yml index 574a004b..cddd0a3b 100644 --- a/modules/nf-core/pigz/uncompress/meta.yml +++ b/modules/nf-core/pigz/uncompress/meta.yml @@ -1,4 +1,3 @@ ---- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: "pigz_uncompress" description: write your description here @@ -12,21 +11,37 @@ tools: homepage: "https://zlib.net/pigz/" documentation: "https://zlib.net/pigz/pigz.pdf" + identifier: "" input: - - zip: - type: file - description: Gzipped file - pattern: "*.{gzip}" - + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - zip: + type: file + description: Gzipped file + pattern: "*.{gzip}" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format output: - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - file: - type: file - description: File to compress - pattern: "*" - + file: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - ${uncompressed_filename}: + type: file + description: File to compress + pattern: "*" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@lrauschning" diff --git a/modules/nf-core/pigz/uncompress/pigz-uncompress.diff b/modules/nf-core/pigz/uncompress/pigz-uncompress.diff deleted file mode 100644 index 6736fca9..00000000 --- a/modules/nf-core/pigz/uncompress/pigz-uncompress.diff +++ /dev/null @@ -1,14 +0,0 @@ -Changes in module 'nf-core/pigz/uncompress' ---- modules/nf-core/pigz/uncompress/main.nf -+++ modules/nf-core/pigz/uncompress/main.nf -@@ -42,7 +42,7 @@ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -- pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\w*//' )) -+ pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) - END_VERSIONS - """ - } - -************************************************************ diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test b/modules/nf-core/pigz/uncompress/tests/main.nf.test index 57955658..09eabe30 100644 --- a/modules/nf-core/pigz/uncompress/tests/main.nf.test +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test @@ -16,8 +16,8 @@ nextflow_process { } process { """ - input[0] = [ - file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] """ } @@ -30,4 +30,29 @@ nextflow_process { } + test("Should run without failures - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + } diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap index 038cf2d7..384a574f 100644 --- a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap @@ -1,21 +1,68 @@ { + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ], + "file": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T11:24:38.144787334" + }, "Should run without failures": { "content": [ { "0": [ - "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] ], "1": [ - "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" ], "file": [ - "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] ], "versions": [ - "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" ] } ], - "timestamp": "2023-10-18T12:37:21.987858" + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T11:23:17.620127425" } } \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/tags.yml b/modules/nf-core/pigz/uncompress/tests/tags.yml deleted file mode 100644 index 6719a90a..00000000 --- a/modules/nf-core/pigz/uncompress/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -pigz/uncompress: - - modules/nf-core/pigz/uncompress/** diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index 1b6bf491..1603e382 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -1,5 +1,5 @@ name: untar -description: Extract files. +description: Extract files from tar, tar.gz, tar.bz2, tar.xz archives keywords: - untar - uncompress @@ -7,7 +7,7 @@ keywords: tools: - untar: description: | - Extract tar.gz files. + Extract tar, tar.gz, tar.bz2, tar.xz files. documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] identifier: "" @@ -19,8 +19,8 @@ input: e.g. [ id:'test', single_end:false ] - archive: type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + description: File to be untarred + pattern: "*.{tar,tar.gz,tar.bz2,tar.xz}" ontologies: - edam: http://edamontology.org/format_3981 # TAR format - edam: http://edamontology.org/format_3989 # GZIP format diff --git a/modules/nf-core/vsearch/cluster/main.nf b/modules/nf-core/vsearch/cluster/main.nf index 7fe92eaf..472aa247 100644 --- a/modules/nf-core/vsearch/cluster/main.nf +++ b/modules/nf-core/vsearch/cluster/main.nf @@ -73,4 +73,39 @@ process VSEARCH_CLUSTER { vsearch: \$(vsearch --version 2>&1 | head -n 1 | sed 's/vsearch //g' | sed 's/,.*//g' | sed 's/^v//' | sed 's/_.*//') END_VERSIONS """ + + stub: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + if (!args2.contains("--cluster_fast") && !args2.contains("--cluster_size") && !args2.contains("--cluster_smallmem") && !args2.contains("--cluster_unoise") ) { + error "Unknown clustering option provided (${args2})" + } + def out_ext = args3.contains("--alnout") ? "aln.gz" : + args3.contains("--biomout") ? "biom.gz" : + args3.contains("--blast6out") ? "blast.tsv.gz" : + args3.contains("--centroids") ? "centroids.fasta.gz" : + args3.contains("--clusters") ? "clusters.fasta.gz" : + args3.contains("--mothur_shared_out") ? "mothur.tsv.gz" : + args3.contains("--msaout") ? "msa.fasta.gz" : + args3.contains("--otutabout") ? "otu.tsv.gz" : + args3.contains("--profile") ? "profile.txt.gz" : + args3.contains("--samout") ? "bam.gz" : + args3.contains("--uc") ? "uc.tsv.gz" : + args3.contains("--userout") ? "out.tsv.gz" : + "" + if (out_ext == "") { error "Unknown output file format provided (${args3})" } + def output = "${prefix}.${out_ext}" + def non_gz_out = args3.contains("--samout") ? "gunzip ${output}" : "" + """ + echo | gzip > ${output} + ${non_gz_out} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vsearch: \$(vsearch --version 2>&1 | head -n 1 | sed 's/vsearch //g' | sed 's/,.*//g' | sed 's/^v//' | sed 's/_.*//') + END_VERSIONS + """ } diff --git a/modules/nf-core/vsearch/cluster/meta.yml b/modules/nf-core/vsearch/cluster/meta.yml index 5013feb5..ebaa5a9e 100644 --- a/modules/nf-core/vsearch/cluster/meta.yml +++ b/modules/nf-core/vsearch/cluster/meta.yml @@ -27,9 +27,10 @@ input: type: file description: Sequences to cluster in FASTA format pattern: "*.{fasta,fa,fasta.gz,fa.gz}" + ontologies: [] output: - - aln: - - meta: + aln: + - - meta: type: map description: | Groovy Map containing sample information @@ -38,8 +39,10 @@ output: type: file description: Results in pairwise alignment format pattern: "*.aln.gz" - - biom: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + biom: + - - meta: type: map description: | Groovy Map containing sample information @@ -48,19 +51,23 @@ output: type: file description: Results in an OTU table in the biom version 1.0 file format pattern: "*.biom.gz" - - mothur: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + mothur: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test' ] - "*.mothur.tsv.gz": type: file - description: Results in an OTU table in the mothur ’shared’ tab-separated plain - text file format + description: Results in an OTU table in the mothur ’shared’ tab-separated + plain text file format pattern: "*.mothur.tsv.gz" - - otu: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + otu: + - - meta: type: map description: | Groovy Map containing sample information @@ -70,8 +77,10 @@ output: description: Results in an OTU table in the classic tab-separated plain text format pattern: "*.otu.tsv.gz" - - bam: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -80,8 +89,9 @@ output: type: file description: Results written in bam format pattern: "*.bam" - - out: - - meta: + ontologies: [] + out: + - - meta: type: map description: | Groovy Map containing sample information @@ -90,8 +100,10 @@ output: type: file description: Results in tab-separated output, columns defined by user pattern: "*.out.tsv.gz" - - blast: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + blast: + - - meta: type: map description: | Groovy Map containing sample information @@ -100,8 +112,10 @@ output: type: file description: Tab delimited results in blast-like tabular format pattern: "*.blast.tsv.gz" - - uc: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + uc: + - - meta: type: map description: | Groovy Map containing sample information @@ -110,8 +124,10 @@ output: type: file description: Tab delimited results in a uclust-like format with 10 columns pattern: "*.uc.gz" - - centroids: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + centroids: + - - meta: type: map description: | Groovy Map containing sample information @@ -120,8 +136,10 @@ output: type: file description: Centroid sequences in FASTA format pattern: "*.centroids.fasta.gz" - - clusters: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + clusters: + - - meta: type: map description: | Groovy Map containing sample information @@ -130,8 +148,10 @@ output: type: file description: Clustered sequences in FASTA format pattern: "*.clusters.fasta*.gz" - - profile: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + profile: + - - meta: type: map description: | Groovy Map containing sample information @@ -140,8 +160,10 @@ output: type: file description: Profile of the clustering results pattern: "*.profile.txt.gz" - - msa: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + msa: + - - meta: type: map description: | Groovy Map containing sample information @@ -150,11 +172,15 @@ output: type: file description: Multiple sequence alignment of the centroids pattern: "*.msa.fasta.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@mirpedrol" maintainers: diff --git a/modules/nf-core/vsearch/cluster/tests/main.nf.test b/modules/nf-core/vsearch/cluster/tests/main.nf.test index 155a949d..54fe270d 100644 --- a/modules/nf-core/vsearch/cluster/tests/main.nf.test +++ b/modules/nf-core/vsearch/cluster/tests/main.nf.test @@ -9,11 +9,16 @@ nextflow_process { tag "vsearch" tag "vsearch/cluster" - test("sarscov2 - fastq - cluster fast") { + config "./nextflow.config" - config './nextflow_fast.config' + test("sarscov2 - fastq - cluster fast") { when { + params { + cluster_args = '--id 0.8' + cluster_args2 = "--cluster_fast" + cluster_args3 = "--centroids" + } process { """ input[0] = [ @@ -35,9 +40,12 @@ nextflow_process { test("sarscov2 - fastq - cluster size") { - config './nextflow_size.config' - when { + params { + cluster_args = '--id 0.8' + cluster_args2 = "--cluster_size" + cluster_args3 = "--samout" // Test also sam to bam conversion + } process { """ input[0] = [ @@ -59,9 +67,12 @@ nextflow_process { test("sarscov2 - fastq - cluster smallmem") { - config './nextflow_smallmem.config' - when { + params { + cluster_args = '--id 0.8 --usersort' + cluster_args2 = "--cluster_smallmem" + cluster_args3 = "--centroids" + } process { """ input[0] = [ @@ -83,9 +94,12 @@ nextflow_process { test("sarscov2 - fastq - cluster unoise") { - config './nextflow_unoise.config' - when { + params { + cluster_args = '--id 0.8 --minsize 1' + cluster_args2 = "--cluster_unoise" + cluster_args3 = "--centroids" + } process { """ input[0] = [ @@ -107,9 +121,70 @@ nextflow_process { test("sarscov2 - fastq - cluster userout") { - config './nextflow_userout.config' + when { + params { + cluster_args = '--id 0.8 --userfields query+target+id' + cluster_args2 = "--cluster_fast" + cluster_args3 = "--userout" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq - cluster fast - stub") { + + options "-stub" when { + params { + cluster_args = '--id 0.8' + cluster_args2 = "--cluster_fast" + cluster_args3 = "--centroids" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq - cluster size - stub") { + + options "-stub" + + when { + params { + cluster_args = '--id 0.8' + cluster_args2 = "--cluster_size" + cluster_args3 = "--samout" // Test also sam to bam conversion + } process { """ input[0] = [ diff --git a/modules/nf-core/vsearch/cluster/tests/main.nf.test.snap b/modules/nf-core/vsearch/cluster/tests/main.nf.test.snap index cb91f4ed..a0639c55 100644 --- a/modules/nf-core/vsearch/cluster/tests/main.nf.test.snap +++ b/modules/nf-core/vsearch/cluster/tests/main.nf.test.snap @@ -94,6 +94,10 @@ ] } ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, "timestamp": "2023-12-06T14:35:18.210433" }, "sarscov2 - fastq - cluster userout": { @@ -191,8 +195,113 @@ ] } ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, "timestamp": "2023-12-06T14:35:27.471744" }, + "sarscov2 - fastq - cluster size - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,c9f7c3c0952e510ae64bf71dc85c3c0f" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "aln": [ + + ], + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.bam:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "biom": [ + + ], + "blast": [ + + ], + "centroids": [ + + ], + "clusters": [ + + ], + "mothur": [ + + ], + "msa": [ + + ], + "otu": [ + + ], + "out": [ + + ], + "profile": [ + + ], + "uc": [ + + ], + "versions": [ + "versions.yml:md5,c9f7c3c0952e510ae64bf71dc85c3c0f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-08-07T15:01:40.029544" + }, "sarscov2 - fastq - cluster size": { "content": [ { @@ -288,6 +397,10 @@ ] } ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, "timestamp": "2023-12-06T14:35:13.922868" }, "sarscov2 - fastq - cluster unoise": { @@ -385,8 +498,113 @@ ] } ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, "timestamp": "2023-12-06T14:35:22.849537" }, + "sarscov2 - fastq - cluster fast - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,c9f7c3c0952e510ae64bf71dc85c3c0f" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + "test.centroids.fasta.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "9": [ + + ], + "aln": [ + + ], + "bam": [ + + ], + "biom": [ + + ], + "blast": [ + + ], + "centroids": [ + [ + { + "id": "test", + "single_end": false + }, + "test.centroids.fasta.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "clusters": [ + + ], + "mothur": [ + + ], + "msa": [ + + ], + "otu": [ + + ], + "out": [ + + ], + "profile": [ + + ], + "uc": [ + + ], + "versions": [ + "versions.yml:md5,c9f7c3c0952e510ae64bf71dc85c3c0f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-08-07T14:59:06.666076" + }, "sarscov2 - fastq - cluster fast": { "content": [ { @@ -482,6 +700,10 @@ ] } ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, "timestamp": "2023-12-06T14:35:07.719346" } } \ No newline at end of file diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow.config b/modules/nf-core/vsearch/cluster/tests/nextflow.config new file mode 100644 index 00000000..7f135674 --- /dev/null +++ b/modules/nf-core/vsearch/cluster/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + withName: VSEARCH_CLUSTER { + ext.args = params.cluster_args + ext.args2 = params.cluster_args2 + ext.args3 = params.cluster_args3 + } +} diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow_fast.config b/modules/nf-core/vsearch/cluster/tests/nextflow_fast.config deleted file mode 100644 index df76a060..00000000 --- a/modules/nf-core/vsearch/cluster/tests/nextflow_fast.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - - ext.args = '--id 0.8' - ext.args2 = "--cluster_fast" - ext.args3 = "--centroids" - -} diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow_size.config b/modules/nf-core/vsearch/cluster/tests/nextflow_size.config deleted file mode 100644 index b650043e..00000000 --- a/modules/nf-core/vsearch/cluster/tests/nextflow_size.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - - ext.args = '--id 0.8' - ext.args2 = "--cluster_size" - ext.args3 = "--samout" // Test also sam to bam conversion - -} diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow_smallmem.config b/modules/nf-core/vsearch/cluster/tests/nextflow_smallmem.config deleted file mode 100644 index 5e4efb8b..00000000 --- a/modules/nf-core/vsearch/cluster/tests/nextflow_smallmem.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - - ext.args = '--id 0.8 --usersort' - ext.args2 = "--cluster_smallmem" - ext.args3 = "--centroids" - -} diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow_unoise.config b/modules/nf-core/vsearch/cluster/tests/nextflow_unoise.config deleted file mode 100644 index 96ccf725..00000000 --- a/modules/nf-core/vsearch/cluster/tests/nextflow_unoise.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - - ext.args = '--id 0.8 --minsize 1' - ext.args2 = "--cluster_unoise" - ext.args3 = "--centroids" - -} diff --git a/modules/nf-core/vsearch/cluster/tests/nextflow_userout.config b/modules/nf-core/vsearch/cluster/tests/nextflow_userout.config deleted file mode 100644 index 63b04555..00000000 --- a/modules/nf-core/vsearch/cluster/tests/nextflow_userout.config +++ /dev/null @@ -1,7 +0,0 @@ -process { - - ext.args = '--id 0.8 --userfields query+target+id' - ext.args2 = "--cluster_fast" - ext.args3 = "--userout" - -} diff --git a/modules/nf-core/vsearch/sintax/environment.yml b/modules/nf-core/vsearch/sintax/environment.yml index acba2f67..817588c4 100644 --- a/modules/nf-core/vsearch/sintax/environment.yml +++ b/modules/nf-core/vsearch/sintax/environment.yml @@ -1,3 +1,5 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda diff --git a/modules/nf-core/vsearch/sintax/meta.yml b/modules/nf-core/vsearch/sintax/meta.yml index 7b387b90..25a8342c 100644 --- a/modules/nf-core/vsearch/sintax/meta.yml +++ b/modules/nf-core/vsearch/sintax/meta.yml @@ -25,25 +25,34 @@ input: type: file description: Query sequences in FASTA or FASTQ format pattern: "*.{fasta,fa,fna,faa,fastq,fq}" - - - db: - type: file - description: Reference database file in FASTA or UDB format - pattern: "*" + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ + - db: + type: file + description: Reference database file in FASTA or UDB format + pattern: "*" + ontologies: [] output: - - tsv: - - meta: + tsv: + - - meta: type: file description: Results written to tab-delimited file pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV - "*.tsv": type: file description: Results written to tab-delimited file pattern: "*.{tsv}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@jtangrot" maintainers: diff --git a/modules/nf-core/vsearch/sintax/tests/main.nf.test b/modules/nf-core/vsearch/sintax/tests/main.nf.test index ebad65cb..a942ac09 100644 --- a/modules/nf-core/vsearch/sintax/tests/main.nf.test +++ b/modules/nf-core/vsearch/sintax/tests/main.nf.test @@ -11,7 +11,7 @@ nextflow_process { tag "vsearch/sintax" test("test-vsearch-sintax") { - + when { process { """ @@ -29,5 +29,5 @@ nextflow_process { ) } } - + } diff --git a/modules/nf-core/vsearch/usearchglobal/meta.yml b/modules/nf-core/vsearch/usearchglobal/meta.yml index 9f4b4203..e71d2449 100644 --- a/modules/nf-core/vsearch/usearchglobal/meta.yml +++ b/modules/nf-core/vsearch/usearchglobal/meta.yml @@ -27,117 +27,138 @@ input: type: file description: Query sequences in FASTA format pattern: "*.{fasta,fa,fna,faa}" - - - db: - type: file - description: Reference database file in FASTA or UDB format - pattern: "*" - - - idcutoff: - type: float - description: Reject the sequence match if the pairwise identity is lower than - the given id cutoff value (value ranging from 0.0 to 1.0 included) - - - outoption: - type: string - description: Specify the type of output file to be generated by selecting one - of the vsearch output file options - pattern: "alnout|biomout|blast6out|mothur_shared_out|otutabout|samout|uc|userout|lcaout" - - - user_columns: - type: string - description: If using the `userout` option, specify which columns to include - in output, with fields separated with `+` (e.g. query+target+id). See USEARCH - manual for valid options. For other output options, use an empty string. + ontologies: [] + - db: + type: file + description: Reference database file in FASTA or UDB format + pattern: "*" + ontologies: [] + - idcutoff: + type: float + description: Reject the sequence match if the pairwise identity is lower than + the given id cutoff value (value ranging from 0.0 to 1.0 included) + - outoption: + type: string + description: Specify the type of output file to be generated by selecting one + of the vsearch output file options + pattern: "alnout|biomout|blast6out|mothur_shared_out|otutabout|samout|uc|userout|lcaout" + - user_columns: + type: string + description: If using the `userout` option, specify which columns to include in + output, with fields separated with `+` (e.g. query+target+id). See USEARCH manual + for valid options. For other output options, use an empty string. output: - - aln: - - meta: + aln: + - - meta: type: file description: Results in pairwise alignment format pattern: "*.{aln}" + ontologies: [] - "*.aln": type: file description: Results in pairwise alignment format pattern: "*.{aln}" - - biom: - - meta: + ontologies: [] + biom: + - - meta: type: file - description: Results in an OTU table in the biom version 1.0 file format - pattern: "*.{biom}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.biom": type: file description: Results in an OTU table in the biom version 1.0 file format pattern: "*.{biom}" - - lca: - - meta: + ontologies: + - edam: http://edamontology.org/format_3746 # BIOM format + lca: + - - meta: type: file - description: Last common ancestor (LCA) information about the hits of each query - in tab-separated format - pattern: "*.{lca}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.lca": type: file - description: Last common ancestor (LCA) information about the hits of each query - in tab-separated format + description: Last common ancestor (LCA) information about the hits of each + query in tab-separated format pattern: "*.{lca}" - - mothur: - - meta: + ontologies: [] + mothur: + - - meta: type: file - description: Results in an OTU table in the mothur ’shared’ tab-separated plain - text file format - pattern: "*.{mothur}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.mothur": type: file - description: Results in an OTU table in the mothur ’shared’ tab-separated plain - text file format + description: Results in an OTU table in the mothur ’shared’ tab-separated + plain text file format pattern: "*.{mothur}" - - otu: - - meta: + ontologies: [] + otu: + - - meta: type: file - description: Results in an OTU table in the classic tab-separated plain text - format - pattern: "*.{otu}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.otu": type: file description: Results in an OTU table in the classic tab-separated plain text format pattern: "*.{otu}" - - sam: - - meta: + ontologies: [] + sam: + - - meta: type: file - description: Results written in sam format - pattern: "*.{sam}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.sam": type: file description: Results written in sam format pattern: "*.{sam}" - - tsv: - - meta: + ontologies: [] + tsv: + - - meta: type: file - description: Results in tab-separated output, columns defined by user - pattern: "*.{tsv}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.tsv": type: file description: Results in tab-separated output, columns defined by user pattern: "*.{tsv}" - - txt: - - meta: + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + txt: + - - meta: type: file - description: Tab delimited results in blast-like tabular format - pattern: "*.{txt}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.txt": type: file description: Tab delimited results in blast-like tabular format pattern: "*.{txt}" - - uc: - - meta: + ontologies: [] + uc: + - - meta: type: file - description: Tab delimited results in a uclust-like format with 10 columns - pattern: "*.{uc}" + description: Results in pairwise alignment format + pattern: "*.{aln}" + ontologies: [] - "*.uc": type: file description: Tab delimited results in a uclust-like format with 10 columns pattern: "*.{uc}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@jtangrot" maintainers: diff --git a/nextflow.config b/nextflow.config index e7cd6aee..09f10d60 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,13 +158,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = null + hook_url = System.getenv('HOOK_URL') help = false help_full = false show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options config_profile_name = null config_profile_description = null @@ -217,7 +219,15 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm { + arm64 { + process.arch = 'arm64' + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -274,18 +284,6 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB - process { - resourceLimits = [ - memory: 8.GB, - cpus : 4, - time : 1.h - ] - } - } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' apptainer.runOptions = '--nv' @@ -359,6 +357,7 @@ report { } trace { enabled = true + fields = 'task_id,hash,native_id,process,tag,name,status,exit,submit,module,cpus,memory,attempt,duration,realtime,%cpu,%mem,rss,vmem,peak_rss,peak_vmem,rchar,wchar' file = "${params.outdir}/pipeline_info/execution_trace_${params.trace_report_suffix}.txt" } dag { @@ -415,46 +414,19 @@ manifest { description = """Amplicon sequencing analysis workflow using DADA2 and QIIME2""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.5' - version = '2.15.0' + nextflowVersion = '!>=25.04.0' + version = '2.16.0' doi = '10.5281/zenodo.1493841,10.3389/fmicb.2020.550420' } // Nextflow plugins plugins { - id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes","igenomes_base","dada_ref_databases","qiime_ref_databases","sintax_ref_databases","kraken2_ref_databases","sidle_ref_databases"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run nf-core/ampliseq -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - beforeText = """ --\033[2m----------------------------------------------------\033[0m- - \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m -\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m -\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m -\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m - \033[0;32m`._,._,\'\033[0m -\033[0;35m nf-core/ampliseq ${manifest.version}\033[0m --\033[2m----------------------------------------------------\033[0m- -""" - afterText = """${manifest.doi ? "\n* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} -* The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x - -* Software dependencies - https://github.com/nf-core/ampliseq/blob/master/CITATIONS.md -""" - } - summary { - beforeText = validation.help.beforeText - afterText = validation.help.afterText - } } // Load ref_databases.config for reference taxonomy diff --git a/nextflow_schema.json b/nextflow_schema.json index 23a932a1..ed81e1f5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -439,7 +439,7 @@ "rdp", "rdp=18", "sbdi-gtdb", - "sbdi-gtdb=R10-RS226-1", + "sbdi-gtdb=R10-RS226-2", "sbdi-gtdb=R09-RS220-2", "sbdi-gtdb=R09-RS220-1", "sbdi-gtdb=R08-RS214-1", @@ -1023,6 +1023,18 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } }, diff --git a/nf-test.config b/nf-test.config index 3a1fff59..c8f94ddf 100644 --- a/nf-test.config +++ b/nf-test.config @@ -15,7 +15,7 @@ config { 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' + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore', 'bin/*', 'assets/schema_input.json', 'nextflow_schema.json', 'assets/report_template.Rmd' // load the necessary plugins plugins { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 90866331..8c861d5f 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-09-19T10:34:11+00:00", - "description": "

\n \n \n \"nf-core/ampliseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/ampliseq/results)[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1493841-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1493841)[![Cite Publication](https://img.shields.io/badge/Cite%20Us!-Cite%20Publication-important?labelColor=000000)](https://doi.org/10.3389/fmicb.2020.550420)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/ampliseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23ampliseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/ampliseq)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)[![Watch on YouTube](http://img.shields.io/badge/youtube-ampliseq-FFFF00?labelColor=000000&logo=youtube)](https://youtu.be/a0VOEeAvETs)\n\n## Introduction\n\n**nfcore/ampliseq** is a bioinformatics analysis pipeline used for amplicon sequencing, supporting denoising of any amplicon and supports a variety of taxonomic databases for taxonomic assignment including 16S, ITS, CO1 and 18S. Phylogenetic placement is also possible. Multiple region analysis such as 5R is implemented. Supported is paired-end Illumina or single-end Illumina, PacBio and IonTorrent data. Default is the analysis of 16S rRNA gene amplicons sequenced paired-end with Illumina.\n\nA video about relevance, usage and output of the pipeline (version 2.1.0; 26th Oct. 2021) can also be found in [YouTube](https://youtu.be/a0VOEeAvETs) and [billibilli](https://www.bilibili.com/video/BV1B44y1e7MM), the slides are deposited at [figshare](https://doi.org/10.6084/m9.figshare.16871008.v1).\n\n

\n \"nf-core/ampliseq\n

\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/ampliseq/results).\n\n## Pipeline summary\n\nBy default, the pipeline currently performs the following:\n\n- Sequencing quality control ([FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))\n- Trimming of reads ([Cutadapt](https://journal.embnet.org/index.php/embnetjournal/article/view/200))\n- Infer Amplicon Sequence Variants (ASVs) ([DADA2](https://doi.org/10.1038/nmeth.3869))\n- Optional post-clustering with [VSEARCH](https://github.com/torognes/vsearch)\n- Predict whether ASVs are ribosomal RNA sequences ([Barrnap](https://github.com/tseemann/barrnap))\n- Phylogenetic placement ([EPA-NG](https://github.com/Pbdas/epa-ng))\n- Taxonomical classification using DADA2; alternatives are [SINTAX](https://doi.org/10.1101/074161), [Kraken2](https://doi.org/10.1186/s13059-019-1891-0), and [QIIME2](https://www.nature.com/articles/s41587-019-0209-9)\n- Excludes unwanted taxa, produces absolute and relative feature/taxa count tables and plots, plots alpha rarefaction curves, computes alpha and beta diversity indices and plots thereof ([QIIME2](https://www.nature.com/articles/s41587-019-0209-9))\n- Creates phyloseq R objects ([Phyloseq](https://www.bioconductor.org/packages/release/bioc/html/phyloseq.html) and [TreeSE](https://doi.org/10.12688/f1000research.26669.2))\n- Pipeline QC summaries ([MultiQC](https://multiqc.info/))\n- Pipeline summary report ([R Markdown](https://github.com/rstudio/rmarkdown))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, you need to know whether the sequencing files at hand are expected to contain primer sequences (usually yes) and if yes, what primer sequences. In the example below, the paired end sequencing data was produced with 515f (GTGYCAGCMGCCGCGGTAA) and 806r (GGACTACNVGGGTWTCTAAT) primers of the V4 region of the 16S rRNA gene. Please note, that those sequences should not contain any sequencing adapter sequences, only the sequence that matches the biological amplicon.\n\nNext, the data needs to be organized in a folder, here `data`, or detailed in a samplesheet (see [input documentation](https://nf-co.re/ampliseq/usage#input-specifications)).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/ampliseq \\\n -profile \\\n --input \"data\" \\\n --FW_primer \"GTGYCAGCMGCCGCGGTAA\" \\\n --RV_primer \"GGACTACNVGGGTWTCTAAT\" \\\n --outdir \n```\n\n> [!NOTE]\n> Adding metadata will considerably increase the output, see [metadata documentation](https://nf-co.re/ampliseq/usage#metadata).\n\n> [!TIP]\n> By default the taxonomic assignment will be performed with DADA2 on SILVA database, but there are various tools and databases readily available, see [taxonomic classification documentation](https://nf-co.re/ampliseq/usage#taxonomic-classification). Differential abundance testing with ([ANCOM](https://www.ncbi.nlm.nih.gov/pubmed/26028277)) or ([ANCOM-BC](https://www.ncbi.nlm.nih.gov/pubmed/32665548)) when opting in.\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/ampliseq/usage) and the [parameter documentation](https://nf-co.re/ampliseq/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/ampliseq/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/ampliseq/output).\n\n## Credits\n\nnf-core/ampliseq was originally written by Daniel Straub ([@d4straub](https://github.com/d4straub)) and Alexander Peltzer ([@apeltzer](https://github.com/apeltzer)) for use at the [Quantitative Biology Center (QBiC)](https://www.info.qbic.uni-tuebingen.de/) and [Microbial Ecology, Center for Applied Geosciences](http://www.uni-tuebingen.de/de/104325), part of Eberhard Karls Universit\u00e4t T\u00fcbingen (Germany). Daniel Lundin [@erikrikarddaniel](https://github.com/erikrikarddaniel) ([Linnaeus University, Sweden](https://lnu.se/)) joined before pipeline release 2.0.0 and helped to improve the pipeline considerably.\n\nWe thank the following people for their extensive assistance in the development of this pipeline (in alphabetical order):\n\n[Adam Bennett](https://github.com/a4000), [Diego Brambilla](https://github.com/DiegoBrambilla), [Emelie Nilsson](https://github.com/emnilsson), [Jeanette T\u00e5ngrot](https://github.com/jtangrot), [Lokeshwaran Manoharan](https://github.com/lokeshbio), [Marissa Dubbelaar](https://github.com/marissaDubbelaar), [Sabrina Krakau](https://github.com/skrakau), [Sam Minot](https://github.com/sminot), [Till Englert](https://github.com/tillenglert)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#ampliseq` channel](https://nfcore.slack.com/channels/ampliseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use `nf-core/ampliseq` for your analysis, please cite the `ampliseq` article as follows:\n\n> **Interpretations of Environmental Microbial Community Studies Are Biased by the Selected 16S rRNA (Gene) Amplicon Sequencing Pipeline**\n>\n> Daniel Straub, Nia Blackwell, Adrian Langarica-Fuentes, Alexander Peltzer, Sven Nahnsen, Sara Kleindienst\n>\n> _Frontiers in Microbiology_ 2020, 11:2652 [doi: 10.3389/fmicb.2020.550420](https://doi.org/10.3389/fmicb.2020.550420).\n\nYou can cite the `nf-core/ampliseq` zenodo record for a specific version using the following [doi: 10.5281/zenodo.1493841](https://zenodo.org/badge/latestdoi/150448201)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-12-18T14:45:34+00:00", + "description": "

\n \n \n \"nf-core/ampliseq\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/ampliseq)\n[![GitHub Actions CI Status](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/ampliseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/ampliseq/results)[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1493841-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1493841)[![Cite Publication](https://img.shields.io/badge/Cite%20Us!-Cite%20Publication-important?labelColor=000000)](https://doi.org/10.3389/fmicb.2020.550420)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/ampliseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23ampliseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/ampliseq)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)[![Watch on YouTube](http://img.shields.io/badge/youtube-ampliseq-FFFF00?labelColor=000000&logo=youtube)](https://youtu.be/a0VOEeAvETs)\n\n## Introduction\n\n**nfcore/ampliseq** is a bioinformatics analysis pipeline used for amplicon sequencing, supporting denoising of any amplicon and supports a variety of taxonomic databases for taxonomic assignment including 16S, ITS, CO1 and 18S. Phylogenetic placement is also possible. Multiple region analysis such as 5R is implemented. Supported is paired-end Illumina or single-end Illumina, PacBio and IonTorrent data. Default is the analysis of 16S rRNA gene amplicons sequenced paired-end with Illumina.\n\nA video about relevance, usage and output of the pipeline (version 2.1.0; 26th Oct. 2021) can also be found in [YouTube](https://youtu.be/a0VOEeAvETs) and [billibilli](https://www.bilibili.com/video/BV1B44y1e7MM), the slides are deposited at [figshare](https://doi.org/10.6084/m9.figshare.16871008.v1).\n\n

\n \"nf-core/ampliseq\n

\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/ampliseq/results).\n\n## Pipeline summary\n\nBy default, the pipeline currently performs the following:\n\n- Sequencing quality control ([FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))\n- Trimming of reads ([Cutadapt](https://journal.embnet.org/index.php/embnetjournal/article/view/200))\n- Infer Amplicon Sequence Variants (ASVs) ([DADA2](https://doi.org/10.1038/nmeth.3869))\n- Optional post-clustering with [VSEARCH](https://github.com/torognes/vsearch)\n- Predict whether ASVs are ribosomal RNA sequences ([Barrnap](https://github.com/tseemann/barrnap))\n- Phylogenetic placement ([EPA-NG](https://github.com/Pbdas/epa-ng))\n- Taxonomical classification using DADA2; alternatives are [SINTAX](https://doi.org/10.1101/074161), [Kraken2](https://doi.org/10.1186/s13059-019-1891-0), and [QIIME2](https://www.nature.com/articles/s41587-019-0209-9)\n- Excludes unwanted taxa, produces absolute and relative feature/taxa count tables and plots, plots alpha rarefaction curves, computes alpha and beta diversity indices and plots thereof ([QIIME2](https://www.nature.com/articles/s41587-019-0209-9))\n- Creates phyloseq R objects ([Phyloseq](https://www.bioconductor.org/packages/release/bioc/html/phyloseq.html) and [TreeSE](https://doi.org/10.12688/f1000research.26669.2))\n- Pipeline QC summaries ([MultiQC](https://multiqc.info/))\n- Pipeline summary report ([R Markdown](https://github.com/rstudio/rmarkdown))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, you need to know whether the sequencing files at hand are expected to contain primer sequences (usually yes) and if yes, what primer sequences. In the example below, the paired end sequencing data was produced with 515f (GTGYCAGCMGCCGCGGTAA) and 806r (GGACTACNVGGGTWTCTAAT) primers of the V4 region of the 16S rRNA gene. Please note, that those sequences should not contain any sequencing adapter sequences, only the sequence that matches the biological amplicon.\n\nNext, the data needs to be organized in a folder, here `data`, or detailed in a samplesheet (see [input documentation](https://nf-co.re/ampliseq/usage#input-specifications)).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/ampliseq \\\n -profile \\\n --input \"data\" \\\n --FW_primer \"GTGYCAGCMGCCGCGGTAA\" \\\n --RV_primer \"GGACTACNVGGGTWTCTAAT\" \\\n --outdir \n```\n\n> [!NOTE]\n> Adding metadata will considerably increase the output, see [metadata documentation](https://nf-co.re/ampliseq/usage#metadata).\n\n> [!TIP]\n> By default the taxonomic assignment will be performed with DADA2 on SILVA database, but there are various tools and databases readily available, see [taxonomic classification documentation](https://nf-co.re/ampliseq/usage#taxonomic-classification). Differential abundance testing with ([ANCOM](https://www.ncbi.nlm.nih.gov/pubmed/26028277)) or ([ANCOM-BC](https://www.ncbi.nlm.nih.gov/pubmed/32665548)) when opting in.\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/ampliseq/usage) and the [parameter documentation](https://nf-co.re/ampliseq/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/ampliseq/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/ampliseq/output).\n\n## Credits\n\nnf-core/ampliseq was originally written by Daniel Straub ([@d4straub](https://github.com/d4straub)) and Alexander Peltzer ([@apeltzer](https://github.com/apeltzer)) for use at the [Quantitative Biology Center (QBiC)](https://www.info.qbic.uni-tuebingen.de/) and [Microbial Ecology, Center for Applied Geosciences](http://www.uni-tuebingen.de/de/104325), part of Eberhard Karls Universit\u00e4t T\u00fcbingen (Germany). Daniel Lundin [@erikrikarddaniel](https://github.com/erikrikarddaniel) ([Linnaeus University, Sweden](https://lnu.se/)) joined before pipeline release 2.0.0 and helped to improve the pipeline considerably.\n\nWe thank the following people for their extensive assistance in the development of this pipeline (in alphabetical order):\n\n[Adam Bennett](https://github.com/a4000), [Diego Brambilla](https://github.com/DiegoBrambilla), [Emelie Nilsson](https://github.com/emnilsson), [Jeanette T\u00e5ngrot](https://github.com/jtangrot), [Lokeshwaran Manoharan](https://github.com/lokeshbio), [Marissa Dubbelaar](https://github.com/marissaDubbelaar), [Sabrina Krakau](https://github.com/skrakau), [Sam Minot](https://github.com/sminot), [Till Englert](https://github.com/tillenglert)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#ampliseq` channel](https://nfcore.slack.com/channels/ampliseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use `nf-core/ampliseq` for your analysis, please cite the `ampliseq` article as follows:\n\n> **Interpretations of Environmental Microbial Community Studies Are Biased by the Selected 16S rRNA (Gene) Amplicon Sequencing Pipeline**\n>\n> Daniel Straub, Nia Blackwell, Adrian Langarica-Fuentes, Alexander Peltzer, Sven Nahnsen, Sara Kleindienst\n>\n> _Frontiers in Microbiology_ 2020, 11:2652 [doi: 10.3389/fmicb.2020.550420](https://doi.org/10.3389/fmicb.2020.550420).\n\nYou can cite the `nf-core/ampliseq` zenodo record for a specific version using the following [doi: 10.5281/zenodo.1493841](https://zenodo.org/badge/latestdoi/150448201)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -105,7 +105,7 @@ }, "mentions": [ { - "@id": "#7a27732d-cfcf-47c2-9576-5e5f6d265eae" + "@id": "#414b9990-2f05-4527-a72a-bc79dbf68dfb" } ], "name": "nf-core/ampliseq" @@ -134,23 +134,23 @@ ], "creator": [ { - "@id": "#jeanette.tangrot@umu.se" + "@id": "https://orcid.org/0000-0002-6503-2180" }, { - "@id": "#emelie.nilsson@lnu.se" + "@id": "#42973691+d4straub@users.noreply.github.com" }, { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "#emelie.nilsson@lnu.se" }, { - "@id": "#42973691+d4straub@users.noreply.github.com" + "@id": "#jeanette.tangrot@umu.se" }, { "@id": "#phil.ewels@scilifelab.se" } ], "dateCreated": "", - "dateModified": "2025-09-19T12:34:11Z", + "dateModified": "2025-12-18T15:45:34Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -164,6 +164,7 @@ "its", "metabarcoding", "metagenomics", + "metataxonomics", "microbiome", "pacbio", "qiime2", @@ -175,14 +176,14 @@ "MIT" ], "maintainer": [ - { - "@id": "#jeanette.tangrot@umu.se" - }, { "@id": "https://orcid.org/0000-0002-6503-2180" }, { "@id": "#42973691+d4straub@users.noreply.github.com" + }, + { + "@id": "#jeanette.tangrot@umu.se" } ], "name": [ @@ -196,10 +197,10 @@ }, "url": [ "https://github.com/nf-core/ampliseq", - "https://nf-co.re/ampliseq/2.15.0/" + "https://nf-co.re/ampliseq/2.16.0/" ], "version": [ - "2.15.0" + "2.16.0" ] }, { @@ -212,14 +213,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.10.5" + "version": "!>=25.04.0" }, { - "@id": "#7a27732d-cfcf-47c2-9576-5e5f6d265eae", + "@id": "#414b9990-2f05-4527-a72a-bc79dbf68dfb", "@type": "TestSuite", "instance": [ { - "@id": "#ddad1248-748b-4395-b38b-86f6d68e0192" + "@id": "#84d44470-490b-4954-a719-782f8cb10710" } ], "mainEntity": { @@ -228,7 +229,7 @@ "name": "Test suite for nf-core/ampliseq" }, { - "@id": "#ddad1248-748b-4395-b38b-86f6d68e0192", + "@id": "#84d44470-490b-4954-a719-782f8cb10710", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/ampliseq", "resource": "repos/nf-core/ampliseq/actions/workflows/nf-test.yml", @@ -366,18 +367,6 @@ "name": "nf-core", "url": "https://nf-co.re/" }, - { - "@id": "#jeanette.tangrot@umu.se", - "@type": "Person", - "email": "jeanette.tangrot@umu.se", - "name": "Jeanette T\u00e5ngrot" - }, - { - "@id": "#emelie.nilsson@lnu.se", - "@type": "Person", - "email": "emelie.nilsson@lnu.se", - "name": "Emelie Nilsso" - }, { "@id": "https://orcid.org/0000-0002-6503-2180", "@type": "Person", @@ -390,6 +379,18 @@ "email": "42973691+d4straub@users.noreply.github.com", "name": "Daniel Straub" }, + { + "@id": "#emelie.nilsson@lnu.se", + "@type": "Person", + "email": "emelie.nilsson@lnu.se", + "name": "Emelie Nilsso" + }, + { + "@id": "#jeanette.tangrot@umu.se", + "@type": "Person", + "email": "jeanette.tangrot@umu.se", + "name": "Jeanette T\u00e5ngrot" + }, { "@id": "#phil.ewels@scilifelab.se", "@type": "Person", diff --git a/subworkflows/local/cutadapt_workflow.nf b/subworkflows/local/cutadapt_workflow.nf index 85de448f..62f54abb 100644 --- a/subworkflows/local/cutadapt_workflow.nf +++ b/subworkflows/local/cutadapt_workflow.nf @@ -16,7 +16,7 @@ workflow CUTADAPT_WORKFLOW { double_primer main: - ch_versions_cutadapt_workflow = Channel.empty() + ch_versions_cutadapt_workflow = channel.empty() CUTADAPT_BASIC ( ch_file ).reads.set { ch_trimmed_reads } CUTADAPT_BASIC.out.log @@ -27,7 +27,6 @@ workflow CUTADAPT_WORKFLOW { [ meta, log ] } .groupTuple(by: 0 ) .set { ch_cutadapt_logs } - ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_BASIC.out.versions ) CUTADAPT_SUMMARY_STD ( "cutadapt_standard", ch_cutadapt_logs ) ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_STD.out.versions ) @@ -46,8 +45,8 @@ workflow CUTADAPT_WORKFLOW { .groupTuple(by: 0 ) .set { ch_cutadapt_doubleprimer_logs } CUTADAPT_SUMMARY_DOUBLEPRIMER ( "cutadapt_doubleprimer", ch_cutadapt_doubleprimer_logs ) - ch_summaries = CUTADAPT_SUMMARY_STD.out.tsv.combine( CUTADAPT_SUMMARY_DOUBLEPRIMER.out.tsv ) ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_DOUBLEPRIMER.out.versions ) + ch_summaries = CUTADAPT_SUMMARY_STD.out.tsv.combine( CUTADAPT_SUMMARY_DOUBLEPRIMER.out.tsv ) CUTADAPT_SUMMARY_MERGE ( "merge", ch_summaries ) ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_MERGE.out.versions ) } else { diff --git a/subworkflows/local/dada2_preprocessing.nf b/subworkflows/local/dada2_preprocessing.nf index e70de0c1..88cdbebc 100644 --- a/subworkflows/local/dada2_preprocessing.nf +++ b/subworkflows/local/dada2_preprocessing.nf @@ -16,7 +16,7 @@ workflow DADA2_PREPROCESSING { trunclenr main: - ch_versions_dada2_preprocessing = Channel.empty() + ch_versions_dada2_preprocessing = channel.empty() //plot unprocessed, aggregated quality profile for forward and reverse reads separately if (single_end) { @@ -41,7 +41,7 @@ workflow DADA2_PREPROCESSING { .set { ch_all_trimmed_reads } } - ch_DADA2_QUALITY1_SVG = Channel.empty() + ch_DADA2_QUALITY1_SVG = channel.empty() if ( !params.skip_dada_quality ) { DADA2_QUALITY1 ( ch_all_trimmed_reads.dump(tag: 'into_dada2_quality') ) ch_versions_dada2_preprocessing = ch_versions_dada2_preprocessing.mix(DADA2_QUALITY1.out.versions) @@ -64,7 +64,7 @@ workflow DADA2_PREPROCESSING { else log.warn "Probably everything is fine, but this is a reminder that `--trunclenf` was set automatically to ${it[0][1]} and `--trunclenr` to ${it[1][1]}. If this doesnt seem reasonable, then please change `--trunc_qmin` (and `--trunc_rmin`), or set `--trunclenf` and `--trunclenr` directly." } } else { - Channel.fromList( [['FW', trunclenf], ['RV', trunclenr]] ) + channel.fromList( [['FW', trunclenf], ['RV', trunclenr]] ) .toSortedList() .set { ch_trunc } } @@ -129,7 +129,7 @@ workflow DADA2_PREPROCESSING { .set { ch_all_preprocessed_reads } } - ch_DADA2_QUALITY2_SVG = Channel.empty() + ch_DADA2_QUALITY2_SVG = channel.empty() if ( !params.skip_dada_quality ) { DADA2_QUALITY2 ( ch_all_preprocessed_reads.dump(tag: 'into_dada2_quality2') ) ch_versions_dada2_preprocessing = ch_versions_dada2_preprocessing.mix(DADA2_QUALITY2.out.versions) diff --git a/subworkflows/local/dada2_taxonomy_wf.nf b/subworkflows/local/dada2_taxonomy_wf.nf index f0756dc7..e3325114 100644 --- a/subworkflows/local/dada2_taxonomy_wf.nf +++ b/subworkflows/local/dada2_taxonomy_wf.nf @@ -24,12 +24,12 @@ workflow DADA2_TAXONOMY_WF { val_dada_assign_chunksize main: - ch_versions_dada_taxonomy = Channel.empty() + ch_versions_dada_taxonomy = channel.empty() // Set cutoff to use for SH assignment and path to SH taxonomy file if ( params.addsh ) { vsearch_cutoff = 0.985 - ch_shinfo = Channel.fromList(params.dada_ref_databases[params.dada_ref_taxonomy]["shfile"]).map { it -> file(it) } + ch_shinfo = channel.fromList(params.dada_ref_databases[params.dada_ref_taxonomy]["shfile"]).map { it -> file(it) } } //cut taxonomy to expected amplicon @@ -47,7 +47,6 @@ workflow DADA2_TAXONOMY_WF { CUTADAPT_TAXONOMY ( ch_assigntax ).reads .map { meta, db -> db } .set { ch_assigntax } - ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix( CUTADAPT_TAXONOMY.out.versions ) } //set file name prefix @@ -74,7 +73,7 @@ workflow DADA2_TAXONOMY_WF { if (params.cut_its != "none") { FORMAT_TAXRESULTS_STD ( ch_dada2_taxonomy_tsv, ch_full_fasta, "ASV_tax.${val_dada_ref_taxonomy}.tsv" ) - ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix( FORMAT_TAXRESULTS_STD.out.versions.ifEmpty(null) ) + ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix( FORMAT_TAXRESULTS_STD.out.versions ) } //DADA2 addSpecies @@ -119,9 +118,9 @@ workflow DADA2_TAXONOMY_WF { [ meta, fasta ] } .set { ch_fasta_map } VSEARCH_USEARCHGLOBAL( ch_fasta_map, ch_assigntax, vsearch_cutoff, 'blast6out', "" ) - ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix(VSEARCH_USEARCHGLOBAL.out.versions.ifEmpty(null)) + ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix(VSEARCH_USEARCHGLOBAL.out.versions) ASSIGNSH( ch_dada2_tax1, ch_shinfo.collect(), VSEARCH_USEARCHGLOBAL.out.txt, ASV_SH_name + ".${val_dada_ref_taxonomy}.tsv") - ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix(ASSIGNSH.out.versions.ifEmpty(null)) + ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix(ASSIGNSH.out.versions) ch_dada2_tax = ASSIGNSH.out.tsv } else { ch_dada2_tax = ch_dada2_tax1 diff --git a/subworkflows/local/kraken2_taxonomy_wf.nf b/subworkflows/local/kraken2_taxonomy_wf.nf index 3675f552..267936e9 100644 --- a/subworkflows/local/kraken2_taxonomy_wf.nf +++ b/subworkflows/local/kraken2_taxonomy_wf.nf @@ -14,7 +14,7 @@ workflow KRAKEN2_TAXONOMY_WF { kraken2_taxlevels main: - ch_versions_kraken2_taxonomy = Channel.empty() + ch_versions_kraken2_taxonomy = channel.empty() // format taxonomy file ch_kraken2_ref_taxonomy diff --git a/subworkflows/local/parse_input.nf b/subworkflows/local/parse_input.nf index c3f82f38..1fa6da85 100644 --- a/subworkflows/local/parse_input.nf +++ b/subworkflows/local/parse_input.nf @@ -18,7 +18,7 @@ workflow PARSE_INPUT { error_message += "In any case, please consult the pipeline documentation.\n" if ( single_end ) { //Get files - single end - Channel + channel .fromPath( input + folders + extension ) .ifEmpty { error("${error_message}") } .map { read -> @@ -30,7 +30,7 @@ workflow PARSE_INPUT { .set { ch_reads } } else { //Get files - paired end - Channel + channel .fromFilePairs( input + folders + extension, size: 2 ) .ifEmpty { error("${error_message}") } .map { name, reads -> diff --git a/subworkflows/local/qiime2_ancom.nf b/subworkflows/local/qiime2_ancom.nf index 028c9441..ba8ed575 100644 --- a/subworkflows/local/qiime2_ancom.nf +++ b/subworkflows/local/qiime2_ancom.nf @@ -21,9 +21,9 @@ workflow QIIME2_ANCOM { ancombc_formula main: - ch_versions_qiime2_ancom = Channel.empty() + ch_versions_qiime2_ancom = channel.empty() - ch_taxlevel = Channel.of( tax_agglom_min..tax_agglom_max ) + ch_taxlevel = channel.of( tax_agglom_min..tax_agglom_max ) //Filter ASV table to get rid of samples that have no metadata values ch_metadata @@ -55,22 +55,22 @@ workflow QIIME2_ANCOM { .combine( QIIME2_FILTERSAMPLES_ANCOM.out.qza ) .combine( ch_tax ) .combine( ch_taxlevel ) - .combine( Channel.fromList([""]) ) + .combine( channel.fromList([""]) ) .set{ ch_for_ancombc_tax } QIIME2_ANCOMBC_TAX ( ch_for_ancombc_tax ) ch_versions_qiime2_ancom = ch_versions_qiime2_ancom.mix(QIIME2_ANCOMBC_TAX.out.versions) QIIME2_ANCOMBC_TAX.out.da_barplot.subscribe { it -> if ( it.baseName[0].toString().startsWith("WARNING") ) log.warn it.baseName[0].toString().replace("WARNING ","QIIME2_ANCOMBC_TAX: ") } //ANCOMBC on ASVs - QIIME2_ANCOMBC_ASV ( ch_metadata.combine( QIIME2_FILTERSAMPLES_ANCOM.out.qza.flatten() ).combine( Channel.fromList([""]) ) ) + QIIME2_ANCOMBC_ASV ( ch_metadata.combine( QIIME2_FILTERSAMPLES_ANCOM.out.qza.flatten() ).combine( channel.fromList([""]) ) ) ch_versions_qiime2_ancom = ch_versions_qiime2_ancom.mix(QIIME2_ANCOMBC_ASV.out.versions) } if ( ancombc_formula ) { - ch_ancombc_formula = Channel.fromList( ancombc_formula.toString().replace(" ","").tokenize(',') ) + ch_ancombc_formula = channel.fromList( ancombc_formula.toString().replace(" ","").tokenize(',') ) //ANCOMBC with ancombc_formula on various taxonomic levels - ch_taxlevel = Channel.of( tax_agglom_min..tax_agglom_max ) + ch_taxlevel = channel.of( tax_agglom_min..tax_agglom_max ) ch_metadata .combine( ch_asv ) .combine( ch_tax ) @@ -87,8 +87,8 @@ workflow QIIME2_ANCOM { } emit: - ancom = params.ancom ? QIIME2_ANCOM_ASV.out.ancom.mix(QIIME2_ANCOM_TAX.out.ancom) : Channel.empty() - ancombc = params.ancombc ? QIIME2_ANCOMBC_ASV.out.da_barplot.mix(QIIME2_ANCOMBC_TAX.out.da_barplot) : Channel.empty() - ancombc_formula = ancombc_formula ? ANCOMBC_FORMULA_ASV.out.da_barplot.mix(ANCOMBC_FORMULA_TAX.out.da_barplot) : Channel.empty() + ancom = params.ancom ? QIIME2_ANCOM_ASV.out.ancom.mix(QIIME2_ANCOM_TAX.out.ancom) : channel.empty() + ancombc = params.ancombc ? QIIME2_ANCOMBC_ASV.out.da_barplot.mix(QIIME2_ANCOMBC_TAX.out.da_barplot) : channel.empty() + ancombc_formula = ancombc_formula ? ANCOMBC_FORMULA_ASV.out.da_barplot.mix(ANCOMBC_FORMULA_TAX.out.da_barplot) : channel.empty() versions = ch_versions_qiime2_ancom } diff --git a/subworkflows/local/qiime2_barplotavg.nf b/subworkflows/local/qiime2_barplotavg.nf index 089261a1..115c2edd 100644 --- a/subworkflows/local/qiime2_barplotavg.nf +++ b/subworkflows/local/qiime2_barplotavg.nf @@ -14,8 +14,8 @@ workflow QIIME2_BARPLOTAVG { metadata_category_barplot main: - ch_versions_qiime2_barplotavg = Channel.empty() - ch_metadata_category_barplot = Channel.fromList(metadata_category_barplot.tokenize(',')) + ch_versions_qiime2_barplotavg = channel.empty() + ch_metadata_category_barplot = channel.fromList(metadata_category_barplot.tokenize(',')) //Import raltive ASV table QIIME2_INASV_BPAVG ( ch_rel_tsv ) diff --git a/subworkflows/local/qiime2_diversity.nf b/subworkflows/local/qiime2_diversity.nf index ef4364d0..16291e37 100644 --- a/subworkflows/local/qiime2_diversity.nf +++ b/subworkflows/local/qiime2_diversity.nf @@ -24,7 +24,7 @@ workflow QIIME2_DIVERSITY { diversity_rarefaction_depth main: - ch_versions_qiime2_diversity = Channel.empty() + ch_versions_qiime2_diversity = channel.empty() //Phylogenetic tree for beta & alpha diversities produce_tree = !ch_tree ? true : false @@ -65,7 +65,7 @@ workflow QIIME2_DIVERSITY { //adonis ( ch_metadata, DIVERSITY_CORE.out.qza ) if (params.qiime_adonis_formula) { - ch_qiime_adonis_formula = Channel.fromList(params.qiime_adonis_formula.tokenize(',')) + ch_qiime_adonis_formula = channel.fromList(params.qiime_adonis_formula.tokenize(',')) ch_metadata .combine( QIIME2_DIVERSITY_CORE.out.distance.flatten() ) .combine( ch_qiime_adonis_formula ) diff --git a/subworkflows/local/qiime2_export.nf b/subworkflows/local/qiime2_export.nf index a52942f4..6f5de053 100644 --- a/subworkflows/local/qiime2_export.nf +++ b/subworkflows/local/qiime2_export.nf @@ -23,7 +23,7 @@ workflow QIIME2_EXPORT { tax_agglom_max main: - ch_versions_qiime2_export = Channel.empty() + ch_versions_qiime2_export = channel.empty() //export_filtered_dada_output (optional) QIIME2_EXPORT_ABSOLUTE ( ch_asv, ch_seq, ch_tax, tax_agglom_min, tax_agglom_max ) diff --git a/subworkflows/local/qiime2_preptax.nf b/subworkflows/local/qiime2_preptax.nf index 9d3c25d4..fe875995 100644 --- a/subworkflows/local/qiime2_preptax.nf +++ b/subworkflows/local/qiime2_preptax.nf @@ -16,7 +16,7 @@ workflow QIIME2_PREPTAX { RV_primer //val main: - ch_qiime2_preptax_versions = Channel.empty() + ch_qiime2_preptax_versions = channel.empty() if (params.qiime_ref_tax_custom) { // Handle case where we have been provided a pair of filepaths. @@ -29,10 +29,10 @@ workflow QIIME2_PREPTAX { }.set { ch_qiime_ref_tax_branched } ch_qiime_ref_tax_branched.failed.subscribe { it -> error "$it is neither a compressed (ends with `.gz`) or decompressed sequence (ends with `.fna`) or taxonomy file (ends with `.tax`). Please review input." } - PIGZ_UNCOMPRESS(ch_qiime_ref_tax_branched.compressed) + PIGZ_UNCOMPRESS(ch_qiime_ref_tax_branched.compressed.map{ it -> [[:], it] }) ch_qiime2_preptax_versions = ch_qiime2_preptax_versions.mix(PIGZ_UNCOMPRESS.out.versions) - ch_qiime_db_files = PIGZ_UNCOMPRESS.out.file + ch_qiime_db_files = PIGZ_UNCOMPRESS.out.file.map{ it -> it[1] } ch_qiime_db_files = ch_qiime_db_files.mix(ch_qiime_ref_tax_branched.decompressed) ch_ref_database_fna = ch_qiime_db_files.filter { it -> diff --git a/subworkflows/local/robject_workflow.nf b/subworkflows/local/robject_workflow.nf index ebb7ac23..457445c6 100644 --- a/subworkflows/local/robject_workflow.nf +++ b/subworkflows/local/robject_workflow.nf @@ -15,7 +15,7 @@ workflow ROBJECT_WORKFLOW { run_qiime2 main: - ch_versions_robject_workflow = Channel.empty() + ch_versions_robject_workflow = channel.empty() if ( run_qiime2 ) { if ( params.exclude_taxa != "none" || params.min_frequency != 1 || params.min_samples != 1 ) { diff --git a/subworkflows/local/sidle_wf.nf b/subworkflows/local/sidle_wf.nf index f6686294..004a48a9 100644 --- a/subworkflows/local/sidle_wf.nf +++ b/subworkflows/local/sidle_wf.nf @@ -25,7 +25,7 @@ workflow SIDLE_WF { ch_db_tree main: - ch_sidle_versions = Channel.empty() + ch_sidle_versions = channel.empty() // DB if (!params.sidle_ref_tax_custom) { @@ -39,7 +39,7 @@ workflow SIDLE_WF { //input from params.sidle_ref_tax_custom: it[0] = taxonomy txt = ch_db_taxonomy, it[1] = fasta = ch_db_sequences, it[2] = aligned fasta = ch_db_alignedsequences ch_db_taxonomy = ch_sidle_ref_taxonomy.map{ it -> it[0] } ch_db_sequences = ch_sidle_ref_taxonomy.map{ it -> it[1] } - ch_db_alignedsequences = params.sidle_ref_aln_custom ? ch_sidle_ref_taxonomy.map{ it -> it[2] } : Channel.empty() + ch_db_alignedsequences = params.sidle_ref_aln_custom ? ch_sidle_ref_taxonomy.map{ it -> it[2] } : channel.empty() } SIDLE_INDB ( ch_db_sequences, ch_db_taxonomy ) ch_sidle_versions = ch_sidle_versions.mix(SIDLE_INDB.out.versions) diff --git a/subworkflows/local/sintax_taxonomy_wf.nf b/subworkflows/local/sintax_taxonomy_wf.nf index ee9c9beb..78c07781 100644 --- a/subworkflows/local/sintax_taxonomy_wf.nf +++ b/subworkflows/local/sintax_taxonomy_wf.nf @@ -16,7 +16,7 @@ workflow SINTAX_TAXONOMY_WF { sintax_taxlevels main: - ch_versions_sintax_taxonomy = Channel.empty() + ch_versions_sintax_taxonomy = channel.empty() //format taxonomy file FORMAT_TAXONOMY_SINTAX ( ch_sintax_ref_taxonomy ) diff --git a/subworkflows/local/utils_nfcore_ampliseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_ampliseq_pipeline/main.nf index 9032c5ce..f854bc06 100644 --- a/subworkflows/local/utils_nfcore_ampliseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_ampliseq_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -31,10 +32,14 @@ workflow PIPELINE_INITIALISATION { monochrome_logs // boolean: Do not use coloured log outputs nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved + input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -49,10 +54,35 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/ampliseq ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/ampliseq/blob/master/CITATIONS.md +""" + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303e..ee4738c8 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb30164..c977917a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 09ef842a..8d8c7371 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore index 158c83c5..e128a128 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,10 +1,11 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt -multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} diff --git a/tests/default.nf.test b/tests/default.nf.test index f93c97a7..910c75b9 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 41348c15..1dc0c464 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test": { "content": [ - 123, { "ANCOMBC_FORMULA_ASV": { "qiime2": "2024.10.1" @@ -22,51 +21,51 @@ "R": "4.0.3" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "CUTADAPT_TAXONOMY": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -91,23 +90,23 @@ "sed": 4.7 }, "MERGE_STATS_FILTERSSU": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_ALL": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_PAIRWISE": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_ALPHARAREFACTION": { "qiime2": "2024.10.1" @@ -193,7 +192,7 @@ "vsearch": "2.21.1" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -212,6 +211,7 @@ "barrnap", "barrnap/ASV_seqs.ssu.fasta", "barrnap/ASV_table.ssu.tsv", + "barrnap/result.tsv", "barrnap/rrna.arc.gff", "barrnap/rrna.bac.gff", "barrnap/rrna.euk.gff", @@ -284,7 +284,6 @@ "input/Samplesheet.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", @@ -300,7 +299,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -2410,7 +2411,7 @@ "Metadata.tsv:md5,060b56528bb566eed71f6dfdb52cc395", "multiqc_fastqc.txt:md5,7d23984b06e4251f17e1cfce7a04aaae", "multiqc_general_stats.txt:md5,885c19ff3e53d16bfe7937d6694268d7", - "multiqc_cutadapt.txt:md5,b4409890ffb9c6938433c374b50c380e", + "multiqc_cutadapt.txt:md5,3dce058d2d6c85a3cca7314ae19c5586", "dna.tsv:md5,46bb52a05204ade2d571ac089f732012", "emof.tsv:md5,52ff7d226c79b1f78d5f4895d748f915", "event.tsv:md5,d275c5c0d7dbf7a5b2c61082fbce486d", @@ -2419,9 +2420,9 @@ "ASV_post_clustering_filtered.table.tsv:md5,e607469a32d490bbe139e9196ff4a47d" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-13T15:20:58.451145935" + "timestamp": "2025-12-15T17:05:04.258122664" } } \ No newline at end of file diff --git a/tests/doubleprimers.nf.test b/tests/doubleprimers.nf.test index b0396eb5..ebc4197f 100644 --- a/tests/doubleprimers.nf.test +++ b/tests/doubleprimers.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/doubleprimers.nf.test.snap b/tests/doubleprimers.nf.test.snap index 7cb4db71..4b5580ae 100644 --- a/tests/doubleprimers.nf.test.snap +++ b/tests/doubleprimers.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_doubleprimers": { "content": [ - 44, { "BARRNAP": { "barrnap": 0.9 @@ -10,68 +9,71 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 + }, + "CUTADAPT_DOUBLEPRIMER": { + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_DOUBLEPRIMER": { "python": "Python 3.8.3" }, "CUTADAPT_SUMMARY_MERGE": { - "R": "4.3.2" + "R": "4.4.3" }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FILTER_STATS": { "python": "3.9.1", "pandas": "1.1.5" }, "KRAKEN2_KRAKEN2": { - "kraken2": "2.1.3", + "kraken2": "2.1.6", "pigz": 2.8 }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_BARPLOT": { "qiime2": "2024.10.1" @@ -112,7 +114,7 @@ "untar": 1.34 }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -176,11 +178,12 @@ "kraken2/ASV_tax.greengenes.kraken2.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -301,12 +304,12 @@ "ASV_tax.greengenes.kraken2.complete.tsv:md5,cbdd1db05ba897ac9972b106a8138956", "ASV_tax.greengenes.kraken2.tsv:md5,87f748440bf5b3ce1c73029c495ff6e9", "multiqc_general_stats.txt:md5,87461482b83b797b1c6b139a0cf3164e", - "multiqc_cutadapt.txt:md5,f022f739ce976fd43677d8889c7ba54b" + "multiqc_cutadapt.txt:md5,05eca9a962170f318bd90938d331afec" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T15:46:36.660755102" + "timestamp": "2025-12-15T13:45:01.844416414" } -} +} \ No newline at end of file diff --git a/tests/failed.nf.test b/tests/failed.nf.test index 9bf7fe40..86cd18b8 100644 --- a/tests/failed.nf.test +++ b/tests/failed.nf.test @@ -22,8 +22,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/failed.nf.test.snap b/tests/failed.nf.test.snap index 36cc5749..ebedc67a 100644 --- a/tests/failed.nf.test.snap +++ b/tests/failed.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_failed": { "content": [ - 71, { "BARRNAP": { "barrnap": 0.9 @@ -13,51 +12,51 @@ "R": "4.0.3" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "CUTADAPT_TAXONOMY": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FILTER_LEN_ASV": { "R": "4.0.3", @@ -72,23 +71,23 @@ "pandas": "1.1.5" }, "MERGE_STATS_FILTERSSU": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_ALL": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_PAIRWISE": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_ALPHARAREFACTION": { "qiime2": "2024.10.1" @@ -144,7 +143,7 @@ "pandas": "1.1.5" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -157,6 +156,7 @@ "barrnap", "barrnap/ASV_seqs.ssu.fasta", "barrnap/ASV_table.ssu.tsv", + "barrnap/result.tsv", "barrnap/rrna.arc.gff", "barrnap/rrna.bac.gff", "barrnap/rrna.euk.gff", @@ -217,11 +217,12 @@ "input/Samplesheet_failed_sample.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -1075,12 +1076,12 @@ "descriptive_stats.tsv:md5,666279e79355dd60a0f5c7c8bb77618d", "seven_number_summary.tsv:md5,e087b59678e7e9ade87e0a7349f54e2e", "multiqc_general_stats.txt:md5,0d19dc786ef0263939502acd5caa29de", - "multiqc_cutadapt.txt:md5,0b09228fbc2205354c50fd5ba955937c" + "multiqc_cutadapt.txt:md5,5660c331eff9d7ff9ac702804d3801f3" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-13T09:46:02.742778014" + "timestamp": "2025-12-15T13:55:23.863014015" } } \ No newline at end of file diff --git a/tests/fasta.nf.test b/tests/fasta.nf.test index ba04dfaa..4485bd34 100644 --- a/tests/fasta.nf.test +++ b/tests/fasta.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/fasta.nf.test.snap b/tests/fasta.nf.test.snap index 911297c7..c0ba5515 100644 --- a/tests/fasta.nf.test.snap +++ b/tests/fasta.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_fasta": { "content": [ - 11, { "BARRNAP": { "barrnap": 0.9 @@ -10,8 +9,8 @@ "python": "Python 3.9.1" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FILTER_CODONS": { "python": "3.9.1", @@ -32,7 +31,7 @@ "sed": 4.7 }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -43,6 +42,7 @@ "asv_length_filter/stats.len.tsv", "barrnap", "barrnap/ASV_seqs.ssu.fasta", + "barrnap/result.tsv", "barrnap/rrna.arc.gff", "barrnap/rrna.bac.gff", "barrnap/rrna.euk.gff", @@ -65,8 +65,9 @@ "input/ASV_seqs.fasta", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_sources.txt", @@ -94,9 +95,9 @@ "ASV_seqs.fasta:md5,39b0d4ad96b37fa68d4ee5c21b667fed" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T14:22:51.39593484" + "timestamp": "2025-12-15T13:56:49.128616584" } } \ No newline at end of file diff --git a/tests/iontorrent.nf.test b/tests/iontorrent.nf.test index 9a614031..80a8edb3 100644 --- a/tests/iontorrent.nf.test +++ b/tests/iontorrent.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/iontorrent.nf.test.snap b/tests/iontorrent.nf.test.snap index 1527523c..020ccff2 100644 --- a/tests/iontorrent.nf.test.snap +++ b/tests/iontorrent.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_iontorrent": { "content": [ - 31, { "BARRNAP": { "barrnap": 0.9 @@ -10,44 +9,44 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -59,11 +58,11 @@ "python": "3.9.1" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "RENAME_RAW_DATA_FILES": { "sed": 4.7 @@ -76,7 +75,7 @@ "vsearch": "2.21.1" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -125,7 +124,6 @@ "input/Samplesheet_it_SE_ITS.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", @@ -142,7 +140,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -240,12 +240,12 @@ "Samplesheet_it_SE_ITS.tsv:md5,929870dea597430aaeee2a52283b427f", "multiqc_fastqc.txt:md5,3f5a64bd44351c6289d4392538132748", "multiqc_general_stats.txt:md5,ded4ce8dd8c11463dd34317fb736e2ec", - "multiqc_cutadapt.txt:md5,fc0fd8f43a96692ad13b0f3ad32c7328" + "multiqc_cutadapt.txt:md5,1409f3286d810cdc14d8e672556d9226" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T16:05:38.633176159" + "timestamp": "2025-12-15T13:58:47.616510184" } } \ No newline at end of file diff --git a/tests/multi.nf.test b/tests/multi.nf.test index 13d81de9..35ca42f9 100644 --- a/tests/multi.nf.test +++ b/tests/multi.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/multi.nf.test.snap b/tests/multi.nf.test.snap index 1fdae4af..6d1f9964 100644 --- a/tests/multi.nf.test.snap +++ b/tests/multi.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_multi": { "content": [ - 39, { "BARRNAP": { "barrnap": 0.9 @@ -13,32 +12,32 @@ "R": "4.0.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -51,7 +50,7 @@ "sed": 4.7 }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "QIIME2_BARPLOT": { "qiime2": "2024.10.1" @@ -81,7 +80,7 @@ "sed": 4.7 }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -140,7 +139,6 @@ "input/Samplesheet_multi.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", @@ -153,7 +151,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", diff --git a/tests/multiregion.nf.test b/tests/multiregion.nf.test index 21e95180..16fff290 100644 --- a/tests/multiregion.nf.test +++ b/tests/multiregion.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/multiregion.nf.test.snap b/tests/multiregion.nf.test.snap index 46403da7..3c25cc53 100644 --- a/tests/multiregion.nf.test.snap +++ b/tests/multiregion.nf.test.snap @@ -1,50 +1,49 @@ { "-profile test_multiregion": { "content": [ - 139, { "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_SPLITREGIONS": { "R": "4.2.1" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -57,16 +56,16 @@ "sed": 4.7 }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_ALL": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_PAIRWISE": { - "R": "4.3.2" + "R": "4.4.3" }, "QIIME2_ANCOM_ASV": { "qiime2": "2024.10.1" @@ -151,7 +150,7 @@ "pandas": "1.1.5" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -278,7 +277,6 @@ "input/samplesheet_multiregion.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", @@ -293,7 +291,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -605,12 +605,12 @@ "DADA2_table.tsv:md5,f14f4e62f9898e6a0755e2d1621bcc3b", "multiqc_fastqc.txt:md5,9468ae91af1a841c5e1369f11f704604", "multiqc_general_stats.txt:md5,68f2972dd2d44e499d5afac6cf8624c8", - "multiqc_cutadapt.txt:md5,2ef3cbb36c9461cddf6c3f493d2ddbd4" + "multiqc_cutadapt.txt:md5,d845cb0bde470ed3b7ba32edb2e76f83" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T16:30:49.104295926" + "timestamp": "2025-12-15T14:16:16.545092075" } } \ No newline at end of file diff --git a/tests/novaseq.nf.test b/tests/novaseq.nf.test index 873f54e1..e6668b73 100644 --- a/tests/novaseq.nf.test +++ b/tests/novaseq.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/novaseq.nf.test.snap b/tests/novaseq.nf.test.snap index 35702828..23ae540a 100644 --- a/tests/novaseq.nf.test.snap +++ b/tests/novaseq.nf.test.snap @@ -1,41 +1,40 @@ { "-profile test_novaseq": { "content": [ - 22, { "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -45,7 +44,7 @@ "pandas": "1.1.5" }, "MERGE_STATS_CODONS": { - "R": "4.3.2" + "R": "4.4.3" }, "RENAME_RAW_DATA_FILES": { "sed": 4.7 @@ -55,7 +54,7 @@ "pandas": "1.1.5" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -116,7 +115,6 @@ "input/Samplesheet_novaseq.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -127,7 +125,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", diff --git a/tests/pacbio_its.nf.test b/tests/pacbio_its.nf.test index 90d0b6e3..1fa45eb2 100644 --- a/tests/pacbio_its.nf.test +++ b/tests/pacbio_its.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/pacbio_its.nf.test.snap b/tests/pacbio_its.nf.test.snap index c6d71c13..447ef5d1 100644 --- a/tests/pacbio_its.nf.test.snap +++ b/tests/pacbio_its.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_pacbio_its": { "content": [ - 34, { "BARRNAP": { "barrnap": 0.9 @@ -10,44 +9,44 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -62,7 +61,7 @@ "ITSx": "1.1.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "RENAME_RAW_DATA_FILES": { "sed": 4.7 @@ -78,7 +77,7 @@ "vsearch": "2.21.1" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -142,7 +141,6 @@ "itsx/ITSx.args.txt", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", @@ -160,7 +158,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -263,15 +263,15 @@ "ITSx.args.txt:md5,32430f2c36d83c08273352bad45857e8", "multiqc_fastqc.txt:md5,f11936dbbf1718301ceba86050e24799", "multiqc_general_stats.txt:md5,1fef8358fe3cc974bf05e2f27fc7e250", - "multiqc_cutadapt.txt:md5,ae5e5bf06cdbfa4d8305bbcb61c3ba04", + "multiqc_cutadapt.txt:md5,160135fece18361e17bef9e8d04cf0b9", "dna.tsv:md5,061ca46725294da75acd8237390f4291", "emof.tsv:md5,c6599c76a70fe5458db56ff8c2e89a37", "event.tsv:md5,bfcf7d8ac2a3c6b48d075d6dc235f0e4" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T16:37:37.033224088" + "timestamp": "2025-12-15T14:21:57.320992755" } } \ No newline at end of file diff --git a/tests/pplace.nf.test b/tests/pplace.nf.test index 3c8671e6..3ec2810e 100644 --- a/tests/pplace.nf.test +++ b/tests/pplace.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/pplace.nf.test.snap b/tests/pplace.nf.test.snap index 51d27416..d07bc96e 100644 --- a/tests/pplace.nf.test.snap +++ b/tests/pplace.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_pplace": { "content": [ - 90, { "BARRNAP": { "barrnap": 0.9 @@ -16,44 +15,44 @@ "R": "4.0.3" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "EPANG_PLACE": { "epang": "0.3.8" @@ -100,23 +99,23 @@ "hmmer/easel": 0.48 }, "MERGE_STATS_FILTERSSU": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_ALL": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_PAIRWISE": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_BARPLOT": { "qiime2": "2024.10.1" @@ -172,13 +171,14 @@ "pandas": "1.1.5" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ "barrnap", "barrnap/ASV_seqs.ssu.fasta", "barrnap/ASV_table.ssu.tsv", + "barrnap/result.tsv", "barrnap/rrna.arc.gff", "barrnap/rrna.bac.gff", "barrnap/rrna.euk.gff", @@ -233,11 +233,12 @@ "input/Samplesheet.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -1194,12 +1195,12 @@ "descriptive_stats.tsv:md5,666279e79355dd60a0f5c7c8bb77618d", "seven_number_summary.tsv:md5,e087b59678e7e9ade87e0a7349f54e2e", "multiqc_general_stats.txt:md5,7a395be7984aaa0f9154de4abed5d824", - "multiqc_cutadapt.txt:md5,b4409890ffb9c6938433c374b50c380e" + "multiqc_cutadapt.txt:md5,3dce058d2d6c85a3cca7314ae19c5586" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T16:51:48.682806132" + "timestamp": "2025-12-15T15:48:09.755383737" } } \ No newline at end of file diff --git a/tests/qiimecustom.nf.test b/tests/qiimecustom.nf.test index c8ceddb1..316a00aa 100644 --- a/tests/qiimecustom.nf.test +++ b/tests/qiimecustom.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/qiimecustom.nf.test.snap b/tests/qiimecustom.nf.test.snap index 6d51af05..1e297063 100644 --- a/tests/qiimecustom.nf.test.snap +++ b/tests/qiimecustom.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_qiimecustom": { "content": [ - 43, { "BARRNAP": { "barrnap": 0.9 @@ -10,54 +9,54 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_CLASSIFY": { "qiime2": "2024.10.1" @@ -77,7 +76,7 @@ "pandas": "1.1.5" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -143,7 +142,6 @@ "input/Samplesheet.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", @@ -159,7 +157,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -256,12 +256,12 @@ "Samplesheet.tsv:md5,dbf8d1a2b7933dab9e5a139f33c2b1f4", "multiqc_fastqc.txt:md5,7d23984b06e4251f17e1cfce7a04aaae", "multiqc_general_stats.txt:md5,885c19ff3e53d16bfe7937d6694268d7", - "multiqc_cutadapt.txt:md5,b4409890ffb9c6938433c374b50c380e" + "multiqc_cutadapt.txt:md5,3dce058d2d6c85a3cca7314ae19c5586" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T16:56:37.7226207" + "timestamp": "2025-12-15T14:33:22.142443576" } } \ No newline at end of file diff --git a/tests/reftaxcustom.nf.test b/tests/reftaxcustom.nf.test index 4a454f02..21990346 100644 --- a/tests/reftaxcustom.nf.test +++ b/tests/reftaxcustom.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/reftaxcustom.nf.test.snap b/tests/reftaxcustom.nf.test.snap index e8ec0374..0e7e58ae 100644 --- a/tests/reftaxcustom.nf.test.snap +++ b/tests/reftaxcustom.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_reftaxcustom": { "content": [ - 48, { "BARRNAP": { "barrnap": 0.9 @@ -10,62 +9,62 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" }, "KRAKEN2_KRAKEN2": { - "kraken2": "2.1.3", + "kraken2": "2.1.6", "pigz": 2.8 }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_CLASSIFY": { "qiime2": "2024.10.1" @@ -84,7 +83,7 @@ "untar": 1.34 }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -164,7 +163,6 @@ "kraken2/ASV_tax.user.kraken2.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", @@ -180,7 +178,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -282,12 +282,12 @@ "ASV_tax.user.kraken2.tsv:md5,95c3f9daa5da8fe00159fb07d394c3ce", "multiqc_fastqc.txt:md5,7d23984b06e4251f17e1cfce7a04aaae", "multiqc_general_stats.txt:md5,885c19ff3e53d16bfe7937d6694268d7", - "multiqc_cutadapt.txt:md5,b4409890ffb9c6938433c374b50c380e" + "multiqc_cutadapt.txt:md5,3dce058d2d6c85a3cca7314ae19c5586" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T17:01:55.362760738" + "timestamp": "2025-12-15T14:37:23.358421885" } -} +} \ No newline at end of file diff --git a/tests/single.nf.test b/tests/single.nf.test index 083b9430..edc33f2e 100644 --- a/tests/single.nf.test +++ b/tests/single.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/single.nf.test.snap b/tests/single.nf.test.snap index e7e2ecaf..2c087a1b 100644 --- a/tests/single.nf.test.snap +++ b/tests/single.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_single": { "content": [ - 38, { "BARRNAP": { "barrnap": 0.9 @@ -10,51 +9,51 @@ "python": "Python 3.9.1" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "CUTADAPT_TAXONOMY": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_TAXONOMY": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -63,11 +62,11 @@ "sed": 4.7 }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "RENAME_RAW_DATA_FILES": { "sed": 4.7 @@ -77,7 +76,7 @@ "TreeSummarizedExperiment": "2.10.0" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -139,7 +138,6 @@ "input/Samplesheet.tsv", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_5_Obs_Exp.txt", @@ -155,7 +153,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -247,12 +247,12 @@ "Samplesheet.tsv:md5,dbf8d1a2b7933dab9e5a139f33c2b1f4", "multiqc_fastqc.txt:md5,75d0463a8b94a5dec14c3fb5b82169cd", "multiqc_general_stats.txt:md5,1662178e2c1ac6cb0880f95c1746ce81", - "multiqc_cutadapt.txt:md5,15ff9f378c1d8fb01fdd40b8010862d4" + "multiqc_cutadapt.txt:md5,0adee517528dc17cb0c9dfdc9858dc2c" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-12T17:05:53.962198512" + "timestamp": "2025-12-15T14:40:19.095207474" } } \ No newline at end of file diff --git a/tests/sintax.nf.test b/tests/sintax.nf.test index c7aa684e..329a3bde 100644 --- a/tests/sintax.nf.test +++ b/tests/sintax.nf.test @@ -25,8 +25,6 @@ nextflow_pipeline { assert workflow.success assertAll( { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/software_versions.yml"), // All stable path name, with a relative path diff --git a/tests/sintax.nf.test.snap b/tests/sintax.nf.test.snap index 3b90b2d0..a474ee60 100644 --- a/tests/sintax.nf.test.snap +++ b/tests/sintax.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test_sintax": { "content": [ - 80, { "BARRNAP": { "barrnap": 0.9 @@ -13,44 +12,44 @@ "R": "4.0.3" }, "CUTADAPT_BASIC": { - "cutadapt": 4.6 + "cutadapt": 5.2 }, "CUTADAPT_SUMMARY_STD": { "python": "Python 3.8.3" }, "DADA2_DENOISING": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_ERR": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_FILTNTRIM": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_MERGE": { "R": "4.1.1", "dada2": "1.22.0" }, "DADA2_QUALITY1": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_QUALITY2": { - "R": "4.3.2", - "dada2": "1.30.0", - "ShortRead": "1.60.0" + "R": "4.4.3", + "dada2": "1.34.0", + "ShortRead": "1.64.0" }, "DADA2_RMCHIMERA": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "DADA2_STATS": { - "R": "4.3.2", - "dada2": "1.30.0" + "R": "4.4.3", + "dada2": "1.34.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -69,20 +68,20 @@ "ITSx": "1.1.3" }, "MERGE_STATS_FILTERTAXA": { - "R": "4.3.2" + "R": "4.4.3" }, "MERGE_STATS_STD": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_ALL": { - "R": "4.3.2" + "R": "4.4.3" }, "METADATA_PAIRWISE": { - "R": "4.3.2" + "R": "4.4.3" }, "PHYLOSEQ": { - "R": "4.3.2", - "phyloseq": "1.46.0" + "R": "4.4.2", + "phyloseq": "1.50.0" }, "QIIME2_ALPHARAREFACTION": { "qiime2": "2024.10.1" @@ -158,7 +157,7 @@ "vsearch": "2.21.1" }, "Workflow": { - "nf-core/ampliseq": "v2.15.0" + "nf-core/ampliseq": "v2.16.0" } }, [ @@ -223,7 +222,6 @@ "itsx/ITSx.args.txt", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cutadapt_filtered_reads_plot.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Counts.txt", "multiqc/multiqc_data/cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt", @@ -241,7 +239,9 @@ "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_cutadapt.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -1492,12 +1492,12 @@ "emof.tsv:md5,c6599c76a70fe5458db56ff8c2e89a37", "event.tsv:md5,bfcf7d8ac2a3c6b48d075d6dc235f0e4", "multiqc_general_stats.txt:md5,1fef8358fe3cc974bf05e2f27fc7e250", - "multiqc_cutadapt.txt:md5,ae5e5bf06cdbfa4d8305bbcb61c3ba04" + "multiqc_cutadapt.txt:md5,160135fece18361e17bef9e8d04cf0b9" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-06-13T09:00:36.509799113" + "timestamp": "2025-12-15T16:06:57.06137956" } } \ No newline at end of file diff --git a/workflows/ampliseq.nf b/workflows/ampliseq.nf index 8e619347..29f16503 100644 --- a/workflows/ampliseq.nf +++ b/workflows/ampliseq.nf @@ -100,47 +100,47 @@ workflow AMPLISEQ { // INPUT AND VARIABLES // if (params.metadata) { - ch_metadata = Channel.fromPath("${params.metadata}", checkIfExists: true) - } else { ch_metadata = Channel.empty() } + ch_metadata = channel.fromPath("${params.metadata}", checkIfExists: true) + } else { ch_metadata = channel.empty() } if (params.classifier) { - ch_qiime_classifier = Channel.fromPath("${params.classifier}", checkIfExists: true) - } else { ch_qiime_classifier = Channel.empty() } + ch_qiime_classifier = channel.fromPath("${params.classifier}", checkIfExists: true) + } else { ch_qiime_classifier = channel.empty() } if (params.sidle_ref_tax_custom) { //custom ref taxonomy input from params.sidle_ref_tax_custom & params.sidle_ref_seq_custom & [optionallly] params.sidle_ref_aln_custom - Channel.fromPath("${params.sidle_ref_tax_custom}", checkIfExists: true) - .combine( Channel.fromPath("${params.sidle_ref_seq_custom}", checkIfExists: true) ) - .combine( params.sidle_ref_aln_custom ? Channel.fromPath("${params.sidle_ref_aln_custom}", checkIfExists: true) : Channel.of("EMPTY") ) + channel.fromPath("${params.sidle_ref_tax_custom}", checkIfExists: true) + .combine( channel.fromPath("${params.sidle_ref_seq_custom}", checkIfExists: true) ) + .combine( params.sidle_ref_aln_custom ? channel.fromPath("${params.sidle_ref_aln_custom}", checkIfExists: true) : channel.of("EMPTY") ) .set{ ch_sidle_ref_taxonomy } - ch_sidle_ref_taxonomy_tree = params.sidle_ref_tree_custom ? Channel.fromPath("${params.sidle_ref_tree_custom}", checkIfExists: true) : Channel.empty() + ch_sidle_ref_taxonomy_tree = params.sidle_ref_tree_custom ? channel.fromPath("${params.sidle_ref_tree_custom}", checkIfExists: true) : channel.empty() val_sidle_ref_taxonomy = "user" } else if (params.sidle_ref_taxonomy) { //standard ref taxonomy input from params.sidle_ref_taxonomy & conf/ref_databases.config - ch_sidle_ref_taxonomy = Channel.fromList( params.sidle_ref_databases[params.sidle_ref_taxonomy]["file"] ).map { it -> file(it) } - ch_sidle_ref_taxonomy_tree = params.sidle_ref_tree_custom ? Channel.fromPath("${params.sidle_ref_tree_custom}", checkIfExists: true) : - params.sidle_ref_databases[params.sidle_ref_taxonomy]["tree_qza"] ? Channel.fromList( params.sidle_ref_databases[params.sidle_ref_taxonomy]["tree_qza"] ).map { it -> file(it) } : Channel.empty() + ch_sidle_ref_taxonomy = channel.fromList( params.sidle_ref_databases[params.sidle_ref_taxonomy]["file"] ).map { it -> file(it) } + ch_sidle_ref_taxonomy_tree = params.sidle_ref_tree_custom ? channel.fromPath("${params.sidle_ref_tree_custom}", checkIfExists: true) : + params.sidle_ref_databases[params.sidle_ref_taxonomy]["tree_qza"] ? channel.fromList( params.sidle_ref_databases[params.sidle_ref_taxonomy]["tree_qza"] ).map { it -> file(it) } : channel.empty() val_sidle_ref_taxonomy = params.sidle_ref_taxonomy.replace('=','_').replace('.','_') } else { - ch_sidle_ref_taxonomy = Channel.empty() - ch_sidle_ref_taxonomy_tree = Channel.empty() + ch_sidle_ref_taxonomy = channel.empty() + ch_sidle_ref_taxonomy_tree = channel.empty() val_sidle_ref_taxonomy = "none" } if (params.dada_ref_tax_custom) { //custom ref taxonomy input from params.dada_ref_tax_custom & params.dada_ref_tax_custom_sp - ch_assigntax = Channel.fromPath("${params.dada_ref_tax_custom}", checkIfExists: true) + ch_assigntax = channel.fromPath("${params.dada_ref_tax_custom}", checkIfExists: true) if (params.dada_ref_tax_custom_sp) { - ch_addspecies = Channel.fromPath("${params.dada_ref_tax_custom_sp}", checkIfExists: true) - } else { ch_addspecies = Channel.empty() } - ch_dada_ref_taxonomy = Channel.empty() + ch_addspecies = channel.fromPath("${params.dada_ref_tax_custom_sp}", checkIfExists: true) + } else { ch_addspecies = channel.empty() } + ch_dada_ref_taxonomy = channel.empty() val_dada_ref_taxonomy = "user" } else if (params.dada_ref_taxonomy && !params.skip_dada_taxonomy && !params.skip_taxonomy) { //standard ref taxonomy input from params.dada_ref_taxonomy & conf/ref_databases.config - ch_dada_ref_taxonomy = params.dada_ref_databases.containsKey(params.dada_ref_taxonomy) ? Channel.fromList(params.dada_ref_databases[params.dada_ref_taxonomy]["file"]).map { it -> file(it) } : Channel.empty() + ch_dada_ref_taxonomy = params.dada_ref_databases.containsKey(params.dada_ref_taxonomy) ? channel.fromList(params.dada_ref_databases[params.dada_ref_taxonomy]["file"]).map { it -> file(it) } : channel.empty() val_dada_ref_taxonomy = params.dada_ref_taxonomy.replace('=','_').replace('.','_') } else { - ch_dada_ref_taxonomy = Channel.empty() + ch_dada_ref_taxonomy = channel.empty() val_dada_ref_taxonomy = "none" } @@ -151,45 +151,45 @@ workflow AMPLISEQ { error "--qiime_ref_tax_custom accepts a single filepath to a directory or tarball, or two filepaths separated by a comma. Please review input." } - ch_qiime_ref_taxonomy = Channel.fromPath(Arrays.asList(qiime_ref_paths), checkIfExists: true) + ch_qiime_ref_taxonomy = channel.fromPath(Arrays.asList(qiime_ref_paths), checkIfExists: true) } else { - ch_qiime_ref_taxonomy = Channel.fromPath("${params.qiime_ref_tax_custom}", checkIfExists: true) + ch_qiime_ref_taxonomy = channel.fromPath("${params.qiime_ref_tax_custom}", checkIfExists: true) } val_qiime_ref_taxonomy = "user" } else if (params.qiime_ref_taxonomy && !params.skip_taxonomy && !params.classifier) { - ch_qiime_ref_taxonomy = params.qiime_ref_databases.containsKey(params.qiime_ref_taxonomy) ? Channel.fromList(params.qiime_ref_databases[params.qiime_ref_taxonomy]["file"]).map { it -> file(it) } : Channel.empty() + ch_qiime_ref_taxonomy = params.qiime_ref_databases.containsKey(params.qiime_ref_taxonomy) ? channel.fromList(params.qiime_ref_databases[params.qiime_ref_taxonomy]["file"]).map { it -> file(it) } : channel.empty() val_qiime_ref_taxonomy = params.qiime_ref_taxonomy.replace('=','_').replace('.','_') } else { - ch_qiime_ref_taxonomy = Channel.empty() + ch_qiime_ref_taxonomy = channel.empty() val_qiime_ref_taxonomy = "none" } if (params.sintax_ref_taxonomy && !params.skip_taxonomy) { - ch_sintax_ref_taxonomy = params.sintax_ref_databases.containsKey(params.sintax_ref_taxonomy) ? Channel.fromList(params.sintax_ref_databases[params.sintax_ref_taxonomy]["file"]).map { it -> file(it) } : Channel.empty() + ch_sintax_ref_taxonomy = params.sintax_ref_databases.containsKey(params.sintax_ref_taxonomy) ? channel.fromList(params.sintax_ref_databases[params.sintax_ref_taxonomy]["file"]).map { it -> file(it) } : channel.empty() val_sintax_ref_taxonomy = params.sintax_ref_taxonomy.replace('=','_').replace('.','_') } else { - ch_sintax_ref_taxonomy = Channel.empty() + ch_sintax_ref_taxonomy = channel.empty() val_sintax_ref_taxonomy = "none" } if (params.kraken2_ref_tax_custom) { //custom ref taxonomy input from params.kraken2_ref_tax_custom - ch_kraken2_ref_taxonomy = Channel.fromPath("${params.kraken2_ref_tax_custom}", checkIfExists: true) + ch_kraken2_ref_taxonomy = channel.fromPath("${params.kraken2_ref_tax_custom}", checkIfExists: true) val_kraken2_ref_taxonomy = "user" } else if (params.kraken2_ref_taxonomy && !params.skip_taxonomy) { //standard ref taxonomy input from params.dada_ref_taxonomy & conf/ref_databases.config - ch_kraken2_ref_taxonomy = params.kraken2_ref_databases.containsKey(params.kraken2_ref_taxonomy) ? Channel.fromList(params.kraken2_ref_databases[params.kraken2_ref_taxonomy]["file"]).map { it -> file(it) } : Channel.empty() + ch_kraken2_ref_taxonomy = params.kraken2_ref_databases.containsKey(params.kraken2_ref_taxonomy) ? channel.fromList(params.kraken2_ref_databases[params.kraken2_ref_taxonomy]["file"]).map { it -> file(it) } : channel.empty() val_kraken2_ref_taxonomy = params.kraken2_ref_taxonomy.replace('=','_').replace('.','_') } else { - ch_kraken2_ref_taxonomy = Channel.empty() + ch_kraken2_ref_taxonomy = channel.empty() val_kraken2_ref_taxonomy = "none" } // report sources - ch_report_template = Channel.fromPath("${params.report_template}", checkIfExists: true) - ch_report_css = Channel.fromPath("${params.report_css}", checkIfExists: true) - ch_report_logo = Channel.fromPath("${params.report_logo}", checkIfExists: true) - ch_report_abstract = params.report_abstract ? Channel.fromPath(params.report_abstract, checkIfExists: true) : [] + ch_report_template = channel.fromPath("${params.report_template}", checkIfExists: true) + ch_report_css = channel.fromPath("${params.report_css}", checkIfExists: true) + ch_report_logo = channel.fromPath("${params.report_logo}", checkIfExists: true) + ch_report_abstract = params.report_abstract ? channel.fromPath(params.report_abstract, checkIfExists: true) : [] // Set non-params Variables @@ -245,18 +245,18 @@ workflow AMPLISEQ { run_qiime2 = false } - ch_tax_for_robject = Channel.empty() - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_tax_for_robject = channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // Create input channels // - ch_input_fasta = Channel.empty() - ch_input_reads = Channel.empty() + ch_input_fasta = channel.empty() + ch_input_reads = channel.empty() if ( params.input ) { // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ - ch_input_reads = Channel.fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) // meta: meta.sample, meta.run + ch_input_reads = channel.fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) // meta: meta.sample, meta.run .map{ meta, readfw, readrv -> meta.single_end = single_end.toBoolean() def reads = single_end ? readfw : [readfw,readrv] @@ -265,7 +265,7 @@ workflow AMPLISEQ { if ( meta.single_end && ( readfw.getSimpleName() == meta.sample+"_1" || readfw.getSimpleName() == meta.sample+"_2" ) ) { error("Entry `sampleID`+ `_1` or `_2` cannot be identical to simple name of `forwardReads`, please change `sampleID` in $params.input for sample $meta.sample") } // sample name and file name without extensions aren't identical, because rename_raw_data_files.nf would forward 2 files (1 renamed +1 input) instead of 1 in that case return [meta, reads] } } else if ( params.input_fasta ) { - ch_input_fasta = Channel.fromPath(params.input_fasta, checkIfExists: true) + ch_input_fasta = channel.fromPath(params.input_fasta, checkIfExists: true) } else if ( params.input_folder ) { PARSE_INPUT ( params.input_folder, single_end, params.multiple_sequencing_runs, params.extension ) ch_input_reads = PARSE_INPUT.out.reads @@ -279,7 +279,7 @@ workflow AMPLISEQ { if ( params.multiregion ) { // is multiple region analysis ch_input_reads - .combine( Channel.fromList(samplesheetToList(params.multiregion, "${projectDir}/assets/schema_multiregion.json")) ) + .combine( channel.fromList(samplesheetToList(params.multiregion, "${projectDir}/assets/schema_multiregion.json")) ) .map{ info, reads, multi -> def meta = info + multi return [ meta, reads ] } @@ -337,7 +337,6 @@ workflow AMPLISEQ { if (!params.skip_fastqc) { FASTQC ( RENAME_RAW_DATA_FILES.out.fastq ) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{ it -> it[1] }) - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) } // @@ -445,7 +444,7 @@ workflow AMPLISEQ { // forward results to downstream analysis if multi region ch_dada2_asv = SIDLE_WF.out.table_tsv - ch_dada2_fasta = Channel.empty() + ch_dada2_fasta = channel.empty() // Any ASV post-clustering param is not allowed: // - solved by '!params.multiregion' for vsearch_cluster, filter_ssu, min_len_asv, max_len_asv, filter_codons // - solved in 'lib/WorkflowAmpliseq.groovy': cut_its @@ -517,7 +516,7 @@ workflow AMPLISEQ { ch_versions = ch_versions.mix(BARRNAPSUMMARY.out.versions) ch_dada2_fasta = ch_unfiltered_fasta } else { - ch_barrnapsummary = Channel.empty() + ch_barrnapsummary = channel.empty() ch_dada2_fasta = ch_unfiltered_fasta } @@ -598,7 +597,7 @@ workflow AMPLISEQ { ch_versions = ch_versions.mix(DADA2_TAXONOMY_WF.out.versions) ch_tax_for_robject = ch_tax_for_robject.mix ( ch_dada2_tax.map { it -> [ "dada2", file(it) ] } ) } else { - ch_dada2_tax = Channel.empty() + ch_dada2_tax = channel.empty() } //Kraken2 @@ -612,7 +611,7 @@ workflow AMPLISEQ { ch_versions = ch_versions.mix(KRAKEN2_TAXONOMY_WF.out.versions) ch_tax_for_robject = ch_tax_for_robject.mix ( ch_kraken2_tax.map { it -> [ "kraken2", file(it) ] } ) } else { - ch_kraken2_tax = Channel.empty() + ch_kraken2_tax = channel.empty() } // SINTAX @@ -627,7 +626,7 @@ workflow AMPLISEQ { ch_versions = ch_versions.mix(SINTAX_TAXONOMY_WF.out.versions) ch_tax_for_robject = ch_tax_for_robject.mix ( ch_sintax_tax.map { it -> [ "sintax", file(it) ] } ) } else { - ch_sintax_tax = Channel.empty() + ch_sintax_tax = channel.empty() } // Phylo placement @@ -649,7 +648,7 @@ workflow AMPLISEQ { ch_pplace_tax = FORMAT_PPLACETAX ( FASTA_NEWICK_EPANG_GAPPA.out.taxonomy_per_query ).tsv ch_tax_for_robject = ch_tax_for_robject.mix ( PHYLOSEQ_INTAX_PPLACE ( ch_pplace_tax ).tsv.map { it -> [ "pplace", file(it) ] } ) } else { - ch_pplace_tax = Channel.empty() + ch_pplace_tax = channel.empty() } //QIIME2 @@ -671,7 +670,7 @@ workflow AMPLISEQ { ch_qiime2_tax = QIIME2_TAXONOMY.out.tsv ch_tax_for_robject = ch_tax_for_robject.mix ( PHYLOSEQ_INTAX_QIIME2 ( ch_qiime2_tax ).tsv.map { it -> [ "qiime2", file(it) ] } ) } else { - ch_qiime2_tax = Channel.empty() + ch_qiime2_tax = channel.empty() } // @@ -696,7 +695,7 @@ workflow AMPLISEQ { if ( params.skip_taxonomy ) { log.info "Skip taxonomy classification" val_used_taxonomy = "skipped" - ch_tax = Channel.empty() + ch_tax = channel.empty() tax_agglom_min = 1 tax_agglom_max = 2 } else if ( params.multiregion ) { @@ -726,7 +725,7 @@ workflow AMPLISEQ { } else { log.info "Use no taxonomy classification" val_used_taxonomy = "none" - ch_tax = Channel.empty() + ch_tax = channel.empty() tax_agglom_min = 1 tax_agglom_max = 2 } @@ -773,7 +772,7 @@ workflow AMPLISEQ { //Select metadata categories for diversity analysis & ancom if (params.metadata_category) { - ch_metacolumn_all = Channel.fromList(params.metadata_category.tokenize(',')) + ch_metacolumn_all = channel.fromList(params.metadata_category.tokenize(',')) METADATA_PAIRWISE ( ch_metadata ).category.set { ch_metacolumn_pairwise } ch_versions = ch_versions.mix( METADATA_PAIRWISE.out.versions ) ch_metacolumn_pairwise = ch_metacolumn_pairwise.splitCsv().flatten() @@ -789,8 +788,8 @@ workflow AMPLISEQ { ch_versions = ch_versions.mix( METADATA_PAIRWISE.out.versions ) ch_metacolumn_pairwise = ch_metacolumn_pairwise.splitCsv().flatten() } else { - ch_metacolumn_all = Channel.empty() - ch_metacolumn_pairwise = Channel.empty() + ch_metacolumn_all = channel.empty() + ch_metacolumn_pairwise = channel.empty() } //Diversity indices @@ -866,7 +865,7 @@ workflow AMPLISEQ { } else if ( run_qiime2 && params.metadata && (!params.skip_alpha_rarefaction || !params.skip_diversity_indices) ) { ch_tree_for_robject = QIIME2_DIVERSITY.out.tree_nwk } else { - ch_tree_for_robject = Channel.empty() + ch_tree_for_robject = channel.empty() } ROBJECT_WORKFLOW ( @@ -882,7 +881,25 @@ workflow AMPLISEQ { // // Collate and save software versions // - softwareVersionsToYAML(ch_versions) + def topic_versions = channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'software_versions.yml', @@ -895,25 +912,24 @@ workflow AMPLISEQ { // MODULE: MultiQC // if (!params.skip_multiqc) { - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) @@ -935,7 +951,7 @@ workflow AMPLISEQ { ch_multiqc_report_list = MULTIQC.out.report.toList() } else { - ch_multiqc_report_list = Channel.empty() + ch_multiqc_report_list = channel.empty() } //