From 0cbf5a36fa0d98051e4217aa7356ec1486a0e083 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 20 Nov 2025 09:32:12 +0000 Subject: [PATCH 1/4] Template update for nf-core/tools version 3.5.1 --- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/download_pipeline.yml | 2 +- .github/workflows/fix_linting.yml | 2 +- .github/workflows/linting.yml | 6 +-- .github/workflows/nf-test.yml | 4 +- .github/workflows/release-announcements.yml | 9 ++--- .../workflows/template-version-comment.yml | 2 +- .nf-core.yml | 2 +- .prettierignore | 2 + README.md | 4 +- modules.json | 4 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 ++++++------ nextflow.config | 2 - ro-crate-metadata.json | 14 +++---- .../utils_nfcore_deepmutscan_pipeline/main.nf | 6 +-- .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- workflows/deepmutscan.nf | 38 ++++++++++++++----- 20 files changed, 74 insertions(+), 59 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index e7c08d6..04028fa 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index e82b4c0..9e687d3 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 6d94bcb..45884ff 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -127,7 +127,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 65b1dc7..ea03315 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e6602..7a527a3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -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/nf-test.yml b/.github/workflows/nf-test.yml index e20bf6d..c98d76e 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -85,7 +85,7 @@ jobs: TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index e64cebd..431d3d4 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -15,10 +15,9 @@ jobs: 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_topics + 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 - + 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 }} @@ -27,9 +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_topics.outputs.description }} - + ${{ 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 c5988af..e8560fc 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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.nf-core.yml b/.nf-core.yml index 3251f8f..a24b80a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.4.1 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Benjamin Wehnert & Max Stammnitz diff --git a/.prettierignore b/.prettierignore index 2255e3e..dd749d4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/README.md b/README.md index a5b2e75..4e8dc52 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/deepmutscan) +[![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/deepmutscan) [![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%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.4.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.4.1) +[![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/modules.json b/modules.json index 7c159e0..efc56c9 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] } } @@ -26,7 +26,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cb..d02016a 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.31 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5c..c1158fb 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 17881d1..a88bafd 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index e242f5a..0975f17 100644 --- a/nextflow.config +++ b/nextflow.config @@ -170,8 +170,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Set AWS client to anonymous when using the default igenomes_base -aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 768ef3a..57aaf4e 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-11-11T21:50:24+00:00", - "description": "

\n \n \n \"nf-core/deepmutscan\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/deepmutscan)\n[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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.4.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/deepmutscan)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![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)\n\n## Introduction\n\n**nf-core/deepmutscan** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/deepmutscan \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/deepmutscan/usage) and the [parameter documentation](https://nf-co.re/deepmutscan/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/deepmutscan/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/deepmutscan/output).\n\n## Credits\n\nnf-core/deepmutscan was originally written by Benjamin Wehnert & Max Stammnitz.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#deepmutscan` channel](https://nfcore.slack.com/channels/deepmutscan) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\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-11-20T09:32:07+00:00", + "description": "

\n \n \n \"nf-core/deepmutscan\"\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/deepmutscan)\n[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/deepmutscan)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![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)\n\n## Introduction\n\n**nf-core/deepmutscan** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/deepmutscan \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/deepmutscan/usage) and the [parameter documentation](https://nf-co.re/deepmutscan/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/deepmutscan/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/deepmutscan/output).\n\n## Credits\n\nnf-core/deepmutscan was originally written by Benjamin Wehnert & Max Stammnitz.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#deepmutscan` channel](https://nfcore.slack.com/channels/deepmutscan) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\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" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#cacc4214-323e-45a9-ae87-e315532ca604" + "@id": "#280e9a69-af96-4e4c-80bc-ae5ef9dda531" } ], "name": "nf-core/deepmutscan" @@ -123,7 +123,7 @@ "@id": "main.nf", "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], "dateCreated": "", - "dateModified": "2025-11-11T21:50:24Z", + "dateModified": "2025-11-20T09:32:07Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -157,11 +157,11 @@ "version": "!>=25.04.0" }, { - "@id": "#cacc4214-323e-45a9-ae87-e315532ca604", + "@id": "#280e9a69-af96-4e4c-80bc-ae5ef9dda531", "@type": "TestSuite", "instance": [ { - "@id": "#c635b954-bdef-4988-90ff-319caec590b2" + "@id": "#ac596659-2e2a-421a-b5d0-69df6db85229" } ], "mainEntity": { @@ -170,7 +170,7 @@ "name": "Test suite for nf-core/deepmutscan" }, { - "@id": "#c635b954-bdef-4988-90ff-319caec590b2", + "@id": "#ac596659-2e2a-421a-b5d0-69df6db85229", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/deepmutscan", "resource": "repos/nf-core/deepmutscan/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf b/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf index f0ae451..3b2c26a 100644 --- a/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf @@ -39,7 +39,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -64,7 +64,7 @@ workflow PIPELINE_INITIALISATION { \033[0;35m nf-core/deepmutscan ${workflow.manifest.version}\033[0m -\033[2m----------------------------------------------------\033[0m- """ - after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} + 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 @@ -101,7 +101,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd2587..2f30e9a 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/workflows/deepmutscan.nf b/workflows/deepmutscan.nf index 2b6bf8d..12ac5d0 100644 --- a/workflows/deepmutscan.nf +++ b/workflows/deepmutscan.nf @@ -22,8 +22,8 @@ workflow DEEPMUTSCAN { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // MODULE: Run FastQC // @@ -36,7 +36,25 @@ workflow DEEPMUTSCAN { // // 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: 'nf_core_' + 'deepmutscan_software_' + 'mqc_' + 'versions.yml', @@ -48,24 +66,24 @@ workflow DEEPMUTSCAN { // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From a6aa7fac9c7f825705951c2376827e973a7fc0f3 Mon Sep 17 00:00:00 2001 From: BenjaminWehnert1008 Date: Sat, 7 Feb 2026 17:49:55 +0100 Subject: [PATCH 2/4] Template update for nf-core/tools version 3.1.2 --- .devcontainer/devcontainer.json | 28 ++-- .devcontainer/setup.sh | 13 -- .editorconfig | 37 +++++ .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 --------- .github/actions/nf-test/action.yml | 111 -------------- .github/workflows/awsfulltest.yml | 51 +++++-- .github/workflows/awstest.yml | 14 +- .github/workflows/ci.yml | 87 +++++++++++ .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 22 +-- .../{fix_linting.yml => fix-linting.yml} | 16 +- .github/workflows/linting.yml | 21 +-- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 144 ------------------ .github/workflows/release-announcements.yml | 41 ++++- ...mment.yml => template_version_comment.yml} | 4 +- .gitpod.yml | 10 ++ .nf-core.yml | 2 +- .pre-commit-config.yaml | 26 +--- .prettierignore | 3 - .prettierrc.yml | 5 - README.md | 10 +- assets/nf-core-deepmutscan_logo_light.png | Bin 106741 -> 106639 bytes assets/schema_input.json | 4 +- conf/base.config | 6 +- docs/images/nf-core-deepmutscan_logo_dark.png | Bin 28308 -> 28299 bytes .../images/nf-core-deepmutscan_logo_light.png | Bin 23926 -> 23882 bytes docs/output.md | 11 +- docs/usage.md | 2 +- main.nf | 5 +- modules.json | 10 +- modules/nf-core/fastqc/environment.yml | 2 - modules/nf-core/fastqc/main.nf | 20 +-- modules/nf-core/fastqc/meta.yml | 23 ++- modules/nf-core/fastqc/tests/tags.yml | 2 + modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++------- .../nf-core/multiqc/tests/main.nf.test.snap | 24 +-- modules/nf-core/multiqc/tests/tags.yml | 2 + nextflow.config | 92 ++++++----- nextflow_schema.json | 12 -- nf-test.config | 24 --- ro-crate-metadata.json | 43 ++++-- .../utils_nfcore_deepmutscan_pipeline/main.nf | 36 +---- .../utils_nextflow_pipeline/tests/tags.yml | 2 + .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- .../utils_nfcore_pipeline/tests/tags.yml | 2 + .../nf-core/utils_nfschema_plugin/main.nf | 40 +---- .../utils_nfschema_plugin/tests/main.nf.test | 56 ------- .../tests/nextflow.config | 4 +- tests/.nftignore | 12 -- tests/default.nf.test | 33 ---- tests/nextflow.config | 14 -- workflows/deepmutscan.nf | 38 ++--- 56 files changed, 483 insertions(+), 878 deletions(-) delete mode 100755 .devcontainer/setup.sh create mode 100644 .editorconfig delete mode 100644 .github/actions/get-shards/action.yml delete mode 100644 .github/actions/nf-test/action.yml create mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix_linting.yml => fix-linting.yml} (80%) delete mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template-version-comment.yml => template_version_comment.yml} (91%) create mode 100644 .gitpod.yml create mode 100644 modules/nf-core/fastqc/tests/tags.yml create mode 100644 modules/nf-core/multiqc/tests/tags.yml delete mode 100644 nf-test.config create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml delete mode 100644 tests/.nftignore delete mode 100644 tests/default.nf.test delete mode 100644 tests/nextflow.config diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 97c8c97..b290e09 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/devcontainer:latest", + "image": "nfcore/gitpod:latest", + "remoteUser": "gitpod", + "runArgs": ["--privileged"], - "remoteUser": "root", - "privileged": true, + // 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" + }, - "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" + // 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"] + } } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh deleted file mode 100755 index 2ca6343..0000000 --- a/.devcontainer/setup.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/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/deepmutscan devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6d9b74c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,37 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_size = 4 +indent_style = space + +[*.{md,yml,yaml,html,css,scss,js}] +indent_size = 2 + +# These files are edited and tested upstream in nf-core/modules +[/modules/nf-core/**] +charset = unset +end_of_line = unset +insert_final_newline = unset +trim_trailing_whitespace = unset +indent_style = unset +[/subworkflows/nf-core/**] +charset = unset +end_of_line = unset +insert_final_newline = unset +trim_trailing_whitespace = unset +indent_style = unset + +[/assets/email*] +indent_size = unset + +# ignore python and markdown +[*.{py,md}] +indent_style = unset + +# ignore ro-crate metadata files +[**/ro-crate-metadata.json] +insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index dc13efb..12dd4a0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -78,7 +78,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test in the `tests` directory. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml deleted file mode 100644 index 3408527..0000000 --- a/.github/actions/get-shards/action.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: "Get number of shards" -description: "Get the number of nf-test shards for the current CI job" -inputs: - max_shards: - description: "Maximum number of shards allowed" - required: true - paths: - description: "Component paths to test" - required: false - tags: - description: "Tags to pass as argument for nf-test --tag parameter" - required: false -outputs: - shard: - description: "Array of shard numbers" - value: ${{ steps.shards.outputs.shard }} - total_shards: - description: "Total number of shards" - value: ${{ steps.shards.outputs.total_shards }} -runs: - using: "composite" - steps: - - name: Install nf-test - uses: nf-core/setup-nf-test@v1 - with: - version: ${{ env.NFT_VER }} - - name: Get number of shards - id: shards - shell: bash - run: | - # Run nf-test with dynamic parameter - nftest_output=$(nf-test test \ - --profile +docker \ - $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ - --dry-run \ - --ci \ - --changed-since HEAD^) || { - echo "nf-test command failed with exit code $?" - echo "Full output: $nftest_output" - exit 1 - } - echo "nf-test dry-run output: $nftest_output" - - # Default values for shard and total_shards - shard="[]" - total_shards=0 - - # Check if there are related tests - if echo "$nftest_output" | grep -q 'No tests to execute'; then - echo "No related tests found." - else - # Extract the number of related tests - number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') - if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then - shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) - shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) - total_shards="$shards_to_run" - else - echo "Unexpected output format. Falling back to default values." - fi - fi - - # Write to GitHub Actions outputs - echo "shard=$shard" >> $GITHUB_OUTPUT - echo "total_shards=$total_shards" >> $GITHUB_OUTPUT - - # Debugging output - echo "Final shard array: $shard" - echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml deleted file mode 100644 index 3b9724c..0000000 --- a/.github/actions/nf-test/action.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: "nf-test Action" -description: "Runs nf-test with common setup steps" -inputs: - profile: - description: "Profile to use" - required: true - shard: - description: "Shard number for this CI job" - required: true - total_shards: - description: "Total number of test shards(NOT the total number of matrix jobs)" - required: true - paths: - description: "Test paths" - required: true - tags: - description: "Tags to pass as argument for nf-test --tag parameter" - required: false -runs: - using: "composite" - steps: - - name: Setup Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ env.NXF_VERSION }}" - - - name: Set up Python - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 - with: - python-version: "3.14" - - - name: Install nf-test - uses: nf-core/setup-nf-test@v1 - with: - version: "${{ env.NFT_VER }}" - install-pdiff: true - - - name: Setup apptainer - if: contains(inputs.profile, 'singularity') - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: contains(inputs.profile, 'singularity') - shell: bash - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Conda setup - if: contains(inputs.profile, 'conda') - uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 - with: - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge - channel-priority: strict - conda-remove-defaults: true - - - name: Run nf-test - shell: bash - env: - NFT_WORKDIR: ${{ env.NFT_WORKDIR }} - run: | - nf-test test \ - --profile=+${{ inputs.profile }} \ - $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ - --ci \ - --changed-since HEAD^ \ - --verbose \ - --tap=test.tap \ - --shard ${{ inputs.shard }}/${{ inputs.total_shards }} - - # Save the absolute path of the test.tap file to the output - echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT - - - name: Generate test summary - if: always() - shell: bash - run: | - # Add header if it doesn't exist (using a token file to track this) - if [ ! -f ".summary_header" ]; then - echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY - echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY - touch .summary_header - fi - - if [ -f test.tap ]; then - while IFS= read -r line; do - if [[ $line =~ ^ok ]]; then - test_name="${line#ok }" - # Remove the test number from the beginning - test_name="${test_name#* }" - echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY - elif [[ $line =~ ^not\ ok ]]; then - test_name="${line#not ok }" - # Remove the test number from the beginning - test_name="${test_name#* }" - echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY - fi - done < test.tap - else - echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY - fi - - - name: Clean up - if: always() - shell: bash - run: | - sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 04028fa..e47925c 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -4,23 +4,44 @@ name: nf-core AWS full size tests # It runs the -profile 'test_full' on AWS batch on: + pull_request: + branches: + - main + - master workflow_dispatch: pull_request_review: types: [submitted] - release: - types: [published] jobs: run-platform: name: Run AWS full tests - # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/deepmutscan' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' + # run only if the PR is approved by at least 2 reviewers and against the master branch or manually triggered + if: github.repository == 'nf-core/deepmutscan' && github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - - name: Set revision variable - id: revision + - name: Get PR reviews + uses: octokit/request-action@v2.x + if: github.event_name != 'workflow_dispatch' + id: check_approvals + continue-on-error: true + with: + route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews?per_page=100 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check for approvals + if: ${{ failure() && github.event_name != 'workflow_dispatch' }} + run: | + echo "No review approvals found. At least 2 approvals are required to run this action automatically." + exit 1 + + - name: Check for enough approvals (>=2) + id: test_variables + if: github.event_name != 'workflow_dispatch' run: | - echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" + JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' + CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') + test $CURRENT_APPROVALS_COUNT -ge 2 || exit 1 # At least 2 approvals are required - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 @@ -28,21 +49,21 @@ jobs: # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: - workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ vars.TOWER_COMPUTE_ENV }} - revision: ${{ steps.revision.outputs.revision }} - workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/deepmutscan/work-${{ steps.revision.outputs.revision }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/deepmutscan/work-${{ github.sha }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/deepmutscan/results-${{ steps.revision.outputs.revision }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/deepmutscan/results-${{ github.sha }}" } profiles: test_full - - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + - uses: actions/upload-artifact@v4 with: name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 9e687d3..0f92edd 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: ${{ vars.TOWER_WORKSPACE_ID }} + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} revision: ${{ github.sha }} - workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/deepmutscan/work-${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/deepmutscan/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/deepmutscan/results-test-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/deepmutscan/results-test-${{ github.sha }}" } profiles: test - - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + - uses: actions/upload-artifact@v4 with: name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c23beda --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,87 @@ +name: nf-core CI +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors +on: + push: + branches: + - dev + pull_request: + release: + types: [published] + workflow_dispatch: + +env: + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +concurrency: + group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" + cancel-in-progress: true + +jobs: + test: + name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" + # Only run on push if this is the nf-core dev branch (merged PRs) + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/deepmutscan') }}" + runs-on: ubuntu-latest + strategy: + matrix: + NXF_VER: + - "24.04.2" + - "latest-everything" + profile: + - "conda" + - "docker" + - "singularity" + test_name: + - "test" + isMaster: + - ${{ github.base_ref == 'master' }} + # Exclude conda and singularity on dev + exclude: + - isMaster: false + profile: "conda" + - isMaster: false + profile: "singularity" + steps: + - name: Check out pipeline code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Set up Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ matrix.NXF_VER }}" + + - name: Set up Apptainer + if: matrix.profile == 'singularity' + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: matrix.profile == 'singularity' + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Set up Miniconda + if: matrix.profile == 'conda' + uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 + with: + miniconda-version: "latest" + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge,bioconda + + - name: Set up Conda + if: matrix.profile == 'conda' + run: | + echo $(realpath $CONDA)/condabin >> $GITHUB_PATH + echo $(realpath python) >> $GITHUB_PATH + + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" + run: | + nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 6adb0ff..0b6b1f2 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 + - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 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 45884ff..ab06316 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,6 +12,14 @@ on: required: true default: "dev" pull_request: + types: + - opened + - edited + - synchronize + branches: + - main + - master + pull_request_target: branches: - main - master @@ -44,9 +52,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: - python-version: "3.14" + python-version: "3.12" architecture: "x64" - name: Setup Apptainer @@ -57,7 +65,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git + pip install git+https://github.com/nf-core/tools.git@dev - name: Make a cache directory for the container images run: | @@ -112,7 +120,6 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts - id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -125,10 +132,3 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi - - - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 - with: - name: nextflow_logfile.txt - path: .nextflow.log* - include-hidden-files: true diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix-linting.yml similarity index 80% rename from .github/workflows/fix_linting.yml rename to .github/workflows/fix-linting.yml index ea03315..8bda64e 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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 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@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 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@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: - python-version: "3.14" + python-version: "3.12" - 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@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 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@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 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@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 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@e8674b075228eee787fea43ef493e45ece1004c9 # v5 + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 7a527a3..dbd52d5 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,6 +3,9 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: + push: + branches: + - dev pull_request: release: types: [published] @@ -11,12 +14,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.14 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - name: Set up Python 3.12 + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: - python-version: "3.14" + python-version: "3.12" - name: Install pre-commit run: pip install pre-commit @@ -28,18 +31,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: - python-version: "3.14" + python-version: "3.12" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 + uses: pietrobolcato/action-read-yaml@1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -71,7 +74,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index e6e9bc2..0bed96d 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 + uses: dawidd6/action-download-artifact@80620a5d27ce0ae443b965134db88467fc607b43 # v7 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 + uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # 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 deleted file mode 100644 index c98d76e..0000000 --- a/.github/workflows/nf-test.yml +++ /dev/null @@ -1,144 +0,0 @@ -name: Run nf-test -on: - pull_request: - paths-ignore: - - "docs/**" - - "**/meta.yml" - - "**/*.md" - - "**/*.png" - - "**/*.svg" - release: - types: [published] - workflow_dispatch: - -# Cancel if a newer run is started -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.3" - NFT_WORKDIR: "~" - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -jobs: - nf-test-changes: - name: nf-test-changes - runs-on: # use self-hosted runners - - runs-on=${{ github.run_id }}-nf-test-changes - - runner=4cpu-linux-x64 - outputs: - shard: ${{ steps.set-shards.outputs.shard }} - total_shards: ${{ steps.set-shards.outputs.total_shards }} - steps: - - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner - run: | - ls -la ./ - rm -rf ./* || true - rm -rf ./.??* || true - ls -la ./ - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - with: - fetch-depth: 0 - - - name: get number of shards - id: set-shards - uses: ./.github/actions/get-shards - env: - NFT_VER: ${{ env.NFT_VER }} - with: - max_shards: 7 - - - name: debug - run: | - echo ${{ steps.set-shards.outputs.shard }} - echo ${{ steps.set-shards.outputs.total_shards }} - - nf-test: - name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" - needs: [nf-test-changes] - if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} - runs-on: # use self-hosted runners - - runs-on=${{ github.run_id }}-nf-test - - runner=4cpu-linux-x64 - strategy: - fail-fast: false - matrix: - shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} - profile: [conda, docker, singularity] - isMain: - - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} - # Exclude conda and singularity on dev - exclude: - - isMain: false - profile: "conda" - - isMain: false - profile: "singularity" - NXF_VER: - - "25.04.0" - - "latest-everything" - env: - NXF_ANSI_LOG: false - TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} - - steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - with: - fetch-depth: 0 - - - name: Run nf-test - id: run_nf_test - uses: ./.github/actions/nf-test - 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 }} - total_shards: ${{ env.TOTAL_SHARDS }} - - - name: Report test status - if: ${{ always() }} - run: | - if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then - echo "::error::Test with ${{ matrix.NXF_VER }} failed" - # Add to workflow summary - echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY - if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then - echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." - fi - if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then - exit 1 - fi - fi - - confirm-pass: - needs: [nf-test] - if: always() - runs-on: # use self-hosted runners - - runs-on=${{ github.run_id }}-confirm-pass - - runner=2cpu-linux-x64 - steps: - - name: One or more tests failed (excluding latest-everything) - if: ${{ contains(needs.*.result, 'failure') }} - run: exit 1 - - - name: One or more tests cancelled - if: ${{ contains(needs.*.result, 'cancelled') }} - run: exit 1 - - - name: All tests ok - if: ${{ contains(needs.*.result, 'success') }} - run: exit 0 - - - name: debug-print - if: always() - run: | - echo "::group::DEBUG: `needs` Contents" - echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" - echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" - echo "::endgroup::" diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 431d3d4..450b1d5 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -14,10 +14,6 @@ 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 }} @@ -26,15 +22,48 @@ 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 + send-tweet: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + with: + python-version: "3.10" + - name: Install dependencies + run: pip install tweepy==4.14.0 + - name: Send tweet + shell: python + run: | + import os + import tweepy + + client = tweepy.Client( + access_token=os.getenv("TWITTER_ACCESS_TOKEN"), + access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"), + consumer_key=os.getenv("TWITTER_CONSUMER_KEY"), + consumer_secret=os.getenv("TWITTER_CONSUMER_SECRET"), + ) + tweet = os.getenv("TWEET") + client.create_tweet(text=tweet) + env: + TWEET: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + + Please see the changelog: ${{ github.event.release.html_url }} + TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_KEY }} + TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }} + TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} + TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} + bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 + - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template_version_comment.yml similarity index 91% rename from .github/workflows/template-version-comment.yml rename to .github/workflows/template_version_comment.yml index e8560fc..537529b 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template_version_comment.yml @@ -9,12 +9,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 + uses: nichmor/minimal-read-yaml@v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..83599f6 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,10 @@ +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 a24b80a..f23f386 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.5.1 +nf_core_version: 3.1.2 repository_type: pipeline template: author: Benjamin Wehnert & Max Stammnitz diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d06777a..9e9f0e1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,24 +4,10 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.6.2 - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 + - prettier@3.2.5 + + - repo: https://github.com/editorconfig-checker/editorconfig-checker.python + rev: "3.0.3" hooks: - - id: trailing-whitespace - args: [--markdown-linebreak-ext=md] - exclude: | - (?x)^( - .*ro-crate-metadata.json$| - modules/nf-core/.*| - subworkflows/nf-core/.*| - .*\.snap$ - )$ - - id: end-of-file-fixer - exclude: | - (?x)^( - .*ro-crate-metadata.json$| - modules/nf-core/.*| - subworkflows/nf-core/.*| - .*\.snap$ - )$ + - id: editorconfig-checker + alias: ec diff --git a/.prettierignore b/.prettierignore index dd749d4..edd29f0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,7 +10,4 @@ testing/ testing* *.pyc bin/ -.nf-test/ ro-crate-metadata.json -modules/nf-core/ -subworkflows/nf-core/ diff --git a/.prettierrc.yml b/.prettierrc.yml index 07dbd8b..c81f9a7 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1,6 +1 @@ printWidth: 120 -tabWidth: 4 -overrides: - - files: "*.{md,yml,yaml,html,css,scss,js,cff}" - options: - tabWidth: 2 diff --git a/README.md b/README.md index 4e8dc52..3898d62 100644 --- a/README.md +++ b/README.md @@ -5,19 +5,17 @@ -[![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/deepmutscan) -[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/ci.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%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) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) [![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/) [![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/deepmutscan) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![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) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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) ## Introduction @@ -30,7 +28,7 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/contributing/design_guidelines#examples for examples. --> 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/assets/nf-core-deepmutscan_logo_light.png b/assets/nf-core-deepmutscan_logo_light.png index d6c8e55be2c4776dd4e422bec64f95bd4fc97739..9824bb2d087a68cc4b3801ded12e74fee21dab13 100644 GIT binary patch delta 47419 zcmcG$dpOkV+crLHRamQRDj_9l*;PX{Hf38%8JmOLDQ^t^oVV%D!D%@7pxOMTMGCRQQ^)>g>GEMg#JK}CDuV~05V|CuI@Bgw}V$1Fa zr;lt=Epga^t1TSQ9+77yNh$c+S&tNtPqQPJwwFx?)luzO_W0=HKcj{4_EV|0Ot>+PUVj&sS%PhYouoFfhGW`$df??x%NZ!U=p_nFdc&%qsKoE9Ne zAbWO57FqhW%43{%eeo7_oNn#P1j@A%OguO_-y0-s>2MupGOa-rG;v(-fXkxszGOV;xB7A0-Kgoi-a1c=wcshtB$xm7Fz{rX2gmHJSu~OU zIKzQ;iY!L$&lkLjw(&(T9o4A4$V5r}=~v%>Bs5?m%NWlWe)eFjA1qs9^Q!yzK5?0R ztmjv#rxIxU>5tUUS1R0(O4A0F4zAwlo&TyZu%WK&XIsVHD{OqylISlelsiRr5&rY9 zpCr$_)<(X0DY%rxM)^HF6{qZ}@d}F{F9q)`ZAHopR!+NqInXe!Fpbped1UD0yVyCE z?Iv;y;t%CiIGfVA+saFmEUQ*9L1@&$9hS@KUn<(YUeR6I-U`dd%T~xVSEmg$qiMcj2nsED$tuge9s>5(B1j8Ebc$oXE4U)~FE*gvL< zI+%L>i%kpxu|u+MH2j=DHd5!Y>Ey24tok{o5)1F2<|vi+mAsHxG3E1~x3Q5I;#*|u zy6suvi!S@~KD~2>FYe&`Lh6chdcBO!=XJuqUw!}NlkmT9p3HFK(Rt@$UJI@#_{0yT zB)unyIaQiO-WyjfiJ5aj$Zd%lePV?vKD~)0Nd400>D4zE#o-N5$>JM~|9z3&x9f}r zbB5@Fd?L5l{p4Txdvq}o%+JTO)^fsbV>(i(4XIzrXFenrhpCN+88TLW4xFr?t-T-n z2VCHFy3Kzs1<_^Rjgh_4=A=(WO66(!E#AWK1V>WkE?|Cc!N$Eoe`CG75C(<@cz3yA~o9|Py*K9Gj zRm=CmP0#}ZMLb+fdR_MW7Eyj`jch4ZMM&lY`KpNzHCrAM9d1gjU4?QO8^$%-pTE`Q zFYPNM)zKQ5w3jmi+g2G1>@2SGC{qvP5{#P|udUx3A9Bozq-$Pl!!$_@mb42#Rh2!V zKTcrGD`h^K*ijTZgWg{8l5IN}^E-48_v$Jx8eOwe%gM?@T+jE; zZy~sib1jBqd__F+h1kosSPb!ZQKP|)*hrBlGAqub+@IfP>xbvIc}f zxT+p}43%8;o5B!tniotAuT!-CUiU93b#KS(M&fH(K~EZ&on%t(3t$a)5-Iv^0EOCm^SZnxLfN+8;l)s?N7IUCOH4H=)jQ>qLsvd1#5-3>q13ARCa%4+rZ#A^3<3{NEdEX59Ea=JB2z-2U6!sp zKV3evx*z58!cMYzRI}w+IeL)6;t_at^niprsjn5{m1HGR9b_k@Y(_kze|p)wis!Ge zd}`e-CX0PcWMU{L&_;4Xu?Wx0q)#3sG`wXU*qit{7v8`vWscUY)t;1l2;FiygyhW^ zXUx}i1PEg-bk!odKAoEmSdJTvEIt4WK5O9SgY#zza2T3FdB!LL_u%WIMLZtTN)A$4teA(Chq%fY1qDuoY4Z$CDtT1Ul}zD2&zWbE z8iXl>G4f}c7|ZkAdWDul#>+zu-itLz1(@7kZu~kFQ$(r2MOY+< z-XXIjOsYd8A{K6H`+t0K>bs$?y^*eNRhSb=zlPt*t+x~LP{9m(r@m?F{Lb!q*t5M} zM+y_Py!~O5NlPSlBd$`t<#H0aX#2_)hXje@=?GeHi7RcPMQdaqWKKp<6)VE!(rkzB zv~4dkU(BudhszP%)P2chwTCYQs#S}+LXHl6Z+O-i7VZ`o-MjL=fiG*|HWYv>^h(yX zaF#PUo8{f#v2o+Z-rJ`1?tKu(tfGPfSI=ZxyhKDOFDrpj+0Kf&LHSyXH*z1_pLV7P zpXJ;2i($YIds(9~Dbuo0kG_^0#2A9x0feKBp*6CCHK;qhl6&D{(d|E^i9y@h#;DS) zfS*6U?w6L5(vjOS5PIliY4{w+n5B^9a&{*p{lN)60`;G_cP-*jgL6V&?dC&94 zXk0J4{S>6%2iD!R@OwhK+%O_edwcVv9V#>(v)WV4e%wL~hQAQ9r+Ul&Uqf1T02?4e zetbV?e3aQpBn4e6mL@D9X~|e?fDK*qB^#3WNRnnO4c)#`TPA(R>+EqjGOufdq6E}tIa2tf6Z}Cj^OD%au z3*PzKO@r!2;~(gl{2eP@!#B0J7nsBqKkc47-@iCrcLiedbwPm`Df}Ky{tH)_+^;Sx zW;uepSNn8okQ6q?_^Nw=FztV+?K8JGv;P?`qK495j;3Ao@EH9S>#yZ%ERPbkmu$Yx zT?xeu8skYeh|GBvajUF#UQ|v@mT$GTwDCuElr=e$CEw~}08W1OEIW4=%+27kGD_0N%Mx4g#P zo1WjrI_v1`(*O_Ul;otnUb%>j78AvK-6v}9#2pUYs(smb*_p{x6qJx-XsU_+x&eKq z&H)>47de_`WM*Z#Zt;3lG!b+IedQ-U>0=vg@56<;K1a@eB&a^34Wp zs)oA*UzH3F39?2Sdz}%cEWr&kc^WX+b%)n0_4x0FGGpFOB-cRPj;OlfS3-l4!4g}8 zy8TWtf1Jvr+A{Aq@q4}KlV`Cs|4TW#I!111xUpnPj`@vo?RJ7~qNiSR*kDSvZ&EtalPrg2UShS;=) zsJaTGLy{@64{`^-SyNM6%pR{DX3@p&Xzsd*gOoc;6zg(t>8RMpn2l4CQ{xO1x!yQ^rA{qdZfrg|rjcI%ahiuHbKdCl z5rO2gJ0_xSb~!{eQ4T)FW4ebtz2iXRJJKhUxUuK$?b-es_pWnFFZGR1UBvQ;;ntWz z!$68D^%T>QB}gK6<`;~!b2|bDr%p>Yuiz??BtjaYF)kjQ;7d>GgU+6WXe%r6-hWK%s(y zT1%$3uUFuG`^fBRL-cDsbEXY9_RIIM5T@`zZSLu4{M<8QvH4EX*AMn5 zewHDuJ|N58(`#3)=HIZlmm}#3S7u@dd@duUz26UW&SDe986T!N!@9NzH+HPljA`CQ-(;`sD~!i8MD~obg@F?5!q; z7%YVB-CqKM^1*LmPn@y{27`%qu&+2N;=zy^+e}P(|0(RdhSdr7imCQcHusUtSZ_j- zYHV3s3hMP#o6?knB+^{05YO^VjuxX8$|-VS4bH|jKL~U%U+U;PmOMkOEk2MMZaQ!_ zT@v=GjDEo>VyX046HAF@A15$zVXzq5)amqoN4{W%jn{A9D7pM8;%qiMFG1oIf!D2d zdBn0g8n@N4mS07m^!IjJxm)ezTV%knCWY6Mvy?e!ut?FqUs=EQR`aWrvL1T(OGnoY zE9I~AxFAL^pRAU66Dn&NAU{a5|B%$iIv}oa#f{mo*;3+YKVR2FzSjZ}GVJZNYo|${ z8?(jXE8k+knwjm}ZIwKsjYcJEX0tfq^@hgAtA#yJZbrPDT~@`OB=?UJ#lm=h++;;R zZ&o9ABKPOKuo(aJ8uC>! zNx6MTlV*dZCTflLwU_JW8}>5x(XfNN|F)1Ue=dd&X zXj=Ef+hKu8m#Y7swZ%%)_&3XZa~E7hZh_HkpgDe}JGH{m1f?MHeaSO3!O zUuD1$*QBna2Qg>uJn%dL+u@p3Zy zbyvlzy*9RR8#R zk!^=}MNGZUZ##^^P=j52d74znSOso<8o9#zQe-sr0nG~WIkkK?>{)VOOGMHIr-d}! z!ev&iz`Q%1GH-9sGVR!ZwO^SPL};ijZlHV<&`m@}zk(*Qb<79>3LlK2@_j=)H>YX& zNP%d5W^2jo_R64h~ALmq71Eo zuBaXv$(iKxH?=MktmIz&61$hPhp=i+@|Fi0mG)dLzPWcQLOh(ebx3eXw07OJg6~+L zL{59AV-5cRebNLzY9pBg+mko({Q<~QPw%lKW6z0<)^KB=3+bw-mVd@=nNxyFBL6p! zADkB66ym=8<84i)^akTWb+dsI)kL-#5=EiZDdM|NWSrGa?|0H{X@JOV&8_f(r8Csa z>cn^@-<6a4NmuUF%6G6>s-&&DLbOS-mlWHTiqMIl8;QG~Hoj}f>d9_ zKd3BZV#>Xjan<#~ol%5_7P`^lE9$RKTc!^^F<`8Ipl6dowi{3LK3uqW?;(g8d6(OkcX{3j3@o}9*WCbi8rahqJ41s{!4m} zC3xNr?Z3bAr|Zrm(=NnsA6|L>r85CLQYG;Q!xGfX8nlPWN3;E~x-`Bhv3``B^I~FY zhwP-E#x~wzm))r^UvzUGDRUY%TcR_7fTD%`1yZg_6sG&c+i7zD>I9GP_VMx4-*WOg zNWNX$=Z;_r^4##y=Bbx5=a?m)$emEzB8HS%sR_U z-{w1Y+YbX{?>^E>K9Qu9(tTl8vxSf#VRVM{RopJ2ae80k=eIIrPmhT(?!62fHxPBG z;R`F)RTUIGm%fGQI2oaX>eDF38q~4wmTMHo2fW}3)M-W69KB7kPrIT0Dw&9K!|2;G z+lbtjg*(1Ad^~q0TjEXYyK;lz{i}=R28_F;a7V09Mn7coiLB6!n&<~}+X)DurJM91 zvMjX0xZ_wOGuAX$yfy%VH#U)ung7Up7F02q*0A6cHdYTF+fMU5VLsfY8uJH_{nm zF7Z8Q-co*BgV}GVNdQzXO6}#*+(Lgj+PHW@I>V~`S!A|+NhAMr`e=2RjVB@L_7^VOeCe{iz5Ii4 z`*8yqIVjbpYc%1{g7IzKm5>6G=J7^GmJ8_XNm>_uub7Q%s4Zm4jDcvla&COLU4RZ_ zmTeZ*5|Sj2pnoN-+9c0RdnU_UWIg*@o~xRz$iWi1dwe558&ro)D8(4IELy|T9mc2o zYCsJpKn)J%MFSh*)>n~jx`uXwYOr$5wRbf#(~SY;UH~=ox=dFzOm!jN$so7Jx^^|FBRIn3Cp7~%X+WM+1 z^s6Al7!gypr-<5|>qi?um@6(vj~vK1mlGPidtE-@6m+hCC<^XS;_Q%w#^X;uu@{_x zv}W}0(3V;6(N1e7BvHgk-aq}U+KvoTATlpwgS*`E8|CDrMxrqM%QlioeXL-~-!8$I zyr;b!b4;X!7*08xKcMALpWLbt-$2>=@h`mM6s&(-LMrj3zeZzIG^OSvxt|Y2xlp_B z+ov+zf)+L*u??YNL&+3q|9|EX$9p_%AAib=R9)3u-y$|vD?%4AxEQq;{7y*EEjkxO@m!L^S?{Ja@SlP9oR67@5ui(5bY})JZvb_J5c>auJa~XF9pfmQKUYBH_CS%s8hTq;1 zU^=d0ci}e8xT1GLF4Mc;0s?NN=bH0wsI89J5-qB5lIP-c5R|P;3dV<_St&uzpFO*n zEHw4DEHDC{=*f_HQ|Fm{_d$5U<)DDnXWW%s0|ub|B|R-Gia;sm5M!1P5h6W6*9kzO z&_vb`1H>VDMhRDW5T7pPvX`@&*a`Bl7jEHOIU3pbJ5t$`VrpZM+dCoH;1X(0QS$qE zs2%E;K^M!-1DB8|7Kaoa+|TKec;nMCxsf;wwU2jvl(BGjm=g{t&0+~`a1p_xNh9=( zxyqKT^!sy12*%I4Im_M+BS=Hvu97mD>gK6;<&z$`1xH*&z&QHIR(RD~a@{E=C!cCr z7Hzh4L1c8T^z=R`zI8sp)aH>Yr$ot615fhx#QIPeXT!RS{;CX^MN>P zVUa`U9$vqRp$aByS59ZMSA%fDGR60rN#u^%Wf?5&o3L3eA^HA8XSJ3}*R2OI)I4d^ z&_8JnuL=r+DPrqU>ARdrS({BRSICUX=55DBCsGomO=r}x^1h1>W=ZPp<^1%13#F{K zFUag$Kl8jMbbI;8Mup}36n>bIwzCEmh(sL~9Sv1~n#1E8Tgw$31!PFMAO4CqGQyfx z@jW@bwWunN)^M0HYX{-aM8^weCp}ruyOfJ_`M(g7#K2Vwl#{*0zA(9Tbe{RrX&cFsz3o5Z z*5<^{!FlNR^8q-<*1AU2-3|@9~ zUX_nbBRcq90RYF}cdV5`nK5JYB|(qVRpoyg0~kt7cT9#7_3~#w>0ZJjMD|Z3Br|P^th!?4c(S&7Vb~2J*W( zJEgpqeL#5}M=x6GA}tNj<9gs-SM8E#M(lht);p0{2jaiWV)G7ezhe{1%gfl_Y@~Jp zchVxt0x%L*UK%vNfV5Y)b5&2>o0B9oBv6iZ1nA(EDG<=r{ODN&B+%YI*dj~VCFPo{ z84<{YfAUNqk(;5nv1>i-W>;*(>dL6!Wy{@|=m5mEmlmOy#a;ki+m`KHKqiyxCTe3# zDEw!g*YzRYMxH^N0{!{Z9uMWd?6n0j_CMXX(>9^;Ec)Tx5Cr8xs!xboSNW;DSrlRQ z81|%pX_U+n44S~}l`_?YisAp^(bQ%XO7xz0zhFq<3JMXtxf}s(1=FgFh>b3UXJ)^f znKM~$le3Qk9)&J&!bC?okyO4!t~@Fzs0Rw<2{XN{T_%giurQh;{%StdQjA-8o~s%m zmtx#?xbBzq$*a)AtW%0PC&@>-PzI-lbz2rqv66htdT3VpigIK9 zthWv|vqp6F^`mW(@!hF^swO^#kbFTonaCgU4bPw<`GZqNN0?eEo|CEUpJDKC(03(J zx{sHMcOAb$NrQ&TantG!)YYjE(A(Tlh_}Y(_W4}0!nfXl^^1WWC?N};sxJIedWSxF z2)hb8$gby{ojcBf^gWi8yXYq}YC+tkXk-`KiqsO%J4rT=m}Ow)gfeyS$ousjCwbpZ z)T|HgQ{MR+2doAJ%!H1Bh90NV=2L2kpW{qzcBbi>r9zwi8W>6d?j-D#nisAWQnntX z9g8e)B4A(v<*vB=q-Nbh;l$ENV(#Ue6f{0vv-DJ6SV%Ve06caWZb8h5fn0O=yP6Nf z5#;7`>ebCC4Luk#)xDvwoZsR?u&&IXnoMK=H1tf)IY?EZbpHDIC-8Z~D(DGI=r35)b9J zjcD|l+nNV2U{3;?0iDFg4?oHju$VO*s-Ym;ZW#6H0OPd=F!LDST^%O5Y?&|d#!g8< zz1S}laDQ~el)T~;0AS@EvfKeq5i5xIxW`G^No2H*yApvJ)W=H&>;UbKNdq|0!IK`` zbgff8*A%FxOLg>dS~yX$==3ML{TWg0RMxuJx&6)b6{uo6iFzUk>Tzf-RC*`o#dW@wt)(sp}ah0)C&4ZeKBFcEZ0v@hKw?Gp8bW z7D$%TeS6|cWZ#TPby1MWXtSx!a@_zeqrKyWrQENtKWkC}X#{?AntL9%d5tl5Z4^3Nv=j@d}wJtcQxbB$ulO^x3zj)??&2;XTlZDc&)M9^UL zTV*z&iI;l(%UZoLTT;QYdOS1^BH~j#K9Ya*hW<^+;Ax8}8pRu)@B-JScYcR^ki2=PVwsX{Cal#AK!ZWW zsVu#XQXTR@Dd;^4Eg4T#Vo-RS*k`45XT;Hstnl9P(xiE1nha* zG5IVvT3flh0O+_U?yi~KdgOKZLFzHjM+SY*a+m;4|tyCfn3QSOCD!Tk#{ z3DN!R{J3No_VoKJhT7@4a`W{AA z;DXQy)%~a~UVTGP0o%<*5W_(naP;$GZw$Ceo>Jm4A_jc(AXU+oKmkH|z2yGH9w!Z$ zc2a4p`4pC|&-N!^y0}TM;6$6~-5}S+H_D-`fW|<~^4C0OM15ywj(G-xm0Mq3^bhp& zEwHALBO&@|pg-@w3iqKg(UlZKTQ+KgaS=o>Ox=EiZ(3=96XG5H{9a#PkJG&rvf=(HEEp$6KOK&|2*?k9ukkq$tH!8pHB%W8{TcsPf{P4NOwbVEA@elHNw;H$kwEdiYzWmngK=is}U~cZgFYKjO*) z>*Um;k%p5cGY29&d<_sDMu;dF=s*x2*t_Frkm$_=9EVJN6iF5aQ4qqLFj%}29K0{9!g#_GCQiwlk zo&iCY9?}ltFVOQiOAG}6g|+^g+`q9SAYly={|?t+SxEKBQQ*UT^ywb&MJ9791n{2MW82Pw`dKDcri2w&K(OZOS40D(f4+LKgfxOc5xq; zP~3C3H0#eXhhbr^+S*z(Ur|Jxdf$BSeHUM2>muuQ<&jXTl9d!})itu*L%qM&_gyYN z@b|~CnDbyP$yRr^y+LWse`1QUx1Uns`jjnloh6&M+9jZ_7KJ}TDE9fsP^gxt=yqxI zaoFd8eevH9VWKU^;lb_%^j)~d-uJ1~n|R7DDWcw>>y{4fZhab!~cfF!WLFx=^{?i(1wYaIj0@khziK}`e85vDyUl?r25%&Yeo2h zcO;|d@D?(G_d#|juSAy$J}GW&5+amzWvLc_)I}j*gL+uBvXX0_5z12{exnDFDcd}4 z+Wwpbke}^YZVpF1A9RHZe|2p^pgq?*d*+J$XH~n~*K;EJnptkRmMhYw8-QJ=(gUh` zj;*o*8k)X~uv5Br|pr!0oEq%T%(QGG}m&9!ohok;HYW zS>WkKQnP6}2RJ4e+HvMHZY)R#y>onlzf#fgyM|yV5b`UECtT?PcV)&v$h}LO-tUXR zn4Vc~gKV|i-9EcKL+txq_(-=}uX|x`uz!^P+jW`VxCDrc)2_Xe%Zf)Dtv5owTO3`v zTpgy)sr6`007KphQOBrsC+n)9`7MZ6`toEo{}N`bAm zBVx&#^=P~pN@fE_{}@wPvB+xYhV+Zj?mG0&uipM#UA8tgz;#S+$UkQJI1+0d#+y|X z^s$gFCe>|pDH9QJ;ceU~yD7?nm`jODEqQ+Qz4h~>x(VB{n5rA>OSZqbHKH z{yci)K!yjIW^5I=@CpQSX>$LL0;FImk+NTU_AEU0uUP4~GRDRj%q+v+er*a?liq6S z4!%k2`{9)t_*7ejRM*eqD%B*!xfF?gYlG&iSk7uv8KasK^TVbH2j;Zcq+gH#Ktci~+kP7_W%+ioQ;; zzA$tO;kAtA))*d)l(Uw@}Dt7{6 zd1}q3WMph?-6$TSG9=Iv{q}(m(%}xFg&oDJi7IA#yYVS+b1B-~mHimLdGbsHNP_o; zSW)Jpj?n?lO^?M_JI&+T%J9UV>D6zu9AVweE4+&oP9~GmC=ww_KTYk&=?C|AQkA9S|8Nz?xJYQ60mhOn)WUG`+tZ z4jp0I*(RJ-oaL^J78Io|zATSU@3-g1KKTcbWrsJec}nv~rbj4^b@wJdUT+?hQXf!8N`h=8qg!Nnx>Oj| z$zxB}@;Bou&%|AOQW@l5^$d5@_1A{{Mnh#~yCRnn6@YkiFyqo=r`GI!^O`Lc#3)?l z?!C3qCz$~xZ`U;+GcB{9i>suq*#o0Rh0T24zU@@4rijWeCw~;J8e6L z+Vl5bx+Az40z2qqYxW+qw*l~FH@^nW>AIXI;b19>=8km@rq zT{z%w8+)@AJD>urN8?k@&UK7pU{9rEz*DN$IwifCdr{=hBL1e3A`F~`?sMO2j&YJ zfU@Du!LBI|H`**?$FMXb@pH=a%-&DuI5hq|QC))ygrz{@4LHmTkBR7lhW0_$vbc3L zXE1!SRp+N4ktA(e7M2{ECh=w;Ryd^>OsY3@2e$5}2Q+`@X$Z{>p8EJ{2}X)= z9H~2iO3bEk1c!(BaM;|HNDTj+y}dDWQ7`1UXfPdO)eokS59gS`-w#p~%xmvbjwu%H zwA&RxmM*v4|pGa_#uNa;6O#r3GXy*mLc#uZ_ zlsaWr%U6O3P1cM(6#AgNc%lSolfj=L?^lowu~QdwhJidefzQZyeD|UnxT1q_j^=tN znRgYlKx4llJJV$6L;|=flNJ2$c1;yNGqy}B{# z)4z=fUcwPkg-0~)>1Q42Pkk!w<;OZE)o~F-S}^+DqXl-E6P7y>#$je&W&& zFh}HAF>T+oi>NZKW{*`kDqJJYUROfH={S?I2iJvoDuF)_TM%#F5Jy0UZpiDrB)mja z2T#I7FnJ3S<|lfMo9VmMIF~Cz&^Z5Q88;)e?CX0pH!qx{MeV_s#V~@gaeMh}VL|PY zIFm)S$_+^w1n7P5je63Nr;2j>e0xXz#VbMrUMcwz8XTC~xQHUkENopU$(wz^rE-#( z8C1(5ZI)w`%F!jnAl|tQsJxd&rF661aVIaHK3zL_D}@!Fhh1vuQ7Col6*mqmNe#bG zTRp?H2DPzyd3o7EI)L@whr1>*0MKh-XoVD-`2e_Dk%uqG7UF}iZG#c#dHW9p@HXoN zrr*kPh6*&wJ(+3M`#FNJ`jB#f+@JQYeE9`sJ|83c^ZT($n(WI+!zLCZgvZb5f0Ey1 zMT0(&I0wBQ`Z^1&dyKT(@1-?$C zZ0!pr8T~nLWf)kw3r}G&-S%@fL}t4M;6N8LMY;`7F(;IYK*XtSVXZnc!O1oOPTMrq z)+^wIAG9g zS8r8Cr5|Yj0mf5vWT{jU`lCm*kz>q!Tm%6dedov3z)`NW+0spNObLv0{7ThYJQuxP zdmA3ieT93~b#sPTtm(a+AlVlOGtKd?@_%slL;tk6R{KuGb#6>53t6+Fug63;P-3J< zr{(q62J!`bze_FUR&jeMJzhkbnVxd!O&i((3&{Z|WSZ`(OScOZ*Wrf^Ce01!s_x=& z#pQ!|+7CA>-c0h4C+f8-hVa6avht3WeLf6z<8)?n#ao%_?~I_lOdaymzKdTW4>tpk z@qsyk-Vh5Yk*n1H^_73&iLuHYm@wDSRw>03Iew|dIL#BR@NTQIchpgxF=Gpa#^Ubf z#zG1P;UcWD?Je7Izh>n&&LiingiF1bWYNn@Aab&au@Lyyih_^7mKGG8i0XpsQ>f_r z%q6FSAeVA<=vdrLLaJ8X#S6gRaQLUYvoRvr%* zz;Zgn@CYK?fm=U7A0Ff8fUp%Hs=P(H?JEMCX3gY-YOBz)*ah|@E!So-263(=V>0@E z<#-JrX_hh00s0M~cE%RzS*Pogi*A?q@7g@Uf|Ox%#WyJ!*aTF)dcRu3KiM%kc>8y$ z5}=Pc59ZpyM2&a|XqJ$Y^SaTIS-N-)?}WH#9v4rXkmL`w41mJFo0AI3h{IXmoBM0@qj~q28e)W*+@2@?3AD{u z;0#g_kRY?FAnF6=IKbwJI(7tNif%f%JXqVy8!km<0^~her zDv{DqR4^_qJLx(gllekug^{b;8Ny4;a6$$hMl4^#rW@WYoN;Ml8J`8O=|>0v5YhG5 zb`qvM4rWo_;~Im$*yI@xqH^6Q9~A;pS~2nY`-r{0A^4Ye=&ZV=&cHlUn=$JRbD2`lFR%V2slEXt0Wa2?y-5AhQpg^{wU~#x1nKb(!wXewSbY z4`S1rWg7aRbpZA9BR$1B%l{mGQbSZP=+rWP!)r6`sQ03kmTOGF#9x`i5_I5Qt(U5S zW+1k`^K7Me8Wtp?)Qyr?>V?V)#S&7U6zhKB(M zxF7BSlV2DpVxz7-pQs_QVbSfIkWO{8u@hK%0#Dr09)FwSZ!27D*d(W+epfRVW|fa7 zxd6iK(fm(b7&B?yxxDDFN@(DRh<8-d-qTlLof2SPj@N$C$JU9pCw*N7_o5;JMkpHH z6m)xQfoq{;Jq-0N6s<0mF;0}B+ZzZxEQ=6hL8j2aQ50v32-jdhIr-CjaNoWiF#lL`*8q$pp}xph z^J5eRRRgSN?-UKs#qm>oZEDvJB-DW4^;tmy0lMfU?a^kVDla&2NTZBQulhhE1ygYe z?A^4v4cOkKAmzc_9^|paXew@@tDqnS{9hZOIEOVgi|p9K9^8e8ysk#KJCgfZih?}l z63o13n`iRL=VF@AK3XjC%hA?wR_aF6)Ekv@czOpOUvL0K4tWCdOlX5e5t|!*`zFS# z^|3WZEsV!6Fcc3be3_IP8w2>=@u4{L<_!aeai$*fR+7A ztAyU>o?h#NpL1N=^vXHyXjC7Z-KsYPKIe{IrQpQf14*>i?B|a&ZTz?^&pzl zp{lO!W%G^nry>im;ADHb0fLDSNu;gbpp^J^Z5APL^{`;1$$@iPwoatG5D+_(1OpC- zw!xyo@gAcVmfIv3jKNw$POiN$B+z^o3(oW$KMl98w>;(&bZ0s(ix&y2q2n4!9rQIz z|kRsZb%l)y(fJhONA2|IBb0T=)8A`okX5^&Dsb zr}N3Fmt9^IPaFWO{!3;I?7LfuOZk{P<|3nt7=2JgHP0U4fM?k-x1d0`@aslbI4l9j zI-+7gf(qfOAZAfnl;Fa{Nt!KhSjaw3j%Tv9TKkU`XzC*2tz;}e^9%f#U*HGi_qkQ7@aa4fEeGw}`;TUTT)^SJ9VR~i z`dlPQH9iE6t|;MCY&594AMt{Up2L;)P@v^Qc~o0=-zgPv$_i`~stpz5?G!7%J{g+= z*WEt+tw4K#=!C)rSpcK9*(hj^^VkONOTz!22c2HQPdtRswoP1tTKs_d69nRCa@|>kW2yXAwXVz$dW6Wad z$~dw+>Cdeu?wdU6&M{j*+PV^u5!!P?p*v7SjA|kbR7PO7n zc`D2M{@LWvsvZRt>JLXVzh*X#>T!GfyAZ!r;=7(mTj#T9t8>911fDr#Eov$V_uLhXl{L~UpEl=;i9QbL4(?4k*r(;5 zC(1_wvjH*k%>5>>f9=quI!F%eDOw}Fu(KzUXIx-kiEmgggD)@GYDb(7N-WZ%M(2r@ znbntiHYc)uOY`=YvdYom8D`nCWv zrNBQG!3@<>G6~f)0OKE!wg>A`eM7E!Q<8rcxuW*3!!3)N7`{bC$iqyUd^-E54NNyT z8?-F$!de{|u6MI2Gj{_EQ1(+UlysXa7vyT^_%WH>c-r0({xjsV&_3$owe!(acF06uR`vBs+gtZ zJFnc3C%SQ~?l^WSn`~H%ZjXjgu*Uj@N%scg;TXJi1W!IstXyU&CZT70muzpmMD_&N z@wr&J$R*6vPd@YvBUN2|Vs3Q;r3Pk{9V`Z8cDY}77`Z$)(Bsr4OD3~i;|x1?bg+!e zUmm6crmlmcf!7-#f1=3c4@ ziIwsNptZyB!zxO5yrd!1M7^e$Pd?>&I1lU!tDvopLbq<8ANSbap_UJ5By;TpcjXE6 z|M}Wk(2atY(z_NvCp$YjK-qk&3}X*f{H@J>yE$=z157w?zBZ|Kx{oX*Td)0=H!k9(@{5Tb$^)+`j%J8+s@`9FE}AA>gHGeacd?kNcGlo& z8IZP*w^y3~E#_ty3@79Zp?jNV#VWr^#@Mko0T~9~`9MHITOjgXM=$8(xe-wLHvSiK-|$RFIyTIoAI>@&`D? zd{_bupkD@g#%McC{$wwFD6kLX#=@*G>603Our^-gB}`TeO+*OTEU)MqepSMtdj-~w zNwZ7nbHI@x5~C@dWw+%z0*F5X3TJ`Rg^x=-{l*0soJVxL#Hnq(B$;bK6~LuZH_&@{ z>@VQHIz`1TdkT?)alYU8n6Ceir7Mqza(&;^A}vUplq4s#k!37JQB;g2Aqt7e$gV6? z#M`3HRz{W~lqN+X#y-iBP#H^>tdmM5+o+VOgx@vi_xLMrrH|V)x~9}+JDT6yTsNycA3=Y6SE4u%4|wbHn0=^BkyDC< z>1BLb#lc7{aOVv;IwT`eKsPy841Q zJMNcF@&X-LKdVQPm|nqF_O%))UC(=aIi|JbC*);QCPU&z)m&u_Rvq%HD}ZF;w9TvG zNAbkGr2*uK2!;^Nx8di?xI5X|V@4kKR#E$hNUhX=6t?8o?6(?UB&libp;ATkWLNo^ zhToR(I{A^8*dE9&R}zxT0#eh>Nj|&GKU;zMqL$n9xV>M))iz8Wh;KnHXIdxl>Zl*x zuE1=Og8sd#pncvRgHHgn&a}xkE8;mksg6deF3%M{JUxNS?AZo+Zj$zk2T5JeeS~I{ zIyJqM{nS|yl7Qi;T16B+5BS0U`J-%ul>{KXYzT(cT2fZALSe?AL zk#x2w{^ug}o&o=XA3$t&dsv!2Zn4^uif~IWghV6R9 zb77d=3fb`D=n(UZArBmSE+3T}%tJlhlbqq}#Snj{0iraLru>d!hXif&dM{#R=&hh5 zzi@~BG1a!fsY-gINvcb@+DS((8*t$3j48tR#8mai>AI)tl}dVVYR~V+)3J^1Vxa}= zK45Kauao8#kj8eTYd_a~rEsU2iZ0M$iVhOp)IVUgh9H}Ozlw?6)V9EwQ9rvO(usJr zrg59105RD$%Ek3Wl?@oSeK!L@Vp-poxxbL!MrP$@?X2O87|+=?S?F=3k1Mk&%bV+L z*TC6t8B#p5QGUwIHbKu=dT#$pm$Szz`(~s>8|OqFwoP!n`C}M&i`-SWEs9IYlY53l z)*oNJe9Fnx?x#~T6>N7%I0bkS6uij(>nsO$>0BbjdH1S>?&bGRNzu0=p-{!?&1a_H zZ_JP8aQ0KA5$jvq|5}H-c|MNFE)paq32mLBl?L-)M)ovsMeA*#G{m#`Q2_t0fRAv# zw(Mxb)_D~=cgG<1n_4Ne~uLaTcsKI zZ#LtdQK&0pwGHaI{|r_l?%&zhq;u>Pql=&nVW0l9d->m}6eqg;=%y_8_|#0f4R(u*j}-3 zrp}U_x*4`sCDBg}s1qPc$H2591?bO7YOyaqUBS9RYmb-Xn^dlWD@sW{w&(1x+52*_ z%W@_ZMFjUhFrk=>?SHq5N#%g0c`?i2c4~s6Z2^(O9!tbl+T1Xbg6i5J!By{O+lw6Z zqH2;gJT1lc*66E|0g8nrwR1-mw(1!{>8JxQ+P9rKM zT*dq9<)q_>-knL)3iGSs5>VHD!WJ_q=>e^Di{QU=CHueOZ5;%A=f)4|qT{!pb537( zdWek{%g!UfEuksazHpKvIsH?VUwvJU(e-+-#n}g-ho)&S;vKkC_2Hu?TD`ir2M=GJ z$5dAy6vjFkZK=&yiOuL9*R2xtfJoTf4>?|A*!@V||JfRGSk5*Ro z2N8hkLfP>3HLMlIM>h?AXp{B3A9hO{Ml!V9D|#-xJ>TjQB_k@kLm^Q7Z!YN1+$+*y ztD88}ci|ub+Lek>Ful=C+Ieng%c96px2!q08Im`B&Shr@`SZC}1B9dytrC4!mes(n z5cqezak@u|o7&UL@(mc}LDG;fJrQ^OT1;pXvusb@+G~>iO&XnBLN_OMUGn&1aECpX z_n9bmeultB(7P>vbVSVZjY?;zR;g6MIbcU1?B{&U=f5v+TO|SZL!4_D8(eNDfNS>} zFWOsM7a6w@vd~H@(;U|ivQ`JIo%OhMGp+I;BvkGnJGUmwhWkab`{>%j$yY9<&-3Gh z2vLG1{y2|&u(gHxVP~I=dzHbS@9de9qr5s z%e0f7A z+y<&>0aF>;h!|k04?y33;J#A-u)LtM-S>`-3%LhXWa~4ovN?|1>9D$t1+qWnrZywv zgUm}*T))#=bnL_9Yk4MiiQ03!L22iW@}kqc$Sg-t$Lrg+*N)s@T}b@&%5cE77S^x( z1>GSZYOzOeowPiyQafD5yC><$?aN2!Gmtj;XYVG3pGbd&5CHH-nX; zWYH-a1TLc99v*S|4)$$ENyWR`nbW%YcEujJnx&IEGwJx~FprsLs3oY*PQT+~hY z@gD|P9JTieD>1s?T4rR4X1Zp#Mr|p-bg`XvdoJ(omquS|kb`Z4xBI8^y2iy27Qmo)ct@0VWij-Kf&gBBa(BBr0;Fg-JMwz@PcK&nLaPU!))%y!N z-#I&wcCq8>nSr<3<#rmiu(?zHAO`A$f4#|ItSY{9^mu)ua(Z0AVT9_h^-%EM(4PBv zg*Kf^$iwnUA8siQ8Yf~pIGZVp5D9j*Mkc6qWw1-$hh9)c9{g{r{nN9*NB;gjd$+{9 zYh&%{Sf;!EnG33~#?LC#5ba%bV1hy!5?@ftaCmTe|IN%!yDhb)Da=p(y1e;i42PTA zdlpvvPdx|Va*3@~{z4=UDUShJM>jBrfHh9Yy~cB&Rml+)g%rkaCNUoatkd2r*_>uEp72NXY8#Juu9(*YuYQEHAO>8$E zJ}nSQBJam;0h_>(vV|LJNVd=3eaHMx)sbBH1Mgf`->Uoh)!O^72SFX~owB123mky8=x@!3g9$Rnx#qe{rZ8Y}STXmi7n7wKE^SN&x zyR{yjpz?8bE*8}mGF?RD?@ZP{{Ei3l_A_U%xZTv^`)sXo8LxH5+Q@=BJj)w@Zp?a_ zlSgZJTJbu$ZFe)Ft#|VWNZk9JM(lTF{N_AL*Pf#pnZAVNwA7k6-P$Ir@Zu3edi|gz zrBV-KXe*25eepjSkVb3b-!7JB`a*GNlhl2T%pnSbX7%-s5xPk0S)E1SH1<`KhNkwk2kk5{b?OB;~lj95|z*pp50$r6ZS zXN%VUHWpndDiQZkntSp~b7alO)lX#3=jc~8g+Ck)-ft;o(*_(ycI)NCJ78Uxm?;r0 z5-7Lx^snU2X47SiuC;U@k@d*sgUB_{orlPn!5Is<2(8nX#06Ytr^^x)2+&?|p2`n;(JCQans%Q0 z^Rpu}x>H28cFJC5ZD2KuvlYl6tRs+f-3%yX0=oKftS+D8wmLvU8{9v7+Lo92W{xe} z=}-H41JEW#4h#(B?Ozq}3|5~`9}avazwZrg!`gxVA%96eka&6AtH`i5BH^ViX1R4(u@uKM8x0y|#C zY;X}_(YMkB@oq~}*8=)}$>}CXU`y!|d%uw>14&(ru}n?NYEw=K1YaWP4#O5CH;3Oby0^4H5tZyLNtErxHzIJ&Xs7n@#;?f>m|+`d?TPO}>1 zIB=ucFU9A2sgdn>dL=GYjF4O}9d_fDG0jms_hOA?PeJ?oWVdVVF+?`ItTjGU-Cr)q zQ1(W}W^BXrM%6c{){cWKNReh{alGQ0)^y$mcNpvtuQE1nrSW|!e=I?3h09I!1-4A{ zSLb<@Kf6(@6oWQH{{f>2b4`|k+=?u+Qbs(TxBaZrb4hRxJ`B)xv4`%d{xroX?B}V1C04)*)45H#Ej?Id@FJ4K{mz4NBqM6%2D@BENKWSFvoz)V533Z3} zye*bj1c#vQDm_fjJz9=uP|^oh=;px#0!p9^nv>Ct(AQi&TkH1ibP2h3cNc|aa-%8Q z&nHgt7g@UPS|13gQ6v1TCFQgdT{&^!*X7;cnl{sjC(Js$ zFB(w}blnbMEv>h=734@R6H+-@y3MS(IUz=#x{oHKxS8gdradP!kv(=tb;avbx$EU= zeGV-kEuTmi*O$`%`;n(x9OElkR2&~=`KcX&G44*(Ny?vU$^IFT937X}3`1Z0g+qYQ zpT&x%9BLTzu!ISmH;Chxp{#_&MaE!0yzs7E``xAkOS!ViKK7(7I7lwwlt(oBlTOi z#0-Z!W6(1Gd|T(6PO}#5MhY)llS^;L@`Cdhs~N>r-#arE| z{qaAR(q?v9EO&(9`JTYM#8OzQs63ZuRXq^L8QDx38Mvf#bKtiF_(kUANqe%+y1=w~ zDH<$clVC&qUl16-uXgnP5pev6|zL*=G|lDAeiRVMg%j9Swt-> z;-QB9&J0FxC^$A;Y)0cy3Y7hl=gZmzrspbwZ<4#}EU%mkiVs*!4goByhi@YdUg$kl zC2@N%+3-}2q`VW4-e(+N80HtE4|SFr%bZePnWQ5fe~->vrvK{(^SX&0ecNJE;nI~k zFD2Sy7CEhOVdBGV^5+w-xG{r8bxfmONE@zBU5~{Ve8+=D(?`xD<*aY~NS|8@om-Y|6*|$2l(n&E0c10#0R@fB4~NtowA^|)AM|~PdV)J9|c*qJ49;P zGfpt??XL?!@V+j@Z*O2de(ZONO{fQo{f*g94oPN&!V;hZqI1)sT|FM9odvI@!}dV@ z?Sd%Yw4<7W|v}k^OsjMce**Bt*-2P=t`}fD@9jj#S`dJ zD%uBUN#hfgB{aVmj+6~Qkla;{8pBE9KRapD4djrA-~~WAhnE4M`x+8ObiWq4>(8%m z`}>qkaPBraq+#IO+mEbaQhhA!n`DgG-Ak&f!~He_`_hqBTDoA zD=}WZ_vP}xyP(cHC)wX4zjIrlg!;mC8Ir=%|8DLc6?gH$uNU|3t6EHtRNX35ea!UM zu#s11t(0Weu_|-a3lnNUas|fZra6-O#IFbJ8M#35-mF#R$tlVHM3y2uFPUX#BPDVB zHQRxp>oI{4yheb&eYcQ_&n{IkChR%AWlP!smy?Ec>%%AyVa2 z1-s^$pg47-EC#X_y|-%dxog!m zZ;zSW`=3AhjkbstTXaA2(oIw6*dM>dtW=Kp5KsSXd8I2#GpZt}{Z@>zWCetm9Z6l# z+Rh?5-IR<uHR(y{8(&K_cyPWg#Rq&MGv7P+B;Q)b|8NK1?Irw$S?)se*(f3P^jl_%TwQfK+&CN)AJrcxu zf)sPV{k-;`N22z@LbUrt^J~<|$HST-rfUD9@?29QfswepYBh35QMN0u~~hseeki5y%lCcdXFXqV=Lr_peQJTixRUvs~Q`2 zBng-3(KyxXt(U(&i1(=T-=L{XBlwA)YHxK;EH3^rTP3!%(+s~y7r*BVoQwsj|L2V1 z1xuy&+b9Pu36G3FZFIfePjWj=8D8E0v6FsBA&@}tTmQWe?RhlmE#0aHXNynva{C?^JMm?3Z=Bi{`ih)>-1qwjwE~nplX{V!G#^v zHHfr@cW=RfivPc7GP?8c9rB^-04K0{*dD`QnC!jAe$8HrXPw`gca2Ga&FxEk1N zHvM|SvkCz=#pNgo=_yT( zTe*6P+9JFIetbg$7Q2ZDXZ23aD{{){;lvoH&WhX;{&g2+WZU_gcV2@+PD_CYb@g(6 z0i-SOO|3YYpJYt-tO*f{PPqPF(xOGwWt*6vTSVKeW?kOXgQKT4-3{_}@hX|7$P~Z| zdQF`$qyvKyuB_)wpjT!5YN_;$cG2y3hApvKbDW580%I%g)LJljNhe*m?gNqpQee+x`H)RD)f9N{c}9wyh(jmNRn5 zqi&syg3A80gS-0oQhWA?zB#B$J1dG->b(joMhEi-DFOKW^d_N@`G&H~Z zkZhJ8U*Gaj%OgeuB{{zEcyHeeIaO8?a+O{QT!dTUO&`@z8CE(O10B$HRBIL>a@^}o z5YyvLn~^6MiTXT#y$=4rG53m2+ArKKKeeYtCfQcLk*|j!iw!{V`X9k?SBQQ<{DW;to)c$q&r)>Bz+{B5Su4VhGXRo731q}3eI#B#qKXFW` zkvx>#1sCYM|8rztN$zpkmc}ZXSF_8z<8p=}NeT8^Kq3BQN|=Vd;Mlwgthgcv53Y^f z1sQKSpYeF{0@t!0h2C7reo^l))K5J4D&#r9>c|z5oeraUXko(aLJJq!xEq{BF9%3u{IlbDoY^ zKB~q_v2uf2tOrKn>*aCW*U|V>b_YHl1u!*B4ez4TmN)#Tp8gc}Ln+Mr<&$v@UWsj0 znVr{=GlRu_z3yzUDE*Cl^Y6Pa%U2Tt=YOAorXBw6HjJ)V5N9-Lm2Wt2$9U$u%C5>(m+oUwTO82#B(A95E4jb8Z4F&`S@LhVR!r-<^pIGgtLQ2wX@Lke; zs(MPj=dtDKH(b66l)x)op4hf@1N%!9_+X>Wdj91K{lgmu{|ItS!i}t>0!i{R*~9=N z^g`>oAuwM?oFq9po3k))g9o*4v#_x^^S1I3W-sj-vGkYKxC;!j(G7 zCc=-u*yHhm?7`$p2wI0tTi+S1za;*dTcNZ}_=YRu-8gnX+*ZRPH{9 zgir9a+D)IPT>OykcrRMhnpm6tt!Z=*W##qXNs-UEG~{hx+P14$mN7%n{4jcB92^1% z3$#cH<-vVsHnB~qS#mkp`5@(K8H2mg93-IE2><&Wh7Hd?oq>X=a(}AJa&V6+phTPx z0zZsO_B5yh?|G|x9k^+Xh>XMFVI>`anft~12ruQ^9~JaB~<$+c&V7sWHAQL)x?HMS?)ZbA0zMWX-) zI3N3}VI&tR8QKGigW%0Sb^4FUH}18V=36t{4e6w526V)|Wr4$Q8i@bUje9X_3k^S> zc?!>Uuq!W2*n+H8ws$N(4sO3tCTn{2gfFpY2aW#8*q93t9fUbpo``|wP|#*eVuH}^ zVCg2g#72D%NwWa(Fb_!e&>ELmS6i*xOht9!$3~h^qQJ6J-koBxT==;pUz1g>(WyJQ zl}fz%<$ZR85v?@zb?G9%t*ghsNz^}L#>s{5@@i^bh~mgPD&IPCA$RHsMHxH@5Wn7` zFHTC@6Yz_17MLk|f%}eMV@Tfw>g4Gisr{F8NgQqC*~>idC`pIO1+o-%YS-_>SQ0rKJq~Ud0PLL?fW& zxx#deP+GR%krDBv93VM!S2<8T;bOI3`>^bE>L!zUuT=C=o(>r}$Tl(9Rb=cN`sW&=Kcm zz}dHG3yEn1jCQt!KJu5VC$FjU611y>ZoeZPKI;iuZ!WIZ5%66>b>4tB@ogr%bTZxO z&jscd`TU){1Tv*gq%y_~YGR|I=y5zNCk8udMWp$<8p*}&NqvhWPgF1}inFr`*ri?Q zdoMdzur1br`{UGE#8g@tJ1H;;$D($_cRH>uB5hEhPPuXqv17S@sT~L={!uRk3_F3H zfjd}#7v)FOwCm=#QG<3vY2Uomd*d&VrM*j^Vki54=NnfoRtbw|{>Cm?I0R#o3DWY)}A#PVr6Ti(KvVP;R+_1oHAD4>gmZ#EoF=+=9Xr z>Vci|APcC@1`C4#G&P@e;#wGL9P!@J>u5bam(%zik^}b9x*S{9=g+V;ODe>}~0g=h8Lb@3GUxHPp0iaVg9Y17ZJu9V+NKKk^oVJhV%NRs2Z3@0Pg!HqdjtSGaf?7;d^92r!8P zPA87cbrcg9*m`Z;nZqpu?R4JTo_bC~N8rvkfM=zgiKu}XL_T*2%*P_n6x90jt?@%I zuxApPi>wCzmHw_+|3z$p(+9uxtt5yzwaIJ+&|%=e*MR*I4_A-Dd0-iZ>}@#;5-3PD zrWm2}CK*3k2R-2nAOb{jdGr`lt2D&EcoUuZ2`Z)aKzisYT|)HkQ>`nUqlnwo62rQGR`D2b zlUEQzyy;))@A|=Sq4qum7pMs~&DOIYEt?^oV{*LAhQOZSfp3G6Y0ks2Cp79t_tINk zIZIUf-Z}Sza-a$a!LGY(PryjE2%J^{cqYYiqUuCX-mXrapSzlWa^>r_XVUb@f%CoC zDZWq7Kp*fT`ZI3;aOZ9UzxNz`RPV3yAbYl&74}Z43OvHk+x*FAiXuKmFr?E4elNp2 ze_SAYOL?#s_h1bNjkN*zYB+fnl;@7!OXyu(E7`Okk*)im+SC4cVkhbrXr1w;Y9w5q zq$KOSEOru<01ej2|0A&W&-)0Vcr} zP53!I3bmaP{~4=p%o5N#Ua=JayPDlU&iSnls2;I6b&Xs@QkM*;p&23&O)lV;lql#4Jm1&9lq>4QT%BE7O|^^P9CBp#-irS-Xg zYo@sVX&9aJ33KVWJ;(PcB@IJ#W9`4%JFwmQ(0?_g`t(2Bl)$1mU}2Cx} ztyHjYbkOhY9+*n#1zxRz`{GOL8=~{l5o)nQz1qUCa|zkmL(pjKZ09=Ood{}3vPc%X zfZOTevNbeSmOa&+Wr8er~r*QMgFhP)w)J2$yV^NH%)@=QiLmS zTxJt{EloiMq@rD~lb^1xd5r3o<*+4NE~}rH7a!m>w2mN2)B&l3w(d5T_e+RJ({pu_ z>4jI^JaASJGrmf?#Ob{2-9!%QoberNtX6!O&AvYKW|fb%hFR;bi=2zK+w)D<#XB<~Gg)aO%t>;C?JZ|$XP{@t0Ai_OTJ z4x?B@Ue&;f_&q+*^v7bKY&djd$z9Xstao`piVTLtJC7R>w-T9w9$lG@38w^KlY}Dr zNTXGKge1o+9iDj_e^+!$t_yTXCzRc7(TZr`tOcW9SJ_=LP(tLg_%j*#q8!PC)CstR zRz9v4)8WAI=-_u-79_mfGB z1h|M_x7usn4bLUb59!brSCX6jV|=RuR@33HInA1_?l}YO9P|6EyCZ^ z4ZLwoOHJ+j?djOJJ1E!fyTQz4I`BU4Jjp7L+egN zf8ptY%yJo!Sralm1EdooxUBCts$6_)ODwPH0aBu}Q$q3ZV~4bX^n;NLe{)9obRQtO zB)iNA)uXA}&(%S3`K9(VM#DF9v_NrEiee9{y-)`DBieH{?ed+fE_j17sIqks4xH|A zq%)PK8Y!x>@;rVmnv+>@aPMrh)?2cJnadqRG8tVw`cqXkwPz>CQ;r=!P8=V@Ctm9E zxBJ(xUp}m_@}8nZNBnP(jtXb{vhJU&X5W_I_-oZxPdSh{o|~c_2ClCV9K01-vbCiM zKi(aK0b8*`qYG0#JSmQ^#&1m&wB84Dy9tTEadnC3*QK<|ZGl%;wWzYp5s+%zcH1$( zjLqI@v}W;DTTNX;ciMs`Gqj&X8-V6|AyAlI^`(rWtapY`Y`4C6@dCh%X(GP*adODf zp*8j=ydz^`QWj}1TeeJxDW>Xlq=H`$yP1iL0z29r{apBbo6B*Nwd>TgzwgLf8an!u zI`MFiV@NHAUqG!C6&1Au-oM9GiRr(4kx#e~Q*oQ$e&#KHt?2bjm9;>Ws4`#W!h9UK zO=R-$oM!#ye??Z2bz}oCGn}b;NM`)$`>fm;?zRcAsx|0|zJ49_XBVr1q}@HqT_tdo zJ2|w@Kv7CcswW4+J@5=O7^y?N>e4MfsSG4~S68W^Nv6XzRKnAAxh7^Mzw}qT+6sNNw=dh7Q~?9*{e4ytV+yZz%A@z zg7ac@OS=YNywjG;y(?nZ2khtpJ7Ox&V6nRB_ zYouyg{LpX{eTq9JjA*hU@WyV46V~HW!{m`|y%|$MvPBQsa9g)i?r?6YU zy;nW1KmSniuP+jmA=uLcr?`6gY)NNmk}q{ljrt;7p)WYyXDeQCisOG2g$;kcbgf^c z5Ig!Yp2P;{UzQ$&DjlBL&243w@Nqw6?D2DMB*WX4nhukKar)XD+D+?*)8nUW;ktgP zMVT{VMV)xiR;HpA9ThbqKlqUPrdT=_(vkf@S$1Phva{_3SrvT5A|(6W>I-_c0&g@x zM&D-~?1)%j#qo&?fVh_Yz&k~V(4nsdlR!mWWV*qwtZih=yQ2>bHBuo=PfrQOtiaSr4c!UoodL9ObB zS%;jyZ6@E{w(w;X&K5?V9Bi?|dG+Ci)vYPrAbjp757o+wzn~B${P-Ok8(U#TxOE*w zSjRwwrYtSD)_FNnj{Zlmvt#A{W7K|VHdm7E zbDl>wok>eqTNz`d&XVSgv?98nNQ$JD>_HQ3#CPjtK67zW*Lq90p+$6<4(8wEjL7b_ zIMBP0)Oj3%CH)Jp(u|OHmbgisNdETi+j{vTsv+#in>1LE*r|eS+DwbmP_1>5M?8C> zs6r08!$gMlYeT~*7qt*J5QH6YWGzFaZ063u1}}FajJKDpQ^U=JGnyvcnm8k0@b_j> zT(ZXH+E%Sv)rApli$OdN0?j&*e{oXhA@TWp2x;EGU%q^S*ki`1V*N7vI!>;b?2#LQ z;0h0~A8cuprM_r|_th#yHKo8C(V#>E@G}#@OKN7Di-wKTL%uY16lMcZzu1xII1}C` zdzrJJ{ubRj^Ud|&<2`(}ewuyY3%U z_cK>Y*YbVaxSBpYIc#N2bwtK5SR0!+-}soeiT5;QNTiji%DR_j@F1~&C4HW3z1Nv@ z%v+aZN1Xw`cvuHDF|hI=}(mg7p#7FW&_!CZ{j8zvHL#Jdge3^>Y+6Q zLQdND|vNnI42bGOQ`ZnvhUJL?PL=@JT!YAI=$Z4w5IRu_q?i~jt|8v%wx2lz0N-l13fE0`RT)lDP!)8{>f zfZ&pN%t(Otm_J`rS=Z;q17-Ye!wQ)|ueubz~8OW__E!)#33ICzb|c7S)C%&J&5 zoI`e|&b(1?a0C(MghR&_PouuOhK7de1!sSMFJW}mw|&=Fr|Ef|J^Ms-^w}(@+c}Pv zVL)ILQ@Y|T-59$U2l0t9T-PX3_haa4rkETB$6m zDo)w-q=uRQnFQBdiAPmQU6JT$nV{@;A5v_6bVD6}+@wPEZVa;Bll>b;b_hBd3AUOF zgZJoZparI2{v1tjbGYBJ4@az`p}b#8$vefL;&@pM?IMGtp@4%^NVIUC4)Pq0rR8E% zIV0;R%FvfMQ!3*FKAv;X;=3M88$jb@WY^DyGCdLz4&HRmFiG4D|=6;yB{K(t;PW~~FqUsR%F|}2oAff}>EmHlA z0)?=e|GvVk^=}2UxUjZT4+2>diL=Cq8Yy3)Um-M9oV;PMfu4paU_lpyCxq_n9LExB*qvX(`g{(dcJCQTuMGo;9Qd}_VL(NP0 zK~t^u1O%GhcklNP(AV>3opuCL2i{N#ID9`Y+cy8?S zKY5I>uUbF5x5R+XdYBwi#?~{euu1ezyK$3w$0G-WRx2@{sHXvT^DMc-T`h5K!;;@8 zHgz=QAr*W;Yha%J$_eQB`NNN54zKXCNf(aSdFF4r`pDwjWW4ujh>Hb!V%w!e^8L5` znbYJDFuS!T7VWu?8sG9~%rB|%{G-@12WWkL95FwBXoDAuK9i`Q+aKIL`o5`uGX0Pq zJ>c-nQ|dn_i`iS`Mj@=VH<(Xs$Xa1Y_hwoRmG3W@zlh{-G5`I|jEz1xtb(#-YV4Z> zT@079DS2`~=&nX~@SkSWqy<;|o!sF8V|Xzb8h2AKKYeriu$6VYdzJy`!h^ZeepC~X z-(D3w0-0{*&xjQ2v%?n4Vf)3F-^t}(DHyJq0w7BXe#orE^?HIl=}g3IJag=s$P3h} zl|wt@7Vjk6Zyub06~^H)UY|N^!$ZA1)hqGTi31e)zpvbtqZHvB&v5w2gF8&0mYIKk z@cotQR!2{+ej4^`uUgPrAr?yHV{Qx*EcSHqga3VT+u1x^}(#nIxvN zv9^)r7HyG~u4;|Ho(%6X@dZvsxX_++Mpp8swaFb`Rgm9iy$ToW2^& zE&mMm_;1zPOH=xfFsVbAI&s*HaF@}!lAASXnbHN^VZP{$L0drQ8$qdnb@a1Ms8^^9 zZdD&RZd)wZG+u;c> z^tZ^RY!NF|YD>3;`>}%!+wX1DcEal%2gl4i`SU00gfYdQkbeuJfd|vuPETm#!R{`W=;@pMS=z zRZ)e-P08%4D(F2;bnN2aTuqWCtApG`+$_Zs$sc}F)4DIKE+ zZLB}Ffe=_ddj1(-=3nyUUqPVui^ z^@dn#kiPx(@LtnP%uCeb11)LPiGRpeGrzKWBTOMx3m#TStPLNpJ)dt}Knfdk z16`?_+jqZ-Rt;)+^zf~y|DCtd-%ljCj&nn|{9L$Rg3%SDTFaFmeO*ap`AkNCuK>zv z>DGA=x8E0^l1WW+NWhTdoD**35C*%F!}-V?j?5_C-vU?23I>--r9GECR4dt$bx6`8 z#Wv^dGkNk-I~eI+Wxj@cW!dC2#rk3zKeadX5V@zFi+-n$eN9vQuzNYq4Qgq( z?2fdRgikDksK6+uBv*!9U`l2gba-(1)F#`jxjr(Nn00CTuy32xaCETC&Q=GP(1R^T zcmp|a7phg=pRKC36&$aDm*P=@UQEjtjE|g>hiA<6(H3XQ${I;uc$AyN2`PioRp9{8 zWduor&(w$S8(_R8KUn1-__uuW(wVfTOGFF^3n#+14t9A^3@@9#c3gAz6+$g+1GpT!nds*>>*(6u<^oMFD3S2WNiy z?oXIj^nVH}pWOFYvcK)j-CXwd;ass@7Buh7HH<$4!5i!vy0+i9YboWYgN7r?u?#J$HY)``}c@mC3(5 z{d>Ez=6GeJX|4o=9M2&KEq|Ya)5{vjEW_-M76)F~z|R}5wg>aZ&E>O#_;!|l{CyRb z9Y-vEsCTC*1^LrW1Ai_Kc-i?fldOQVlCX8AlIU@<> zxp}Y!`#e4MJ!1ND@ z3p)*X;RIY&O{A%0FE?uXihfBF72Hz;*frIlT+L0e-sVR3tPsH2GNUrf8M zO#BhmcI@(D1^23t<{M8)n!=R~G1-EC6gC{J-zb(hO zFq({SGWE&Eh-)t;-j#c5-OlQ3IAHmncZrEO>m~0FFP&GMjmw`%(JG(h4zE{tQW~G- z6jN%@k|$Ro8z?SP(Px93aY$USY{PwvieZblo-&c7PkCrK=m}|KT(rBUGRRTRCYcRdg9jL@)uj^UUVIAKq*6q|}=jlf)3U zBd^sPMybUv$b->2;PLv9i*1q(pSe+}9+(+j2pC7%s9O&nRBDB(JW`>QkY2TNt)yO@ zYZtlwgG7boHaC;i=F-k&rAR_G3^biOcjMO!oAo_iqWV-=_lv*nUit4lGl@~JA2Lq) zF8xVe%5n~vdqLtH>x&I|oW%e4vp-p9H`#yr&@RLoW7^^@f06lbbutYx3vBb?9c14f zKa(*77uam?)GwGG3`sK%-HYBN0A|Z_hxsPKcY~WKInLA#?!;rQ^+#IAzI-!#?JCU@ zOpdaEMG5^VW`~Q|g0791ZszE&(%+`v^5;2&X9o7rdb!a36?f0r-|5p3C(RSnvR7(W zZy4*H67Y6ta6YGB{>7QhbdT{v(_(-`wQE)1klbai-Wj)xq|)3w^#@~kHsHu7)uSnO zk&sJ!|5&~eoAU>N7WnOSluizT`DM3$C~!?^Hk+_%5yE;~F0bJuTzI0C<^ep2Exbz| zlT6%;o_BHU;92!>zceN->r#y_{UZ-$upa@YQc{=7TD|c1MJ-(6?+@7S$Eg$RD1Gpa zWx@$ZRa?6}WavQL=O!Y(5|WBZq?+lxuxz`7BkL)=rwU*xbc$>LEi?cVBJa6mdRBt& zbEn&nczxRz`_DSx5je#tP)y(Iex>c$ImUARUmh0Ao9;!ck-Un1X>9JWfcd%Ir-C8< zf!Aa+cG%d-Y7b=tTzk&%oTgshLuQ+{q+w!&&lj1gpAp2g2`|h9B_X3L9-hbSnN79u zyes%*n~<|P!ue-;;INJRxaNwjlG4)L;@sg>mST@tOEt_pvJRaqq&S#giDo;(pX(CZ zI^hs9V&p&=J;+3Qp8rL5x+m3B&O24R-W1_{0X^&>{u+=TX_q5Mme+h@Z6j2D1^th@ zOm|Q=xNwh$q~Il5S?b0Sr9$t*idCHL<} z<(7y6_O7;?ecXZnqTHzb=n!0~{Rc{&X&AWjt!=yJK8FrBj8}0bPttx)OP^oWuHFE% zA579p(ysSXWz`u4n2 z3KUCD@pD*;_Fs65xS=7mzSo?f8-)f@CpS>oNJi^K!XoEXbI_!kMbZqvkUjxEpFJ;Z z7ojDjVil8Es1|s25Hi2SKMrA-8ofv*PB4hFKymTSAK$^)a!NwSCePz#=wcF4_^&rz zEWR-P%lC_B{`x=x?u*4~z({g<+5&w=8QIxrPI=MLs8cI2e-f{-G5XZ-xSO z)wxBg>M7q}ad&n&5SJ3}F_+L}V%0sUfZ*Nu@BP1omc|Bzf<^RL7E@Qy!mPxp0m%Ip zK2`g9(}KaZpxCX>iT@GyGa_kQ_abkbOX6?Q<#1$l-ReAvX(O+=n7_D97l-`cRJ1(; zfMZ?Ts@Hk?VZ%t|kdjZscC*$aK-F(;>z+&GsJq$3YQY#0yBk#O&OO8W^9Atsa?Q;y z5~Yl(TJB;^R$181UVXBCX%=xpY{gfv>@Pe*;DV?r$DZlCAiEUX6J$F~6SLct+@)%5 zE!t!7DHMv@FTC^{2k$k`<~&APH;1kO<;OYM#|K-8tV3%=NRn$xD1V4tp7v*;;uWPupj8eFbbwf|>~Gg~hAL15ppK+}FCX~Y zs)mDON1iMU&iQ?AFd&W*iuOK3MN>1Vlr57A2Z&aQtw&BrF~{y<63ZM6v^fMHv<)C* z{JZm#I1%=dw*j=SssWxL9zwx)4aSs2oc7#v?kA60EU!cx-XA&Z6EK1|L+0x(M~n~1FOa6%@!^EhuI#kLgUcgCO|iCK}i%W0P~(nVlJd?R@7qX zg-DW41CZRAHN3t{=#iY}KT7B!e7iGr!Rng`JVt zd2DCU#2yIN0fdl^baz=EQ_pu}@q z&xhGk-pHpt*GNm1KWi8=<2%kEC+@k3;8E46&KleFjyBqap`hg$Q5} zL7i(D;2i>$3BtI{st61$-!j;XM+kPHU_iy}oKr`JU|Qe{MogYPcdEjJ%Y7rxpg2A`DGhhD1)T6=f=i8f4;pH(38xC|U8ncG~fd5E(_ZFML z86eUdj&8==J;IO6o+3ZEwSBCD2(J^wLMqrRhN`tQOLdOUa%#!PPjJKWIu{*ug-sAf z0q!;2(#d18;c(qib!xn^XV!9+Tl?W~rG+4Z+raen%+Oi|nQ^dQvG*xS<%tbI3x1s>V?3!Jokx7T&4DqyakZ#YgN}jgqZz}V$;ch{MZ2+j zNBCC<^5pGpTZPGT;ePqdya*oAxrY}P$ClYzer>j--}1klCBQJWE{h-i#2Y#FY-*4& z{&Qmf`^Rm&=lvTE%bMd<1h%qN;q;CUtme3~4e3aN-1IZo&>Ikiv*VbUlyvKo|QVyG0M zMr|}@)|mG&yG){qXMjKt}c4^E~%`UH5%mzXR6T(`&Hg-rwAb1y*6Rwp-$= z8a*5R3R7f-9nD?p>#US#6z)Z;R;3eglv0>8lg`y_8kNo;K1wR&Ok=s?V6;TtreGTa#ntQ-m}1Ht?P|ubHZ93v zNu1s*2D53g92xa+xT84t`H4OqZC+yBdP>c;0-$gREL+W>OAC$VdiB^*0to=s&y8e{ z$UKzE=|!}daS+Y8I&_7+@nA^0@Ujp1P43OFWW%Qd8_Ue;(_C+Hh>C)OCP;qP&ba|% zQV^DFkjNEdqP;A{QP3w)1hI#yB=S2QjEAKzGa$-wv9sf%=`FP&sx}8L=KnrK!LyfsR!`0c!-{!q+O@e4~RM<9d5$QuATu^i@w&3WLT{8|Mx@Ds<)qdpLLa z5J_WJFUl8g<7n!#3EL=@GKWaPGvvtR)vyi!Y6tYR`-tTm%=1`=O)a z-_IW^NCLg|6q05XsV3*z>zRUr0;4t^qCrUja>L;bVcilvxE&T34Y%03Ej6~2d$W?! z^G;ZL-V8cf&QkmMFSxB%FeSY+-CBfb4Gg1?`tBM| zjIkW$qIRTHV9@kEj)TGxsA{(`jtp&>=I$)_M!+~YBD9D1_r5QnzOQzT&raEk^?CZv z{$@iEeaC+c5WIN?Ye}Cx+7QjVL8{~xUKty#Dsn+rdCk9GO+~^t552_#5^)M`4;uf> z&Rz=xRRr~ybId?2bhc}IFPmpH%rkp5459gv@ZstPKD03vjZbbh3$SK-x9DV_*PbNS z2Pqr^fax~>qZO1U)q_ⅅ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 av{as*!n*Wy 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 UEFd_5hs;4NOfDfRjoj}39~aAeu>b%7 literal 28308 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 vV#0+Rm+MDi2+ delta 23424 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 z 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 diff --git a/docs/output.md b/docs/output.md index 743e91f..2db7739 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,8 +12,7 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -- [FastQC](#fastqc) - Raw read QC -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [FastQC](#fastqc) - Raw read QC- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC @@ -27,9 +26,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). - -### MultiQC +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/).### MultiQC
Output files @@ -43,9 +40,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . - -### Pipeline information +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information
Output files diff --git a/docs/usage.md b/docs/usage.md index e7605a3..6c1fddc 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -149,7 +149,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://charliecloud.io/) + - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 1497039..d668cea 100644 --- a/main.nf +++ b/main.nf @@ -74,10 +74,7 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input, - params.help, - params.help_full, - params.show_hidden + params.input ) // diff --git a/modules.json b/modules.json index efc56c9..e30d1fa 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "dc94b6ee04a05ddb9f7ae050712ff30a13149164", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", + "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", "installed_by": ["modules"] } } @@ -21,17 +21,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", + "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", + "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml index f9f54ee..691d4c7 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/fastqc/environment.yml @@ -1,5 +1,3 @@ ---- -# 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/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e1663..752c3a1 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -1,5 +1,5 @@ process FASTQC { - tag "${meta.id}" + tag "$meta.id" label 'process_medium' conda "${moduleDir}/environment.yml" @@ -19,30 +19,30 @@ process FASTQC { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" // Make list of old name and new name pairs to use for renaming in the bash while loop def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') + def rename_to = old_new_pairs*.join(' ').join(' ') def renamed_files = old_new_pairs.collect{ _old_name, new_name -> new_name }.join(' ') // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null + def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') / task.cpus // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) """ - printf "%s %s\\n" ${rename_to} | while read old_name new_name; do + printf "%s %s\\n" $rename_to | while read old_name new_name; do [ -f "\${new_name}" ] || ln -s \$old_name \$new_name done fastqc \\ - ${args} \\ - --threads ${task.cpus} \\ - --memory ${fastqc_memory} \\ - ${renamed_files} + $args \\ + --threads $task.cpus \\ + --memory $fastqc_memory \\ + $renamed_files cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d02..2b2e62b 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -29,10 +29,9 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. - ontologies: [] output: - html: - - - meta: + - html: + - meta: type: map description: | Groovy Map containing sample information @@ -41,9 +40,8 @@ output: type: file description: FastQC report pattern: "*_{fastqc.html}" - ontologies: [] - zip: - - - meta: + - zip: + - meta: type: map description: | Groovy Map containing sample information @@ -52,14 +50,11 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - ontologies: [] - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/fastqc/tests/tags.yml b/modules/nf-core/fastqc/tests/tags.yml new file mode 100644 index 0000000..7834294 --- /dev/null +++ b/modules/nf-core/fastqc/tests/tags.yml @@ -0,0 +1,2 @@ +fastqc: + - modules/nf-core/fastqc/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d02016a..6f5b867 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,7 +1,5 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.32 + - bioconda::multiqc=1.25.1 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index c1158fb..cc0643e 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : - 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : + 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb7..b16c187 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,71 +15,57 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - ontologies: [] - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - ontologies: [] - - replace_names: - type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV - - sample_names: - type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV -output: - report: - - "*multiqc_report.html": + - - multiqc_files: type: file - description: MultiQC report file - pattern: "multiqc_report.html" - ontologies: [] - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - plots: - - "*_plots": + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - - multiqc_config: type: file - description: Plots created by MultiQC - pattern: "*_data" - ontologies: [] - versions: - - versions.yml: + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - - extra_multiqc_config: type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + - - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + - - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + - - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" +output: + - report: + - "*multiqc_report.html": + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index a88bafd..2fcbb5f 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2025-10-27T13:33:24.356715" + "timestamp": "2024-10-02T17:51:46.317523" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2025-10-27T13:34:11.103619" + "timestamp": "2024-10-02T17:52:20.680978" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2025-10-27T13:34:04.615233" + "timestamp": "2024-10-02T17:52:09.185842" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml new file mode 100644 index 0000000..bea6c0d --- /dev/null +++ b/modules/nf-core/multiqc/tests/tags.yml @@ -0,0 +1,2 @@ +multiqc: + - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index 0975f17..98dcea4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,15 +32,13 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = System.getenv('HOOK_URL') + hook_url = null 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 @@ -93,18 +91,7 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm64 { - process.arch = 'arm64' - // TODO https://github.com/nf-core/modules/issues/6694 - // For now if you're using arm64 you have to use wave for the sake of the maintainers - // wave profile - apptainer.ociAutoPull = true - singularity.ociAutoPull = true - wave.enabled = true - wave.freeze = true - wave.strategy = 'conda,container' - } - emulate_amd64 { + arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -161,25 +148,28 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gpu { - docker.runOptions = '-u $(id -u):$(id -g) --gpus all' - apptainer.runOptions = '--nv' - singularity.runOptions = '--nv' + gitpod { + executor.name = 'local' + executor.cpus = 4 + executor.memory = 8.GB + process { + resourceLimits = [ + memory: 8.GB, + cpus : 4, + time : 1.h + ] + } } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different institutions - -// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. -// Load nf-core/deepmutscan custom profiles from different institutions. -includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" - +// Load nf-core custom profiles from different Institutions +includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" // Load nf-core/deepmutscan custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/deepmutscan.config" : "/dev/null" +// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/deepmutscan.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -205,14 +195,14 @@ env { } // Set bash options -process.shell = [ - "bash", - "-C", // No clobber - prevent output redirection from overwriting files. - "-e", // Exit if a tool returns a non-zero status/exit code - "-u", // Treat unset variables and parameters as an error - "-o", // Returns the status of the last command to exit.. - "pipefail" // ..with a non-zero status or zero if all successfully execute -] +process.shell = """\ +bash + +set -e # Exit if a tool returns a non-zero status/exit code +set -u # Treat unset variables and parameters as an error +set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute +set -C # No clobber - prevent output redirection from overwriting files. +""" // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false @@ -236,6 +226,7 @@ dag { manifest { name = 'nf-core/deepmutscan' + author = """Benjamin Wehnert & Max Stammnitz""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -251,19 +242,46 @@ manifest { description = """Until now, most Deep Mutational Scanning (DMS) experiments relied on variant-specific barcoded libraries for sequencing. This method enabled DMS on large proteins and led to many great publications. Recently, efforts have increased to make use of the classic and more simple random fragmentation-based short-read sequencing (“shotgun-sequencing”). This saves time and money and due to its simpler experimental design is less prone to mistakes. dmscore handles the essential computational steps, processing the raw FASTQ files and generating a count table of variants. Along the way, it provides multiple QC metrics, enabling users to quickly evaluate the success of their experimental setup.""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=25.04.0' + nextflowVersion = '!>=24.04.2' version = '1.0.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs + help { + enabled = true + command = "nextflow run nf-core/deepmutscan -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/deepmutscan ${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/deepmutscan/blob/master/CITATIONS.md +""" + } + summary { + beforeText = validation.help.beforeText + afterText = validation.help.afterText + } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index c232fc5..735acee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -224,18 +224,6 @@ "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 deleted file mode 100644 index 3a1fff5..0000000 --- a/nf-test.config +++ /dev/null @@ -1,24 +0,0 @@ -config { - // location for all nf-test tests - testsDir "." - - // nf-test directory including temporary files for each test - workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" - - // location of an optional nextflow.config file specific for executing tests - configFile "tests/nextflow.config" - - // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' - - // run all test with defined profile(s) from the main nextflow.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' - - // load the necessary plugins - plugins { - load "nft-utils@0.0.3" - } -} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 57aaf4e..a21ab42 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-11-20T09:32:07+00:00", - "description": "

\n \n \n \"nf-core/deepmutscan\"\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/deepmutscan)\n[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/deepmutscan)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![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)\n\n## Introduction\n\n**nf-core/deepmutscan** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/deepmutscan \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/deepmutscan/usage) and the [parameter documentation](https://nf-co.re/deepmutscan/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/deepmutscan/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/deepmutscan/output).\n\n## Credits\n\nnf-core/deepmutscan was originally written by Benjamin Wehnert & Max Stammnitz.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#deepmutscan` channel](https://nfcore.slack.com/channels/deepmutscan) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\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": "2026-02-07T16:49:52+00:00", + "description": "

\n \n \n \"nf-core/deepmutscan\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/deepmutscan/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/deepmutscan/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/deepmutscan/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/deepmutscan/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/deepmutscan/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/deepmutscan)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23deepmutscan-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/deepmutscan)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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)\n\n## Introduction\n\n**nf-core/deepmutscan** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/deepmutscan \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/deepmutscan/usage) and the [parameter documentation](https://nf-co.re/deepmutscan/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/deepmutscan/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/deepmutscan/output).\n\n## Credits\n\nnf-core/deepmutscan was originally written by Benjamin Wehnert & Max Stammnitz.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#deepmutscan` channel](https://nfcore.slack.com/channels/deepmutscan) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\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" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#280e9a69-af96-4e4c-80bc-ae5ef9dda531" + "@id": "#8858aaed-f60a-4dec-b22f-e46658409de2" } ], "name": "nf-core/deepmutscan" @@ -121,9 +121,13 @@ }, { "@id": "main.nf", - "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "@type": [ + "File", + "SoftwareSourceCode", + "ComputationalWorkflow" + ], "dateCreated": "", - "dateModified": "2025-11-20T09:32:07Z", + "dateModified": "2026-02-07T17:49:52Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -133,16 +137,25 @@ "genotype-phenotype", "shotgun-sequencing" ], - "license": ["MIT"], - "name": ["nf-core/deepmutscan"], + "license": [ + "MIT" + ], + "name": [ + "nf-core/deepmutscan" + ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" }, "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/deepmutscan", "https://nf-co.re/deepmutscan/1.0.0/"], - "version": ["1.0.0"] + "url": [ + "https://github.com/nf-core/deepmutscan", + "https://nf-co.re/deepmutscan/1.0.0/" + ], + "version": [ + "1.0.0" + ] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -154,14 +167,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=25.04.0" + "version": "!>=24.04.2" }, { - "@id": "#280e9a69-af96-4e4c-80bc-ae5ef9dda531", + "@id": "#8858aaed-f60a-4dec-b22f-e46658409de2", "@type": "TestSuite", "instance": [ { - "@id": "#ac596659-2e2a-421a-b5d0-69df6db85229" + "@id": "#3e21805b-327c-46c1-9973-e41f49b26535" } ], "mainEntity": { @@ -170,10 +183,10 @@ "name": "Test suite for nf-core/deepmutscan" }, { - "@id": "#ac596659-2e2a-421a-b5d0-69df6db85229", + "@id": "#3e21805b-327c-46c1-9973-e41f49b26535", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/deepmutscan", - "resource": "repos/nf-core/deepmutscan/actions/workflows/nf-test.yml", + "resource": "repos/nf-core/deepmutscan/actions/workflows/ci.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, @@ -299,4 +312,4 @@ "url": "https://nf-co.re/" } ] -} +} \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf b/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf index 3b2c26a..cb2380d 100644 --- a/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_deepmutscan_pipeline/main.nf @@ -11,7 +11,6 @@ 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' @@ -33,13 +32,10 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet - help // boolean: Display help message and exit - help_full // boolean: Show the full help message - show_hidden // boolean: Show hidden parameters in the help message main: - ch_versions = channel.empty() + ch_versions = Channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -54,35 +50,10 @@ 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/deepmutscan ${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/deepmutscan/blob/master/CITATIONS.md -""" - command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " - UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null, - help, - help_full, - show_hidden, - before_text, - after_text, - command + null ) // @@ -101,7 +72,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - channel + Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> @@ -290,3 +261,4 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } + diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml new file mode 100644 index 0000000..f847611 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +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 2f30e9a..bfd2587 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 new file mode 100644 index 0000000..ac8523c --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +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 ee4738c..4994303 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,7 +4,6 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' -include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -16,56 +15,29 @@ 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) { - summary_options << [parametersSchema: parameters_schema] + log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) + } else { + log.info paramsSummaryLog(input_workflow) } - 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) { - validateOptions << [parametersSchema: parameters_schema] + validateParameters(parameters_schema:parameters_schema) + } else { + validateParameters() } - 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 c977917..8fb3016 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,12 +25,6 @@ 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] = "" """ } } @@ -57,12 +51,6 @@ 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] = "" """ } } @@ -89,12 +77,6 @@ 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] = "" """ } } @@ -121,12 +103,6 @@ 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] = "" """ } } @@ -138,36 +114,4 @@ 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 8d8c737..0907ac5 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.5.1" + id "nf-schema@2.1.0" } 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 deleted file mode 100644 index e128a12..0000000 --- a/tests/.nftignore +++ /dev/null @@ -1,12 +0,0 @@ -.DS_Store -multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt -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} -pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test deleted file mode 100644 index efb3834..0000000 --- a/tests/default.nf.test +++ /dev/null @@ -1,33 +0,0 @@ -nextflow_pipeline { - - name "Test pipeline" - script "../main.nf" - tag "pipeline" - - test("-profile test") { - - when { - params { - outdir = "$outputDir" - } - } - - then { - // stable_name: All files + folders in ${params.outdir}/ with a stable name - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - assertAll( - { assert workflow.success}, - { assert snapshot( - // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/nf_core_deepmutscan_software_mqc_versions.yml"), - // All stable path name, with a relative path - stable_name, - // All files with stable contents - stable_path - ).match() } - ) - } - } -} diff --git a/tests/nextflow.config b/tests/nextflow.config deleted file mode 100644 index 662ccd0..0000000 --- a/tests/nextflow.config +++ /dev/null @@ -1,14 +0,0 @@ -/* -======================================================================================== - Nextflow config file for running nf-test tests -======================================================================================== -*/ - -// TODO nf-core: Specify any additional parameters here -// Or any resources requirements -params { - modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/deepmutscan' -} - -aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/workflows/deepmutscan.nf b/workflows/deepmutscan.nf index 12ac5d0..2b6bf8d 100644 --- a/workflows/deepmutscan.nf +++ b/workflows/deepmutscan.nf @@ -22,8 +22,8 @@ workflow DEEPMUTSCAN { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = channel.empty() - ch_multiqc_files = channel.empty() + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() // // MODULE: Run FastQC // @@ -36,25 +36,7 @@ workflow DEEPMUTSCAN { // // Collate and save software 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) + softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'deepmutscan_software_' + 'mqc_' + 'versions.yml', @@ -66,24 +48,24 @@ workflow DEEPMUTSCAN { // // MODULE: MultiQC // - ch_multiqc_config = channel.fromPath( + ch_multiqc_config = Channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - channel.fromPath(params.multiqc_config, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() ch_multiqc_logo = params.multiqc_logo ? - channel.fromPath(params.multiqc_logo, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = channel.value( + ch_methods_description = Channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From 2fa2a24ce7959f6b3137d9ce098f4075927ef0e4 Mon Sep 17 00:00:00 2001 From: BenjaminWehnert1008 <84199433+BenjaminWehnert1008@users.noreply.github.com> Date: Mon, 9 Feb 2026 11:55:42 +0100 Subject: [PATCH 3/4] Update .nf-core.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index f23f386..d2ae8e1 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.1.2 +nf_core_version: 3.5.2 repository_type: pipeline template: author: Benjamin Wehnert & Max Stammnitz From 2ddc12a352e8a1e85302014e5676b4243eb14098 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 9 Feb 2026 10:58:55 +0000 Subject: [PATCH 4/4] [automated] Fix code linting --- docs/output.md | 18 ++++++++++-------- docs/usage.md | 1 + nextflow_schema.json | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/output.md b/docs/output.md index 116e114..dfbbbef 100644 --- a/docs/output.md +++ b/docs/output.md @@ -75,23 +75,24 @@ This directory is created during the second series of steps of the pipeline, fea Output files - `library_QC/` + - `counts_heatmap.pdf`: a complete heatmap of absolute mutant counts, stratified by mutant amino acid (Y-axis) per position (X-axis) -![Count heatmap](images/library_QC_counts_heatmap.png) + ![Count heatmap](images/library_QC_counts_heatmap.png) - `counts_per_cov_heatmap.pdf`: as above, but as a fraction of the total sequencing coverage - `logdiff_plot.pdf`: sorted, log-scale coverage distribution of all mutants -![Logarithmic count differences](images/library_QC_logdiff_plot.png) + ![Logarithmic count differences](images/library_QC_logdiff_plot.png) - `logdiff_varying_bases.pdf`: as above, but stratified by hamming distance to the wildtype nucleotide sequence (colour shading) - `rolling_coverage.pdf`: sliding-window rolling coverage -![Rolling coverage](images/library_QC_rolling_coverage.png) + ![Rolling coverage](images/library_QC_rolling_coverage.png) - `rolling_counts.pdf`: sliding-window rolling coverage, stratified by hamming distance to the wildtype nucleotide sequence (colour shading) -![Rolling counts](images/library_QC_rolling_counts.png) + ![Rolling counts](images/library_QC_rolling_counts.png) - `rolling_counts_per_cov.pdf`: as above, but as a fraction of the total sequencing coverage - `SeqDepth.pdf` (optional via the `--run_seqdepth` argument): rarefaction curve of the sequencing coverage and how it relates to the percentage of programmed variants detected -![Sequencing coverage rarefaction](images/library_QC_SeqDepth.png) + ![Sequencing coverage rarefaction](images/library_QC_SeqDepth.png)
@@ -103,15 +104,16 @@ This directory is created during the final series of steps of the pipeline, feat Output files - `fitness/` + - `counts_merged.tsv`: summarised gene variant counts across all input and output samples - `default_results/fitness_estimation_count_correlation.pdf`: pair-wise replicate variant count scatterplots and correlations between all specified samples -![Variant count correlation(s)](images/fitness_estimation_count_correlation.png) + ![Variant count correlation(s)](images/fitness_estimation_count_correlation.png) - `default_results/fitness_estimation_fitness_correlation.pdf`: pair-wise fitness replicate scatterplots and correlations between all specified output samples -![Fitness correlation(s)](images/fitness_estimation_fitness_correlation.png) + ![Fitness correlation(s)](images/fitness_estimation_fitness_correlation.png) - `default_results/fitness_heatmap.pdf`: a complete heatmap of absolute mutant counts, stratified by mutant amino acid (Y-axis) per position (X-axis) -![Default fitness heatmap](images/fitness_heatmap.png) + ![Default fitness heatmap](images/fitness_heatmap.png) - `default_results/fitness_estimation.tsv`: table file with all fitness and fitness error estimates calculated - `DiMSum_results/dimsum_results/` (optional): subfolder with the full set of [DiMSum](https://github.com/lehner-lab/DiMSum) outputs, including the associated `.HTML` report, `.Rdata` and `.tsv` files with fitness and fitness error estimates diff --git a/docs/usage.md b/docs/usage.md index 9202adb..c4067f6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -153,6 +153,7 @@ This module will feature strategies to distinguish true single nucleotide varian The final step of the pipeline will perform fitness estimation based on mutation counts. By default, we calculate fitness scores as the logarithm of variants' output to input ratio, normalised to that of the provided wildtype nucleotide sequence. Future expansions may include: + - Integration of other popular fitness inference tools, including [DiMSum](https://github.com/lehner-lab/DiMSum), [Enrich2](https://github.com/FowlerLab/Enrich2), [rosace](https://github.com/pimentellab/rosace/) and [mutscan](https://github.com/fmicompbio/mutscan) - Standardised output formats for downstream analyses and comparison diff --git a/nextflow_schema.json b/nextflow_schema.json index 67b684f..706dcb2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -52,12 +52,12 @@ "minimum": 1, "default": 3 }, - "sliding_window_size": { + "sliding_window_size": { "type": "integer", "description": "To flatten graphs in plots (e.g. `GLOBAL_POS_BIASES_COUNTS` function)", "default": 10 }, - "aimed_cov": { + "aimed_cov": { "type": "integer", "description": "aimed coverage (assuming equal spread) to visualize threshold in plots", "default": 100