From c4975fc8c2c05f1275d27823dd8b2de87de43742 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 8 Dec 2022 13:09:46 +0000 Subject: [PATCH 01/29] Template update for nf-core/tools version 2.7.1 --- .devcontainer/devcontainer.json | 27 ++++++ .editorconfig | 2 +- .gitattributes | 1 + .github/CONTRIBUTING.md | 34 +++++-- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +- .github/ISSUE_TEMPLATE/config.yml | 6 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 9 +- .github/workflows/awsfulltest.yml | 10 ++- .github/workflows/awstest.yml | 10 ++- .github/workflows/branch.yml | 4 +- .github/workflows/ci.yml | 31 +++---- .github/workflows/fix-linting.yml | 8 +- .github/workflows/linting.yml | 54 ++++++++--- .github/workflows/linting_comment.yml | 2 +- .prettierignore | 3 + CHANGELOG.md | 4 +- CITATIONS.md | 2 +- README.md | 43 ++++----- assets/adaptivecard.json | 67 ++++++++++++++ assets/email_template.html | 14 +-- assets/email_template.txt | 11 ++- assets/methods_description_template.yml | 25 ++++++ assets/multiqc_config.yml | 10 ++- assets/nf-core-fastquorum_logo_light.png | Bin 0 -> 11321 bytes assets/nf-core-fgcons_logo_light.png | Bin 10838 -> 0 bytes assets/schema_input.json | 4 +- assets/sendmail_template.txt | 6 +- assets/slackreport.json | 34 +++++++ bin/check_samplesheet.py | 48 +++++----- conf/base.config | 7 +- conf/test.config | 2 +- conf/test_full.config | 2 +- docs/README.md | 4 +- docs/images/nf-core-fastquorum_logo_dark.png | Bin 0 -> 78253 bytes docs/images/nf-core-fastquorum_logo_light.png | Bin 0 -> 78152 bytes docs/images/nf-core-fgcons_logo_dark.png | Bin 73777 -> 0 bytes docs/images/nf-core-fgcons_logo_light.png | Bin 73647 -> 0 bytes docs/output.md | 2 +- docs/usage.md | 52 +++++++---- lib/NfcoreSchema.groovy | 1 - lib/NfcoreTemplate.groovy | 84 +++++++++++++++++- lib/Utils.groovy | 21 +++-- ...gcons.groovy => WorkflowFastquorum.groovy} | 24 ++++- lib/WorkflowMain.groovy | 27 +++--- main.nf | 19 ++-- modules.json | 32 ++++--- modules/local/samplesheet_check.nf | 6 +- .../custom/dumpsoftwareversions/main.nf | 8 +- .../custom/dumpsoftwareversions/meta.yml | 0 .../templates/dumpsoftwareversions.py | 14 +-- modules/nf-core/{modules => }/fastqc/main.nf | 12 +++ modules/nf-core/{modules => }/fastqc/meta.yml | 0 modules/nf-core/modules/multiqc/main.nf | 31 ------- modules/nf-core/multiqc/main.nf | 53 +++++++++++ .../nf-core/{modules => }/multiqc/meta.yml | 15 ++++ nextflow.config | 48 +++++++--- nextflow_schema.json | 30 ++++++- pyproject.toml | 10 +++ workflows/{fgcons.nf => fastquorum.nf} | 35 +++++--- 60 files changed, 739 insertions(+), 277 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 assets/adaptivecard.json create mode 100644 assets/methods_description_template.yml create mode 100644 assets/nf-core-fastquorum_logo_light.png delete mode 100644 assets/nf-core-fgcons_logo_light.png create mode 100644 assets/slackreport.json create mode 100644 docs/images/nf-core-fastquorum_logo_dark.png create mode 100644 docs/images/nf-core-fastquorum_logo_light.png delete mode 100644 docs/images/nf-core-fgcons_logo_dark.png delete mode 100644 docs/images/nf-core-fgcons_logo_light.png mode change 100755 => 100644 lib/Utils.groovy rename lib/{WorkflowFgcons.groovy => WorkflowFastquorum.groovy} (69%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/main.nf (79%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py (88%) rename modules/nf-core/{modules => }/fastqc/main.nf (85%) rename modules/nf-core/{modules => }/fastqc/meta.yml (100%) delete mode 100644 modules/nf-core/modules/multiqc/main.nf create mode 100644 modules/nf-core/multiqc/main.nf rename modules/nf-core/{modules => }/multiqc/meta.yml (73%) create mode 100644 pyproject.toml rename workflows/{fgcons.nf => fastquorum.nf} (71%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..ea27a58 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +{ + "name": "nfcore", + "image": "nfcore/gitpod:latest", + "remoteUser": "gitpod", + + // 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", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/opt/conda/bin/autopep8", + "python.formatting.yapfPath": "/opt/conda/bin/yapf", + "python.linting.flake8Path": "/opt/conda/bin/flake8", + "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", + "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", + "python.linting.pylintPath": "/opt/conda/bin/pylint" + }, + + // 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/.editorconfig b/.editorconfig index b6b3190..b78de6e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js}] +[*.{md,yml,yaml,html,css,scss,js,cff}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.gitattributes b/.gitattributes index 050bb12..7a2dabc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.config linguist-language=nextflow +*.nf.test linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index bfce578..54b5f87 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,22 +1,22 @@ -# nf-core/fgcons: Contributing Guidelines +# nf-core/fastquorum: Contributing Guidelines Hi there! -Many thanks for taking an interest in improving nf-core/fgcons. +Many thanks for taking an interest in improving nf-core/fastquorum. -We try to manage the required tasks for nf-core/fgcons using GitHub issues, you probably came to this page when creating one. +We try to manage the required tasks for nf-core/fastquorum using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) -> If you need help using or modifying nf-core/fgcons then the best place to ask is on the nf-core Slack [#fgcons](https://nfcore.slack.com/channels/fgcons) channel ([join our Slack here](https://nf-co.re/join/slack)). +> If you need help using or modifying nf-core/fastquorum then the best place to ask is on the nf-core Slack [#fastquorum](https://nfcore.slack.com/channels/fastquorum) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow -If you'd like to write some code for nf-core/fgcons, the standard workflow is as follows: +If you'd like to write some code for nf-core/fastquorum, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/fgcons issues](https://github.com/nf-core/fgcons/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/fgcons repository](https://github.com/nf-core/fgcons) to your GitHub account +1. Check that there isn't already an issue about your idea in the [nf-core/fastquorum issues](https://github.com/nf-core/fastquorum/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/fastquorum repository](https://github.com/nf-core/fastquorum) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged @@ -54,11 +54,11 @@ These tests are run both with the latest available version of `Nextflow` and als ## Getting help -For further information/help, please consult the [nf-core/fgcons documentation](https://nf-co.re/fgcons/usage) and don't hesitate to get in touch on the nf-core Slack [#fgcons](https://nfcore.slack.com/channels/fgcons) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/fastquorum documentation](https://nf-co.re/fastquorum/usage) and don't hesitate to get in touch on the nf-core Slack [#fastquorum](https://nfcore.slack.com/channels/fastquorum) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Pipeline contribution conventions -To make the nf-core/fgcons code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. +To make the nf-core/fastquorum code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. ### Adding a new step @@ -101,3 +101,19 @@ If you are using a new feature from core Nextflow, you may bump the minimum requ ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). + +## GitHub Codespaces + +This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. + +To get started: + +- Open the repo in [Codespaces](https://github.com/nf-core/fastquorum/codespaces) +- Tools installed + - nf-core + - Nextflow + +Devcontainer specs: + +- [DevContainer config](.devcontainer/devcontainer.json) +- [Dockerfile](.devcontainer/Dockerfile) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4225720..d02e013 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -8,7 +8,7 @@ body: Before you post this issue, please check the documentation: - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) - - [nf-core/fgcons pipeline documentation](https://nf-co.re/fgcons/usage) + - [nf-core/fastquorum pipeline documentation](https://nf-co.re/fastquorum/usage) - type: textarea id: description @@ -42,9 +42,9 @@ body: attributes: label: System information description: | - * Nextflow version _(eg. 21.10.3)_ + * Nextflow version _(eg. 22.10.1)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - * Version of nf-core/fgcons _(eg. 1.1, 1.5, 1.8.2)_ + * Version of nf-core/fastquorum _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index d81b0ca..1a4c100 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,6 +2,6 @@ contact_links: - name: Join nf-core url: https://nf-co.re/join about: Please join the nf-core community here - - name: "Slack #fgcons channel" - url: https://nfcore.slack.com/channels/fgcons - about: Discussion about the nf-core/fgcons pipeline + - name: "Slack #fastquorum channel" + url: https://nfcore.slack.com/channels/fastquorum + about: Discussion about the nf-core/fastquorum pipeline diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index becb397..0006e1b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Suggest an idea for the nf-core/fgcons pipeline +description: Suggest an idea for the nf-core/fastquorum pipeline labels: enhancement body: - type: textarea diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2321ecb..924d814 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,22 +1,21 @@ ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/fgcons/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/fgcons _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/fastquorum/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/fastquorum _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 547afc2..15c45d8 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -10,7 +10,7 @@ on: jobs: run-tower: name: Run AWS full tests - if: github.repository == 'nf-core/fgcons' + if: github.repository == 'nf-core/fastquorum' runs-on: ubuntu-latest steps: - name: Launch workflow via tower @@ -22,9 +22,13 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fgcons/work-${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fastquorum/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fgcons/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fastquorum/results-${{ github.sha }}" } profiles: test_full,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index aca7a6c..3a92b5f 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -7,7 +7,7 @@ on: jobs: run-tower: name: Run AWS tests - if: github.repository == 'nf-core/fgcons' + if: github.repository == 'nf-core/fastquorum' runs-on: ubuntu-latest steps: # Launch workflow using Tower CLI tool action @@ -17,9 +17,13 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fgcons/work-${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fastquorum/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fgcons/results-test-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fastquorum/results-test-${{ github.sha }}" } profiles: test,aws_tower + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 5f8d359..f872e5b 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -11,9 +11,9 @@ jobs: steps: # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs - if: github.repository == 'nf-core/fgcons' + if: github.repository == 'nf-core/fastquorum' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/fgcons ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/fastquorum ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c502539..0160c9e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,37 +10,30 @@ on: env: NXF_ANSI_LOG: false - CAPSULE_LOG: none + +concurrency: + group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" + cancel-in-progress: true jobs: test: name: Run pipeline with test data # 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/fgcons') }}" + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fastquorum') }}" runs-on: ubuntu-latest strategy: matrix: - # Nextflow versions - include: - # Test pipeline minimum Nextflow version - - NXF_VER: "21.10.3" - NXF_EDGE: "" - # Test latest edge release of Nextflow - - NXF_VER: "" - NXF_EDGE: "1" + NXF_VER: + - "22.10.1" + - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow - env: - NXF_VER: ${{ matrix.NXF_VER }} - # Uncomment only if the edge release is more recent than the latest stable release - # See https://github.com/nextflow-io/nextflow/issues/2467 - # NXF_EDGE: ${{ matrix.NXF_EDGE }} - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 + with: + version: "${{ matrix.NXF_VER }}" - name: Run pipeline with test data # TODO nf-core: You can customise CI pipeline run tests as required diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index d9bbb43..cac3379 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -9,7 +9,7 @@ jobs: if: > contains(github.event.comment.html_url, '/pull/') && contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'nf-core/fgcons' + github.repository == 'nf-core/fastquorum' runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later @@ -24,7 +24,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @prettier/plugin-php @@ -34,9 +34,9 @@ jobs: id: prettier_status run: | if prettier --check ${GITHUB_WORKSPACE}; then - echo "::set-output name=result::pass" + echo "name=result::pass" >> $GITHUB_OUTPUT else - echo "::set-output name=result::fail" + echo "name=result::fail" >> $GITHUB_OUTPUT fi - name: Run 'prettier --write' diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 77358de..858d622 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -4,6 +4,8 @@ name: nf-core linting # that the code meets the nf-core guidelines. on: push: + branches: + - dev pull_request: release: types: [published] @@ -12,9 +14,9 @@ jobs: EditorConfig: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -25,9 +27,9 @@ jobs: Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 - name: Install Prettier run: npm install -g prettier @@ -35,22 +37,48 @@ jobs: - name: Run Prettier --check run: prettier --check ${GITHUB_WORKSPACE} + PythonBlack: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Check code lints with Black + uses: psf/black@stable + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## Python linting (`black`) is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` + * Fix formatting errors in your pipeline: `black .` + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + nf-core: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Nextflow - env: - CAPSULE_LOG: none - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 with: - python-version: "3.6" + python-version: "3.7" architecture: "x64" - name: Install dependencies @@ -71,7 +99,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 04758f6..3963518 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -18,7 +18,7 @@ jobs: - name: Get PR number id: pr_number - run: echo "::set-output name=pr_number::$(cat linting-logs/PR_number.txt)" + run: echo "name=pr_number::$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment uses: marocchino/sticky-pull-request-comment@v2 diff --git a/.prettierignore b/.prettierignore index d0e7ae5..437d763 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,6 @@ email_template.html +adaptivecard.json +slackreport.json .nextflow* work/ data/ @@ -7,3 +9,4 @@ results/ testing/ testing* *.pyc +bin/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 106702b..3bbf99d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ -# nf-core/fgcons: Changelog +# nf-core/fastquorum: Changelog The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## v1.0dev - [date] -Initial release of nf-core/fgcons, created with the [nf-core](https://nf-co.re/) template. +Initial release of nf-core/fastquorum, created with the [nf-core](https://nf-co.re/) template. ### `Added` diff --git a/CITATIONS.md b/CITATIONS.md index 39384d1..779af6d 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,4 +1,4 @@ -# nf-core/fgcons: Citations +# nf-core/fastquorum: Citations ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) diff --git a/README.md b/README.md index 57f9bc6..c2effdb 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,26 @@ -# ![nf-core/fgcons](docs/images/nf-core-fgcons_logo_light.png#gh-light-mode-only) ![nf-core/fgcons](docs/images/nf-core-fgcons_logo_dark.png#gh-dark-mode-only) +# ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_light.png#gh-light-mode-only) ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_dark.png#gh-dark-mode-only) -[![GitHub Actions CI Status](https://github.com/nf-core/fgcons/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fgcons/actions?query=workflow%3A%22nf-core+CI%22) -[![GitHub Actions Linting Status](https://github.com/nf-core/fgcons/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fgcons/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/fgcons/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fastquorum/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) -[![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/fgcons) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-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 Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/fastquorum) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23fgcons-4A154B?logo=slack)](https://nfcore.slack.com/channels/fgcons) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23fastquorum-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/fastquorum)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/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 -**nf-core/fgcons** is a bioinformatics best-practice analysis pipeline for fgbio Best Practices FASTQ to Consensus Pipeline. +**nf-core/fastquorum** is a bioinformatics best-practice analysis pipeline for fgbio Best Practices FASTQ to Consensus Pipeline. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/fgcons/results). +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/fastquorum/results). ## Pipeline summary @@ -36,14 +31,14 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=22.10.1`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/fgcons -profile test,YOURPROFILE --outdir + ```bash + nextflow run nf-core/fastquorum -profile test,YOURPROFILE --outdir ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. @@ -57,17 +52,17 @@ On release, automated continuous integration tests run the pipeline on a full-si - ```console - nextflow run nf-core/fgcons --input samplesheet.csv --outdir --genome GRCh37 -profile + ```bash + nextflow run nf-core/fastquorum --input samplesheet.csv --outdir --genome GRCh37 -profile ``` ## Documentation -The nf-core/fgcons pipeline comes with documentation about the pipeline [usage](https://nf-co.re/fgcons/usage), [parameters](https://nf-co.re/fgcons/parameters) and [output](https://nf-co.re/fgcons/output). +The nf-core/fastquorum pipeline comes with documentation about the pipeline [usage](https://nf-co.re/fastquorum/usage), [parameters](https://nf-co.re/fastquorum/parameters) and [output](https://nf-co.re/fastquorum/output). ## Credits -nf-core/fgcons was originally written by Nils Homer. +nf-core/fastquorum was originally written by Nils Homer. We thank the following people for their extensive assistance in the development of this pipeline: @@ -77,12 +72,12 @@ We thank the following people for their extensive assistance in the development If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). -For further information or help, don't hesitate to get in touch on the [Slack `#fgcons` channel](https://nfcore.slack.com/channels/fgcons) (you can join with [this invite](https://nf-co.re/join/slack)). +For further information or help, don't hesitate to get in touch on the [Slack `#fastquorum` channel](https://nfcore.slack.com/channels/fastquorum) (you can join with [this invite](https://nf-co.re/join/slack)). ## Citations - + diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json new file mode 100644 index 0000000..50d02c1 --- /dev/null +++ b/assets/adaptivecard.json @@ -0,0 +1,67 @@ +{ + "type": "message", + "attachments": [ + { + "contentType": "application/vnd.microsoft.card.adaptive", + "contentUrl": null, + "content": { + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "msteams": { + "width": "Full" + }, + "type": "AdaptiveCard", + "version": "1.2", + "body": [ + { + "type": "TextBlock", + "size": "Large", + "weight": "Bolder", + "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", + "text": "nf-core/fastquorum v${version} - ${runName}", + "wrap": true + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Completed at ${dateComplete} (duration: ${duration})", + "isSubtle": true, + "wrap": true + }, + { + "type": "TextBlock", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors. The full error message was: ${errorReport}.<% } %>", + "wrap": true + }, + { + "type": "TextBlock", + "text": "The command used to launch the workflow was as follows:", + "wrap": true + }, + { + "type": "TextBlock", + "text": "${commandLine}", + "isSubtle": true, + "wrap": true + } + ], + "actions": [ + { + "type": "Action.ShowCard", + "title": "Pipeline Configuration", + "card": { + "type": "AdaptiveCard", + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "body": [ + { + "type": "FactSet", + "facts": [<% out << summary.collect{ k,v -> "{\"title\": \"$k\", \"value\" : \"$v\"}"}.join(",\n") %> + ] + } + ] + } + } + ] + } + } + ] +} diff --git a/assets/email_template.html b/assets/email_template.html index cd726fb..99b571b 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -4,21 +4,21 @@ - - nf-core/fgcons Pipeline Report + + nf-core/fastquorum Pipeline Report
-

nf-core/fgcons v${version}

+

nf-core/fastquorum v${version}

Run Name: $runName

<% if (!success){ out << """
-

nf-core/fgcons execution completed unsuccessfully!

+

nf-core/fastquorum execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

${errorReport}
@@ -27,7 +27,7 @@

nf-core/fgcons execution completed uns } else { out << """
- nf-core/fgcons execution completed successfully! + nf-core/fastquorum execution completed successfully!
""" } @@ -44,8 +44,8 @@

Pipeline Configuration:

-

nf-core/fgcons

-

https://github.com/nf-core/fgcons

+

nf-core/fastquorum

+

https://github.com/nf-core/fastquorum

diff --git a/assets/email_template.txt b/assets/email_template.txt index fc60157..ca1dde7 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -4,16 +4,15 @@ |\\ | |__ __ / ` / \\ |__) |__ } { | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, `._,._,' - nf-core/fgcons v${version} + nf-core/fastquorum v${version} ---------------------------------------------------- - Run Name: $runName <% if (success){ - out << "## nf-core/fgcons execution completed successfully! ##" + out << "## nf-core/fastquorum execution completed successfully! ##" } else { out << """#################################################### -## nf-core/fgcons execution completed unsuccessfully! ## +## nf-core/fastquorum execution completed unsuccessfully! ## #################################################### The exit status of the task that caused the workflow execution to fail was: $exitStatus. The full error message was: @@ -36,5 +35,5 @@ Pipeline Configuration: <% out << summary.collect{ k,v -> " - $k: $v" }.join("\n") %> -- -nf-core/fgcons -https://github.com/nf-core/fgcons +nf-core/fastquorum +https://github.com/nf-core/fastquorum diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml new file mode 100644 index 0000000..be1bd6d --- /dev/null +++ b/assets/methods_description_template.yml @@ -0,0 +1,25 @@ +id: "nf-core-fastquorum-methods-description" +description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." +section_name: "nf-core/fastquorum Methods Description" +section_href: "https://github.com/nf-core/fastquorum" +plot_type: "html" +## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## You inject any metadata in the Nextflow '${workflow}' object +data: | +

Methods

+

Data was processed using nf-core/fastquorum v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).

+

The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

+
${workflow.commandLine}
+

References

+
    +
  • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
  • +
  • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
  • +
+
+
Notes:
+
    + ${nodoi_text} +
  • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
  • +
  • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
  • +
+
diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 3b1f275..5b3a26d 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,11 +1,13 @@ report_comment: > - This report has been generated by the nf-core/fgcons + This report has been generated by the nf-core/fastquorum analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: - software_versions: + "nf-core-fastquorum-methods-description": order: -1000 - "nf-core-fgcons-summary": + software_versions: order: -1001 + "nf-core-fastquorum-summary": + order: -1002 export_plots: true diff --git a/assets/nf-core-fastquorum_logo_light.png b/assets/nf-core-fastquorum_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2647a93c497cefc7245d27423d5898239f1e6b GIT binary patch literal 11321 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 diff --git a/assets/schema_input.json b/assets/schema_input.json index 60ddd8f..03b8f87 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema", - "$id": "https://raw.githubusercontent.com/nf-core/fgcons/master/assets/schema_input.json", - "title": "nf-core/fgcons pipeline - params.input schema", + "$id": "https://raw.githubusercontent.com/nf-core/fastquorum/master/assets/schema_input.json", + "title": "nf-core/fastquorum pipeline - params.input schema", "description": "Schema for the file provided with params.input", "type": "array", "items": { diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 8ea8294..18767e4 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -9,12 +9,12 @@ Content-Type: text/html; charset=utf-8 $email_html --nfcoremimeboundary -Content-Type: image/png;name="nf-core-fgcons_logo.png" +Content-Type: image/png;name="nf-core-fastquorum_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-fgcons_logo_light.png" +Content-Disposition: inline; filename="nf-core-fastquorum_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-fgcons_logo_light.png"). +<% out << new File("$projectDir/assets/nf-core-fastquorum_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/assets/slackreport.json b/assets/slackreport.json new file mode 100644 index 0000000..043d02f --- /dev/null +++ b/assets/slackreport.json @@ -0,0 +1,34 @@ +{ + "attachments": [ + { + "fallback": "Plain-text summary of the attachment.", + "color": "<% if (success) { %>good<% } else { %>danger<%} %>", + "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", + "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", + "fields": [ + { + "title": "Command used to launch the workflow", + "value": "```${commandLine}```", + "short": false + } + <% + if (!success) { %> + , + { + "title": "Full error message", + "value": "```${errorReport}```", + "short": false + }, + { + "title": "Pipeline configuration", + "value": "<% out << summary.collect{ k,v -> k == "hook_url" ? "_${k}_: (_hidden_)" : ( ( v.class.toString().contains('Path') || ( v.class.toString().contains('String') && v.contains('/') ) ) ? "_${k}_: `${v}`" : (v.class.toString().contains('DateTime') ? ("_${k}_: " + v.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM))) : "_${k}_: ${v}") ) }.join(",\n") %>", + "short": false + } + <% } + %> + ], + "footer": "Completed at <% out << dateComplete.format(java.time.format.DateTimeFormatter.ofLocalizedDateTime(java.time.format.FormatStyle.MEDIUM)) %> (duration: ${duration})" + } + ] +} diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 3652c63..11b1557 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -11,7 +11,6 @@ from collections import Counter from pathlib import Path - logger = logging.getLogger() @@ -79,13 +78,15 @@ def validate_and_transform(self, row): def _validate_sample(self, row): """Assert that the sample name exists and convert spaces to underscores.""" - assert len(row[self._sample_col]) > 0, "Sample input is required." + if len(row[self._sample_col]) <= 0: + raise AssertionError("Sample input is required.") # Sanitize samples slightly. row[self._sample_col] = row[self._sample_col].replace(" ", "_") def _validate_first(self, row): """Assert that the first FASTQ entry is non-empty and has the right format.""" - assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + if len(row[self._first_col]) <= 0: + raise AssertionError("At least the first FASTQ file is required.") self._validate_fastq_format(row[self._first_col]) def _validate_second(self, row): @@ -97,36 +98,36 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - assert ( - Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] - ), "FASTQ pairs must have the same file extensions." + first_col_suffix = Path(row[self._first_col]).suffixes[-2:] + second_col_suffix = Path(row[self._second_col]).suffixes[-2:] + if first_col_suffix != second_col_suffix: + raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True def _validate_fastq_format(self, filename): """Assert that a given filename has one of the expected FASTQ extensions.""" - assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( - f"The FASTQ file has an unrecognized extension: {filename}\n" - f"It should be one of: {', '.join(self.VALID_FORMATS)}" - ) + if not any(filename.endswith(extension) for extension in self.VALID_FORMATS): + raise AssertionError( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" + ) def validate_unique_samples(self): """ Assert that the combination of sample name and FASTQ filename is unique. - In addition to the validation, also rename the sample if more than one sample, - FASTQ file combination exists. + In addition to the validation, also rename all samples to have a suffix of _T{n}, where n is the + number of times the same sample exist, but with different FASTQ files, e.g., multiple runs per experiment. """ - assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." - if len({pair[0] for pair in self._seen}) < len(self._seen): - counts = Counter(pair[0] for pair in self._seen) - seen = Counter() - for row in self.modified: - sample = row[self._sample_col] - seen[sample] += 1 - if counts[sample] > 1: - row[self._sample_col] = f"{sample}_T{seen[sample]}" + if len(self._seen) != len(self.modified): + raise AssertionError("The pair of sample name and FASTQ must be unique.") + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + row[self._sample_col] = f"{sample}_T{seen[sample]}" def read_head(handle, num_lines=10): @@ -158,7 +159,7 @@ def sniff_format(handle): handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): - logger.critical(f"The given sample sheet does not appear to contain a header.") + logger.critical("The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) return dialect @@ -196,7 +197,8 @@ def check_samplesheet(file_in, file_out): reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) # Validate the existence of the expected header columns. if not required_columns.issubset(reader.fieldnames): - logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + req_cols = ", ".join(required_columns) + logger.critical(f"The sample sheet **must** contain these column headers: {req_cols}.") sys.exit(1) # Validate each row. checker = RowChecker() diff --git a/conf/base.config b/conf/base.config index b1aa477..68faf9e 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - nf-core/fgcons Nextflow base config file + nf-core/fastquorum Nextflow base config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on @@ -26,6 +26,11 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_single { + cpus = { check_max( 1 , 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 12.GB * task.attempt, 'memory' ) } diff --git a/conf/test.config b/conf/test.config index 75e0ec4..54763ab 100644 --- a/conf/test.config +++ b/conf/test.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run nf-core/fgcons -profile test, --outdir + nextflow run nf-core/fastquorum -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index 6ccdd68..8a07aba 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run nf-core/fgcons -profile test_full, --outdir + nextflow run nf-core/fastquorum -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/README.md b/docs/README.md index 7a6ca51..3aa6beb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# nf-core/fgcons: Documentation +# nf-core/fastquorum: Documentation -The nf-core/fgcons documentation is split into the following pages: +The nf-core/fastquorum documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. diff --git a/docs/images/nf-core-fastquorum_logo_dark.png b/docs/images/nf-core-fastquorum_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e5310776c53bd3de6efe195cafe2589b314fc8f2 GIT binary patch literal 78253 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 z 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 T%V2ICGLqIgT|&XxtGE6S1##2l literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-fastquorum_logo_light.png b/docs/images/nf-core-fastquorum_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4284651a391d8cc76c2d97c4cc90baa128bff4c9 GIT binary patch literal 78152 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 CT(X$} diff --git a/docs/images/nf-core-fgcons_logo_light.png b/docs/images/nf-core-fgcons_logo_light.png deleted file mode 100644 index b7394e3788e39d286652db59f8411c5125411eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73647 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| 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


RM 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 Hb^QMWG237T diff --git a/docs/output.md b/docs/output.md index 6c550f5..1023e93 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,4 +1,4 @@ -# nf-core/fgcons: Output +# nf-core/fastquorum: Output ## Introduction diff --git a/docs/usage.md b/docs/usage.md index f9afa82..73ee6f0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,6 +1,6 @@ -# nf-core/fgcons: Usage +# nf-core/fastquorum: Usage -## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/fgcons/usage](https://nf-co.re/fgcons/usage) +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/fastquorum/usage](https://nf-co.re/fastquorum/usage) > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ @@ -12,7 +12,7 @@ You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. -```console +```bash --input '[path to samplesheet file]' ``` @@ -56,17 +56,17 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: -```console -nextflow run nf-core/fgcons --input samplesheet.csv --outdir --genome GRCh37 -profile docker +```bash +nextflow run nf-core/fastquorum --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. Note that the pipeline will create the following files in your working directory: -```console +```bash work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) + # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -75,17 +75,17 @@ work # Directory containing the nextflow working files When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```console -nextflow pull nf-core/fgcons +```bash +nextflow pull nf-core/fastquorum ``` ### Reproducibility It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [nf-core/fgcons releases page](https://github.com/nf-core/fgcons/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. +First, go to the [nf-core/fastquorum releases page](https://github.com/nf-core/fastquorum/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. ## Core Nextflow arguments @@ -95,7 +95,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. When using Biocontainers, most of these software packaging methods pull Docker containers from quay.io e.g [FastQC](https://quay.io/repository/biocontainers/fastqc) except for Singularity which directly downloads Singularity images via https hosted by the [Galaxy project](https://depot.galaxyproject.org/singularity/) and Conda which downloads and installs software locally from [Bioconda](https://bioconda.github.io/). +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -104,8 +104,11 @@ The pipeline also dynamically loads configurations from [https://github.com/nf-c Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! They are loaded in sequence, so later profiles can overwrite earlier profiles. -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. +If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer enviroment. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters - `docker` - A generic configuration profile to be used with [Docker](https://docker.com/) - `singularity` @@ -118,9 +121,6 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `conda` - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters ### `-resume` @@ -169,8 +169,14 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` +#### For beginners + +A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. + +#### Advanced option on process level + To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. @@ -189,7 +195,7 @@ process { > > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. -### Updating containers +### Updating containers (advanced users) The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. @@ -237,6 +243,14 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). +## Azure Resource Requests + +To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. +We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. + +Note that the choice of VM size depends on your quota and the overall workload during the analysis. +For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). + ## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -251,6 +265,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```console +```bash NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index b3d092f..33cd4f6 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -46,7 +46,6 @@ class NfcoreSchema { 'quiet', 'syslog', 'v', - 'version', // Options for `nextflow run` command 'ansi', diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 2fc0a9b..25a0a74 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -32,6 +32,25 @@ class NfcoreTemplate { } } + // + // Generate version string + // + public static String version(workflow) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string + } + // // Construct and send completion email // @@ -61,7 +80,7 @@ class NfcoreTemplate { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = workflow.manifest.version + email_fields['version'] = NfcoreTemplate.version(workflow) email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -145,6 +164,64 @@ class NfcoreTemplate { output_tf.withWriter { w -> w << email_txt } } + // + // Construct and send a notification to a web server as JSON + // e.g. Microsoft Teams and Slack + // + public static void IM_notification(workflow, params, summary_params, projectDir, log) { + def hook_url = params.hook_url + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['start'] = workflow.start + misc_fields['complete'] = workflow.complete + misc_fields['scriptfile'] = workflow.scriptFile + misc_fields['scriptid'] = workflow.scriptId + if (workflow.repository) misc_fields['repository'] = workflow.repository + if (workflow.commitId) misc_fields['commitid'] = workflow.commitId + if (workflow.revision) misc_fields['revision'] = workflow.revision + misc_fields['nxf_version'] = workflow.nextflow.version + misc_fields['nxf_build'] = workflow.nextflow.build + misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp + + def msg_fields = [:] + msg_fields['version'] = NfcoreTemplate.version(workflow) + msg_fields['runName'] = workflow.runName + msg_fields['success'] = workflow.success + msg_fields['dateComplete'] = workflow.complete + msg_fields['duration'] = workflow.duration + msg_fields['exitStatus'] = workflow.exitStatus + msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + msg_fields['errorReport'] = (workflow.errorReport ?: 'None') + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") + msg_fields['projectDir'] = workflow.projectDir + msg_fields['summary'] = summary << misc_fields + + // Render the JSON template + def engine = new groovy.text.GStringTemplateEngine() + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("$projectDir/assets/${json_path}") + def json_template = engine.createTemplate(hf).make(msg_fields) + def json_message = json_template.toString() + + // POST + def post = new URL(hook_url).openConnection(); + post.setRequestMethod("POST") + post.setDoOutput(true) + post.setRequestProperty("Content-Type", "application/json") + post.getOutputStream().write(json_message.getBytes("UTF-8")); + def postRC = post.getResponseCode(); + if (! postRC.equals(200)) { + log.warn(post.getErrorStream().getText()); + } + } + // // Print pipeline summary on completion // @@ -154,7 +231,7 @@ class NfcoreTemplate { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" @@ -242,6 +319,7 @@ class NfcoreTemplate { // public static String logo(workflow, monochrome_logs) { Map colors = logColours(monochrome_logs) + String workflow_version = NfcoreTemplate.version(workflow) String.format( """\n ${dashedLine(monochrome_logs)} @@ -250,7 +328,7 @@ class NfcoreTemplate { ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) diff --git a/lib/Utils.groovy b/lib/Utils.groovy old mode 100755 new mode 100644 index 28567bd..8d030f4 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -21,19 +21,26 @@ class Utils { } // Check that all channels are present - def required_channels = ['conda-forge', 'bioconda', 'defaults'] - def conda_check_failed = !required_channels.every { ch -> ch in channels } + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean // Check that they are in the right order - conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda')) - conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) + def channel_priority_violation = false + def n = required_channels_in_order.size() + for (int i = 0; i < n - 1; i++) { + channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) + } - if (conda_check_failed) { + if (channels_missing | channel_priority_violation) { log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + - " NB: The order of the channels matters!\n" + + " Please refer to https://bioconda.github.io/\n" + + " The observed channel order is \n" + + " ${channels}\n" + + " but the following channel order is required:\n" + + " ${required_channels_in_order}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } diff --git a/lib/WorkflowFgcons.groovy b/lib/WorkflowFastquorum.groovy similarity index 69% rename from lib/WorkflowFgcons.groovy rename to lib/WorkflowFastquorum.groovy index e36e7c4..d415533 100755 --- a/lib/WorkflowFgcons.groovy +++ b/lib/WorkflowFastquorum.groovy @@ -1,8 +1,10 @@ // -// This file holds several functions specific to the workflow/fgcons.nf in the nf-core/fgcons pipeline +// This file holds several functions specific to the workflow/fastquorum.nf in the nf-core/fastquorum pipeline // -class WorkflowFgcons { +import groovy.text.SimpleTemplateEngine + +class WorkflowFastquorum { // // Check and validate parameters @@ -10,6 +12,7 @@ class WorkflowFgcons { public static void initialise(params, log) { genomeExistsError(params, log) + if (!params.fasta) { log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." System.exit(1) @@ -43,7 +46,22 @@ class WorkflowFgcons { return yaml_file_text } - // + public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) { + // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file + def meta = [:] + meta.workflow = run_workflow.toMap() + meta["manifest_map"] = run_workflow.manifest.toMap() + + meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" + meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + + def methods_text = mqc_methods_yaml.text + + def engine = new SimpleTemplateEngine() + def description_html = engine.createTemplate(methods_text).make(meta) + + return description_html + }// // Exit pipeline if incorrect --genome key provided // private static void genomeExistsError(params, log) { diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 584c063..2f43d69 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -1,5 +1,5 @@ // -// This file holds several functions specific to the main.nf workflow in the nf-core/fgcons pipeline +// This file holds several functions specific to the main.nf workflow in the nf-core/fastquorum pipeline // class WorkflowMain { @@ -19,7 +19,7 @@ class WorkflowMain { } // - // Print help to screen if required + // Generate help string // public static String help(workflow, params, log) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" @@ -32,7 +32,7 @@ class WorkflowMain { } // - // Print parameter summary log to screen + // Generate parameter summary log string // public static String paramsSummaryLog(workflow, params, log) { def summary_log = '' @@ -53,14 +53,21 @@ class WorkflowMain { System.exit(0) } - // Validate workflow parameters via the JSON schema - if (params.validate_params) { - NfcoreSchema.validateParameters(workflow, params, log) + // Print workflow version and exit on --version + if (params.version) { + String workflow_version = NfcoreTemplate.version(workflow) + log.info "${workflow.manifest.name} ${workflow_version}" + System.exit(0) } // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Validate workflow parameters via the JSON schema + if (params.validate_params) { + NfcoreSchema.validateParameters(workflow, params, log) + } + // Check that a -profile or Nextflow config has been provided to run the pipeline NfcoreTemplate.checkConfigProvided(workflow, log) @@ -78,17 +85,15 @@ class WorkflowMain { System.exit(1) } } - // // Get attribute from genome config file e.g. fasta // - public static String getGenomeAttribute(params, attribute) { - def val = '' + public static Object getGenomeAttribute(params, attribute) { if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { if (params.genomes[ params.genome ].containsKey(attribute)) { - val = params.genomes[ params.genome ][ attribute ] + return params.genomes[ params.genome ][ attribute ] } } - return val + return null } } diff --git a/main.nf b/main.nf index 3a6d67e..9863ec9 100644 --- a/main.nf +++ b/main.nf @@ -1,11 +1,12 @@ #!/usr/bin/env nextflow /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - nf-core/fgcons + nf-core/fastquorum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Github : https://github.com/nf-core/fgcons - Website: https://nf-co.re/fgcons - Slack : https://nfcore.slack.com/channels/fgcons + Github : https://github.com/nf-core/fastquorum + + Website: https://nf-co.re/fastquorum + Slack : https://nfcore.slack.com/channels/fastquorum ---------------------------------------------------------------------------------------- */ @@ -33,13 +34,13 @@ WorkflowMain.initialise(workflow, params, log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { FGCONS } from './workflows/fgcons' +include { FASTQUORUM } from './workflows/fastquorum' // -// WORKFLOW: Run main nf-core/fgcons analysis pipeline +// WORKFLOW: Run main nf-core/fastquorum analysis pipeline // -workflow NFCORE_FGCONS { - FGCONS () +workflow NFCORE_FASTQUORUM { + FASTQUORUM () } /* @@ -53,7 +54,7 @@ workflow NFCORE_FGCONS { // See: https://github.com/nf-core/rnaseq/issues/619 // workflow { - NFCORE_FGCONS () + NFCORE_FASTQUORUM () } /* diff --git a/modules.json b/modules.json index aafff73..2c53085 100644 --- a/modules.json +++ b/modules.json @@ -1,16 +1,26 @@ { - "name": "nf-core/fgcons", - "homePage": "https://github.com/nf-core/fgcons", + "name": "nf-core/fastquorum", + "homePage": "https://github.com/nf-core/fastquorum", "repos": { - "nf-core/modules": { - "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "https://github.com/nf-core/modules.git": { + "modules": { + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] + }, + "fastqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] + }, + "multiqc": { + "branch": "master", + "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "installed_by": ["modules"] + } + } } } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index b84c7d7..b11315f 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,5 +1,6 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" + label 'process_single' conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,7 +14,10 @@ process SAMPLESHEET_CHECK { path '*.csv' , emit: csv path "versions.yml", emit: versions - script: // This script is bundled with the pipeline, in nf-core/fgcons/bin/ + when: + task.ext.when == null || task.ext.when + + script: // This script is bundled with the pipeline, in nf-core/fastquorum/bin/ """ check_samplesheet.py \\ $samplesheet \\ diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf similarity index 79% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/nf-core/custom/dumpsoftwareversions/main.nf index 327d510..cebb6e0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -1,11 +1,11 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_low' + label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py similarity index 88% rename from modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename to modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index d139039..787bdb7 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,9 +1,10 @@ #!/usr/bin/env python -import yaml import platform from textwrap import dedent +import yaml + def _make_versions_html(versions): html = [ @@ -58,11 +59,12 @@ def _make_versions_html(versions): for process, process_versions in versions_by_process.items(): module = process.split(":")[-1] try: - assert versions_by_module[module] == process_versions, ( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) except KeyError: versions_by_module[module] = process_versions diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/fastqc/main.nf similarity index 85% rename from modules/nf-core/modules/fastqc/main.nf rename to modules/nf-core/fastqc/main.nf index ed6b8c5..0573036 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -44,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml similarity index 100% rename from modules/nf-core/modules/fastqc/meta.yml rename to modules/nf-core/fastqc/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index 1264aac..0000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,31 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - multiqc -f $args . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf new file mode 100644 index 0000000..a8159a5 --- /dev/null +++ b/modules/nf-core/multiqc/main.nf @@ -0,0 +1,53 @@ +process MULTIQC { + label 'process_single' + + conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + + input: + path multiqc_files, stageAs: "?/*" + path(multiqc_config) + path(extra_multiqc_config) + path(multiqc_logo) + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def config = multiqc_config ? "--config $multiqc_config" : '' + def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + """ + multiqc \\ + --force \\ + $args \\ + $config \\ + $extra_config \\ + . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ + + stub: + """ + touch multiqc_data + touch multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml similarity index 73% rename from modules/nf-core/modules/multiqc/meta.yml rename to modules/nf-core/multiqc/meta.yml index 6fa891e..ebc29b2 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -12,11 +12,25 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] + input: - multiqc_files: type: file description: | List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - extra_multiqc_config: + type: file + 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}" + output: - report: type: file @@ -38,3 +52,4 @@ authors: - "@abhi18av" - "@bunop" - "@drpatelh" + - "@jfy133" diff --git a/nextflow.config b/nextflow.config index 6fa562a..1e74d80 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - nf-core/fgcons Nextflow config file + nf-core/fastquorum Nextflow config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- @@ -13,15 +13,17 @@ params { // Input options input = null + // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false - // MultiQC options multiqc_config = null multiqc_title = null + multiqc_logo = null max_multiqc_email_size = '25.MB' + multiqc_methods_description = null // Boilerplate options outdir = null @@ -31,12 +33,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false + hook_url = null help = false + version = false validate_params = true show_hidden_params = false schema_ignore_params = 'genomes' enable_conda = false + // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" @@ -45,6 +50,7 @@ params { config_profile_url = null config_profile_name = null + // Max resource options // Defaults only, expecting to be overwritten max_memory = '128.GB' @@ -63,12 +69,12 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load nf-core/fgcons custom profiles from different institutions. +// Load nf-core/fastquorum custom profiles from different institutions. // Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! // try { -// includeConfig "${params.custom_config_base}/pipeline/fgcons.config" +// includeConfig "${params.custom_config_base}/pipeline/fastquorum.config" // } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/fgcons profiles: ${params.custom_config_base}/pipeline/fgcons.config") +// System.err.println("WARNING: Could not load nf-core/config/fastquorum profiles: ${params.custom_config_base}/pipeline/fastquorum.config") // } @@ -76,6 +82,17 @@ profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { params.enable_conda = true + conda.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + mamba { + params.enable_conda = true + conda.enabled = true + conda.useMamba = true docker.enabled = false singularity.enabled = false podman.enabled = false @@ -90,6 +107,9 @@ profiles { shifter.enabled = false charliecloud.enabled = false } + arm { + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + } singularity { singularity.enabled = true singularity.autoMounts = true @@ -119,10 +139,16 @@ profiles { podman.enabled = false shifter.enabled = false } + gitpod { + executor.name = 'local' + executor.cpus = 16 + executor.memory = 60.GB + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } + // Load igenomes.config if required if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' @@ -130,6 +156,7 @@ if (!params.igenomes_ignore) { params.genomes = [:] } + // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. @@ -163,13 +190,14 @@ dag { } manifest { - name = 'nf-core/fgcons' - author = 'Nils Homer' - homePage = 'https://github.com/nf-core/fgcons' - description = 'fgbio Best Practices FASTQ to Consensus Pipeline' + name = 'nf-core/fastquorum' + author = """Nils Homer""" + homePage = 'https://github.com/nf-core/fastquorum' + description = """fgbio Best Practices FASTQ to Consensus Pipeline""" mainScript = 'main.nf' - nextflowVersion = '!>=21.10.3' + nextflowVersion = '!>=22.10.1' version = '1.0dev' + doi = '' } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index 5a9fe24..0b629cb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema", - "$id": "https://raw.githubusercontent.com/nf-core/fgcons/master/nextflow_schema.json", - "title": "nf-core/fgcons pipeline parameters", + "$id": "https://raw.githubusercontent.com/nf-core/fastquorum/master/nextflow_schema.json", + "title": "nf-core/fastquorum pipeline parameters", "description": "fgbio Best Practices FASTQ to Consensus Pipeline", "type": "object", "definitions": { @@ -19,7 +19,7 @@ "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/fgcons/usage#samplesheet-input).", + "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/fastquorum/usage#samplesheet-input).", "fa_icon": "fas fa-file-csv" }, "outdir": { @@ -176,6 +176,12 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, "publish_dir_mode": { "type": "string", "default": "copy", @@ -213,12 +219,30 @@ "fa_icon": "fas fa-palette", "hidden": true }, + "hook_url": { + "type": "string", + "description": "Incoming hook URL for messaging service", + "fa_icon": "fas fa-people-group", + "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", + "hidden": true + }, "multiqc_config": { "type": "string", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", "hidden": true }, + "multiqc_logo": { + "type": "string", + "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", + "fa_icon": "fas fa-image", + "hidden": true + }, + "multiqc_methods_description": { + "type": "string", + "description": "Custom MultiQC yaml file containing HTML including a methods description.", + "fa_icon": "fas fa-cog" + }, "tracedir": { "type": "string", "description": "Directory to keep pipeline Nextflow logs and reports.", diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0d62beb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +# Config file for Python. Mostly used to configure linting of bin/check_samplesheet.py with Black. +# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. +[tool.black] +line-length = 120 +target_version = ["py37", "py38", "py39", "py310"] + +[tool.isort] +profile = "black" +known_first_party = ["nf_core"] +multi_line_output = 3 diff --git a/workflows/fgcons.nf b/workflows/fastquorum.nf similarity index 71% rename from workflows/fgcons.nf rename to workflows/fastquorum.nf index 1089f10..88c7139 100644 --- a/workflows/fgcons.nf +++ b/workflows/fastquorum.nf @@ -7,7 +7,7 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowFgcons.initialise(params, log) +WorkflowFastquorum.initialise(params, log) // TODO nf-core: Add all file path parameters for the pipeline to the list below // Check input path parameters to see if they exist @@ -23,8 +23,10 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty() +ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty() +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) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -46,9 +48,9 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -59,7 +61,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ // Info required for completion email and summary def multiqc_report = [] -workflow FGCONS { +workflow FASTQUORUM { ch_versions = Channel.empty() @@ -80,27 +82,31 @@ workflow FGCONS { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') + ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') ) // // MODULE: MultiQC // - workflow_summary = WorkflowFgcons.paramsSummaryMultiqc(workflow, summary_params) + workflow_summary = WorkflowFastquorum.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) + methods_description = WorkflowFastquorum.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + ch_methods_description = Channel.value(methods_description) + ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( - ch_multiqc_files.collect() + ch_multiqc_files.collect(), + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList() ) multiqc_report = MULTIQC.out.report.toList() - ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* @@ -114,6 +120,9 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } NfcoreTemplate.summary(workflow, params, log) + if (params.hook_url) { + NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) + } } /* From 688a377bc66c0c70b47f53232c80bf41e36660dd Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 19 Dec 2022 12:04:53 +0000 Subject: [PATCH 02/29] Template update for nf-core/tools version 2.7.2 --- .github/workflows/fix-linting.yml | 4 +- .github/workflows/linting_comment.yml | 2 +- lib/WorkflowMain.groovy | 2 +- modules.json | 6 +- modules/local/samplesheet_check.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 2 +- .../templates/dumpsoftwareversions.py | 99 ++++++++++--------- modules/nf-core/fastqc/main.nf | 40 +++----- modules/nf-core/multiqc/main.nf | 2 +- nextflow.config | 3 - nextflow_schema.json | 6 -- workflows/fastquorum.nf | 2 +- 12 files changed, 82 insertions(+), 88 deletions(-) mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index cac3379..94349a5 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -34,9 +34,9 @@ jobs: id: prettier_status run: | if prettier --check ${GITHUB_WORKSPACE}; then - echo "name=result::pass" >> $GITHUB_OUTPUT + echo "result=pass" >> $GITHUB_OUTPUT else - echo "name=result::fail" >> $GITHUB_OUTPUT + echo "result=fail" >> $GITHUB_OUTPUT fi - name: Run 'prettier --write' diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 3963518..0bbcd30 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -18,7 +18,7 @@ jobs: - name: Get PR number id: pr_number - run: echo "name=pr_number::$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT + run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment uses: marocchino/sticky-pull-request-comment@v2 diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 2f43d69..49da446 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -72,7 +72,7 @@ class WorkflowMain { NfcoreTemplate.checkConfigProvided(workflow, log) // Check that conda channels are set-up correctly - if (params.enable_conda) { + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { Utils.checkCondaChannels(log) } diff --git a/modules.json b/modules.json index 2c53085..47b23e3 100644 --- a/modules.json +++ b/modules.json @@ -7,17 +7,17 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", "installed_by": ["modules"] } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index b11315f..3ff338d 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -2,7 +2,7 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" label 'process_single' - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : 'quay.io/biocontainers/python:3.8.3' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index cebb6e0..3df2176 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,7 +2,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100644 new mode 100755 index 787bdb7..e55b8d4 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,5 +1,9 @@ #!/usr/bin/env python + +"""Provide functions to merge multiple versions.yml files.""" + + import platform from textwrap import dedent @@ -7,6 +11,7 @@ def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" html = [ dedent( """\\ @@ -45,47 +50,53 @@ def _make_versions_html(versions): return "\\n".join(html) -versions_this_module = {} -versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, -} - -with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - -# aggregate versions by the module name (derived from fully-qualified process name) -versions_by_module = {} -for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - -versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", -} - -versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), -} - -with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) -with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - -with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 0573036..9ae5838 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -2,7 +2,7 @@ process FASTQC { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) + conda "bioconda::fastqc=0.11.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : 'quay.io/biocontainers/fastqc:0.11.9--0' }" @@ -20,30 +20,22 @@ process FASTQC { script: def args = task.ext.args ?: '' - // Add soft-links to original FastQs for consistent naming in pipeline def prefix = task.ext.prefix ?: "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $args --threads $task.cpus ${prefix}.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - END_VERSIONS - """ - } + // Make list of old name and new name pairs to use for renaming in the bash while loop + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + """ + 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 $renamed_files + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ stub: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index a8159a5..68f66be 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,7 +1,7 @@ process MULTIQC { label 'process_single' - conda (params.enable_conda ? 'bioconda::multiqc=1.13' : null) + conda "bioconda::multiqc=1.13" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" diff --git a/nextflow.config b/nextflow.config index 1e74d80..5b0d824 100644 --- a/nextflow.config +++ b/nextflow.config @@ -39,7 +39,6 @@ params { validate_params = true show_hidden_params = false schema_ignore_params = 'genomes' - enable_conda = false // Config options @@ -81,7 +80,6 @@ try { profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { - params.enable_conda = true conda.enabled = true docker.enabled = false singularity.enabled = false @@ -90,7 +88,6 @@ profiles { charliecloud.enabled = false } mamba { - params.enable_conda = true conda.enabled = true conda.useMamba = true docker.enabled = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 0b629cb..f7ea5ff 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -263,12 +263,6 @@ "description": "Show all params when using `--help`", "hidden": true, "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." - }, - "enable_conda": { - "type": "boolean", - "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", - "hidden": true, - "fa_icon": "fas fa-bacon" } } } diff --git a/workflows/fastquorum.nf b/workflows/fastquorum.nf index 88c7139..aefa56c 100644 --- a/workflows/fastquorum.nf +++ b/workflows/fastquorum.nf @@ -82,7 +82,7 @@ workflow FASTQUORUM { ch_versions = ch_versions.mix(FASTQC.out.versions.first()) CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique{ it.text }.collectFile(name: 'collated_versions.yml') + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // From 888bffe8e625fbb51d9dfaf14239681e9be6e88e Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 28 Apr 2023 14:21:10 +0000 Subject: [PATCH 03/29] Template update for nf-core/tools version 2.8 --- .editorconfig | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 3 +- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 24 ++++ .github/workflows/linting.yml | 2 +- .pre-commit-config.yaml | 5 + README.md | 74 ++++++---- bin/check_samplesheet.py | 3 - conf/base.config | 2 +- conf/igenomes.config | 8 ++ conf/test_full.config | 2 + docs/usage.md | 130 +++++------------- lib/NfcoreSchema.groovy | 4 +- lib/WorkflowFastquorum.groovy | 12 +- lib/WorkflowMain.groovy | 13 +- main.nf | 1 - modules.json | 4 +- modules/local/samplesheet_check.nf | 2 +- .../custom/dumpsoftwareversions/main.nf | 6 +- .../custom/dumpsoftwareversions/meta.yml | 2 + modules/nf-core/multiqc/main.nf | 6 +- modules/nf-core/multiqc/meta.yml | 3 +- nextflow.config | 29 +++- tower.yml | 5 + 27 files changed, 193 insertions(+), 157 deletions(-) create mode 100644 .github/workflows/clean-up.yml create mode 100644 .pre-commit-config.yaml create mode 100644 tower.yml diff --git a/.editorconfig b/.editorconfig index b78de6e..b6b3190 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js,cff}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d02e013..311ae24 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -45,6 +45,6 @@ body: * Nextflow version _(eg. 22.10.1)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ - * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ * Version of nf-core/fastquorum _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 924d814..faa7025 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,8 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/fast - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/fastquorum/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/fastquorum _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/fastquorum/tree/master/.github/CONTRIBUTING.md) +- [ ] If necessary, also make a PR on the nf-core/fastquorum _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 15c45d8..4d55450 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v3 + uses: seqeralabs/action-tower-launch@v1 # TODO nf-core: You can customise AWS full pipeline tests as required # 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 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 3a92b5f..38c6f01 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,7 +12,7 @@ jobs: steps: # Launch workflow using Tower CLI tool action - name: Launch workflow via tower - uses: nf-core/tower-action@v3 + uses: seqeralabs/action-tower-launch@v1 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index f872e5b..cdb5634 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/fastquorum' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/fastquorum ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/fastquorum ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml new file mode 100644 index 0000000..694e90e --- /dev/null +++ b/.github/workflows/clean-up.yml @@ -0,0 +1,24 @@ +name: "Close user-tagged issues and PRs" +on: + schedule: + - cron: "0 0 * * 0" # Once a week + +jobs: + clean-up: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v7 + 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." + close-issue-message: "This issue was closed because it has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor and then staled for 20 days with no activity." + days-before-stale: 30 + days-before-close: 20 + days-before-pr-close: -1 + any-of-labels: "awaiting-changes,awaiting-feedback" + exempt-issue-labels: "WIP" + exempt-pr-labels: "WIP" + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 858d622..888cb4b 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -78,7 +78,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: "3.7" + python-version: "3.8" architecture: "x64" - name: Install dependencies diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0c31cdb --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v2.7.1" + hooks: + - id: prettier diff --git a/README.md b/README.md index c2effdb..0671915 100644 --- a/README.md +++ b/README.md @@ -8,57 +8,71 @@ [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/fastquorum) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23fastquorum-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/fastquorum)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/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%23fastquorum-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/fastquorum)[![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 - +**nf-core/fastquorum** is a bioinformatics pipeline that ... -**nf-core/fastquorum** is a bioinformatics best-practice analysis pipeline for fgbio Best Practices FASTQ to Consensus Pipeline. - -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! - - - -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/fastquorum/results). - -## Pipeline summary + + 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) -## Quick Start +## Usage + +> **Note** +> 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. + + - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. +Now, you can run the pipeline using: - > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > - If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + -4. Start running your own analysis! +```bash +nextflow run nf-core/fastquorum \ + -profile \ + --input samplesheet.csv \ + --outdir +``` - +> **Warning:** +> 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/usage/configuration#custom-configuration-files). - ```bash - nextflow run nf-core/fastquorum --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` +For more details, please refer to the [usage documentation](https://nf-co.re/fastquorum/usage) and the [parameter documentation](https://nf-co.re/fastquorum/parameters). -## Documentation +## Pipeline output -The nf-core/fastquorum pipeline comes with documentation about the pipeline [usage](https://nf-co.re/fastquorum/usage), [parameters](https://nf-co.re/fastquorum/parameters) and [output](https://nf-co.re/fastquorum/output). +To see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/fastquorum/results) tab on the nf-core website pipeline page. +For more details about the output files and reports, please refer to the +[output documentation](https://nf-co.re/fastquorum/output). ## Credits diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 11b1557..4a758fe 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -158,9 +158,6 @@ def sniff_format(handle): peek = read_head(handle) handle.seek(0) sniffer = csv.Sniffer() - if not sniffer.has_header(peek): - logger.critical("The given sample sheet does not appear to contain a header.") - sys.exit(1) dialect = sniffer.sniff(peek) return dialect diff --git a/conf/base.config b/conf/base.config index 68faf9e..a02c71e 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { check_max( 6.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } - errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' diff --git a/conf/igenomes.config b/conf/igenomes.config index 7a1b3ac..3f11437 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -36,6 +36,14 @@ params { macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" } + 'CHM13' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" + bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" + gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" + mito_name = "chrM" + } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" diff --git a/conf/test_full.config b/conf/test_full.config index 8a07aba..37d3699 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,6 +10,8 @@ ---------------------------------------------------------------------------------------- */ +cleanup = true + params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' diff --git a/docs/usage.md b/docs/usage.md index 73ee6f0..a3789f0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -71,6 +71,29 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. + +Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. + +> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +> The above pipeline run specified with a params file in yaml format: + +```bash +nextflow run nf-core/fastquorum -profile docker -params-file params.yaml +``` + +with `params.yaml` containing: + +```yaml +input: './samplesheet.csv' +outdir: './results/' +genome: 'GRCh37' +input: 'data' +<...> +``` + +You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: @@ -87,6 +110,10 @@ First, go to the [nf-core/fastquorum releases page](https://github.com/nf-core/f This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. + +> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. + ## Core Nextflow arguments > **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). @@ -95,7 +122,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -119,8 +146,10 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) +- `apptainer` + - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. ### `-resume` @@ -138,102 +167,19 @@ Specify the path to a specific config file (this is a core Nextflow command). Se Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. -For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: - -```console -[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' - -Caused by: - Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) - -Command executed: - STAR \ - --genomeDir star \ - --readFilesIn WT_REP1_trimmed.fq.gz \ - --runThreadN 2 \ - --outFileNamePrefix WT_REP1. \ - - -Command exit status: - 137 - -Command output: - (empty) - -Command error: - .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. -Work dir: - /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb - -Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` -``` - -#### For beginners - -A first step to bypass this error, you could try to increase the amount of CPUs, memory, and time for the whole pipeline. Therefor you can try to increase the resource for the parameters `--max_cpus`, `--max_memory`, and `--max_time`. Based on the error above, you have to increase the amount of memory. Therefore you can go to the [parameter documentation of rnaseq](https://nf-co.re/rnaseq/3.9/parameters) and scroll down to the `show hidden parameter` button to get the default value for `--max_memory`. In this case 128GB, you than can try to run your pipeline again with `--max_memory 200GB -resume` to skip all process, that were already calculated. If you can not increase the resource of the complete pipeline, you can try to adapt the resource for a single process as mentioned below. - -#### Advanced option on process level - -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). -We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/star/align/main.nf`. -If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). -The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. -The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. -Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. -The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. - -```nextflow -process { - withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { - memory = 100.GB - } -} -``` - -> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. -> -> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. - -### Updating containers (advanced users) - -The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. - -1. Check the default version used by the pipeline in the module file for [Pangolin](https://github.com/nf-core/viralrecon/blob/a85d5969f9025409e3618d6c280ef15ce417df65/modules/nf-core/software/pangolin/main.nf#L14-L19) -2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) -3. Create the custom config accordingly: - - - For Docker: +To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +### Custom Containers - - For Singularity: +In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` +To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. - - For Conda: +### Custom Tool Arguments - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` +A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. -> **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. +To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. ### nf-core/configs diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 33cd4f6..9b34804 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -2,6 +2,7 @@ // This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. // +import nextflow.Nextflow import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader import org.everit.json.schema.ValidationException @@ -83,6 +84,7 @@ class NfcoreSchema { 'stub-run', 'test', 'w', + 'with-apptainer', 'with-charliecloud', 'with-conda', 'with-dag', @@ -177,7 +179,7 @@ class NfcoreSchema { } if (has_error) { - System.exit(1) + Nextflow.error('Exiting!') } } diff --git a/lib/WorkflowFastquorum.groovy b/lib/WorkflowFastquorum.groovy index d415533..327d634 100755 --- a/lib/WorkflowFastquorum.groovy +++ b/lib/WorkflowFastquorum.groovy @@ -2,6 +2,7 @@ // This file holds several functions specific to the workflow/fastquorum.nf in the nf-core/fastquorum pipeline // +import nextflow.Nextflow import groovy.text.SimpleTemplateEngine class WorkflowFastquorum { @@ -14,8 +15,7 @@ class WorkflowFastquorum { if (!params.fasta) { - log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." - System.exit(1) + Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." } } @@ -61,17 +61,19 @@ class WorkflowFastquorum { def description_html = engine.createTemplate(methods_text).make(meta) return description_html - }// + } + + // // Exit pipeline if incorrect --genome key provided // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - System.exit(1) + Nextflow.error(error_string) } } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 49da446..d2a98bc 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -2,6 +2,8 @@ // This file holds several functions specific to the main.nf workflow in the nf-core/fastquorum pipeline // +import nextflow.Nextflow + class WorkflowMain { // @@ -21,7 +23,7 @@ class WorkflowMain { // // Generate help string // - public static String help(workflow, params, log) { + public static String help(workflow, params) { def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) @@ -34,7 +36,7 @@ class WorkflowMain { // // Generate parameter summary log string // - public static String paramsSummaryLog(workflow, params, log) { + public static String paramsSummaryLog(workflow, params) { def summary_log = '' summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) @@ -49,7 +51,7 @@ class WorkflowMain { public static void initialise(workflow, params, log) { // Print help to screen if required if (params.help) { - log.info help(workflow, params, log) + log.info help(workflow, params) System.exit(0) } @@ -61,7 +63,7 @@ class WorkflowMain { } // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params, log) + log.info paramsSummaryLog(workflow, params) // Validate workflow parameters via the JSON schema if (params.validate_params) { @@ -81,8 +83,7 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" - System.exit(1) + Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") } } // diff --git a/main.nf b/main.nf index 9863ec9..b2e961d 100644 --- a/main.nf +++ b/main.nf @@ -4,7 +4,6 @@ nf-core/fastquorum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/fastquorum - Website: https://nf-co.re/fastquorum Slack : https://nfcore.slack.com/channels/fastquorum ---------------------------------------------------------------------------------------- diff --git a/modules.json b/modules.json index 47b23e3..57a2902 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", "installed_by": ["modules"] }, "fastqc": { @@ -17,7 +17,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", "installed_by": ["modules"] } } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 3ff338d..0632d86 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -5,7 +5,7 @@ process SAMPLESHEET_CHECK { conda "conda-forge::python=3.8.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'quay.io/biocontainers/python:3.8.3' }" + 'biocontainers/python:3.8.3' }" input: path samplesheet diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 3df2176..800a609 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index 60b546a..c32657d 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,7 +1,9 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: - custom + - dump - version tools: - custom: diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 68f66be..4b60474 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ebc29b2..f93b5ee 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: @@ -37,7 +38,7 @@ output: description: MultiQC report file pattern: "multiqc_report.html" - data: - type: dir + type: directory description: MultiQC data dir pattern: "multiqc_data" - plots: diff --git a/nextflow.config b/nextflow.config index 5b0d824..d324bf6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -78,7 +78,11 @@ try { profiles { - debug { process.beforeScript = 'echo $HOSTNAME' } + debug { + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false + } conda { conda.enabled = true docker.enabled = false @@ -86,6 +90,7 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } mamba { conda.enabled = true @@ -95,14 +100,18 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } docker { docker.enabled = true + docker.registry = 'quay.io' docker.userEmulation = true + conda.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' @@ -110,31 +119,49 @@ profiles { singularity { singularity.enabled = true singularity.autoMounts = true + conda.enabled = false docker.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } podman { podman.enabled = true + podman.registry = 'quay.io' + conda.enabled = false docker.enabled = false singularity.enabled = false shifter.enabled = false charliecloud.enabled = false + apptainer.enabled = false } shifter { shifter.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false charliecloud.enabled = false + apptainer.enabled = false } charliecloud { charliecloud.enabled = true + conda.enabled = false docker.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false + apptainer.enabled = false + } + apptainer { + apptainer.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false } gitpod { executor.name = 'local' diff --git a/tower.yml b/tower.yml new file mode 100644 index 0000000..787aedf --- /dev/null +++ b/tower.yml @@ -0,0 +1,5 @@ +reports: + multiqc_report.html: + display: "MultiQC HTML report" + samplesheet.csv: + display: "Auto-created samplesheet with collated metadata and FASTQ paths" From dd357743b15313779427a33606e8a552931ad937 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 30 Jun 2023 16:12:48 +0000 Subject: [PATCH 04/29] Template update for nf-core/tools version 2.9 --- .github/CONTRIBUTING.md | 1 - .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/workflows/awsfulltest.yml | 11 +- .github/workflows/awstest.yml | 10 +- .github/workflows/ci.yml | 2 +- .gitpod.yml | 5 + CITATIONS.md | 6 + README.md | 6 +- assets/methods_description_template.yml | 12 +- assets/multiqc_config.yml | 4 +- assets/nf-core-fastquorum_logo_light.png | Bin 11321 -> 78152 bytes assets/slackreport.json | 2 +- conf/test_full.config | 2 - docs/usage.md | 6 +- lib/NfcoreSchema.groovy | 530 ----------------------- lib/NfcoreTemplate.groovy | 2 +- lib/WorkflowFastquorum.groovy | 45 +- lib/WorkflowMain.groovy | 37 -- main.nf | 16 + nextflow.config | 52 ++- nextflow_schema.json | 36 +- workflows/fastquorum.nf | 25 +- 22 files changed, 175 insertions(+), 637 deletions(-) delete mode 100755 lib/NfcoreSchema.groovy diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 54b5f87..fbca42c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -116,4 +116,3 @@ To get started: Devcontainer specs: - [DevContainer config](.devcontainer/devcontainer.json) -- [Dockerfile](.devcontainer/Dockerfile) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 311ae24..0a71829 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -42,7 +42,7 @@ body: attributes: label: System information description: | - * Nextflow version _(eg. 22.10.1)_ + * Nextflow version _(eg. 23.04.0)_ * Hardware _(eg. HPC, Desktop, Cloud)_ * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 4d55450..cef3003 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 + uses: seqeralabs/action-tower-launch@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # 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 @@ -22,13 +22,18 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fastquorum/work-${{ github.sha }} parameters: | { + "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fastquorum/results-${{ github.sha }}" } - profiles: test_full,aws_tower + profiles: test_full + - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 38c6f01..26a3e00 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,18 +12,22 @@ jobs: steps: # Launch workflow using Tower CLI tool action - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 + uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fastquorum/work-${{ github.sha }} parameters: | { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fastquorum/results-test-${{ github.sha }}" } - profiles: test,aws_tower + profiles: test + - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0160c9e..65168b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: NXF_VER: - - "22.10.1" + - "23.04.0" - "latest-everything" steps: - name: Check out pipeline code diff --git a/.gitpod.yml b/.gitpod.yml index 85d95ec..25488dc 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,4 +1,9 @@ image: nfcore/gitpod:latest +tasks: + - name: Update Nextflow and setup pre-commit + command: | + pre-commit install --install-hooks + nextflow self-update vscode: extensions: # based on nf-core.nf-core-extensionpack diff --git a/CITATIONS.md b/CITATIONS.md index 779af6d..150f526 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,10 @@ - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + > Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. Available online https://www.bioinformatics.babraham.ac.uk/projects/fastqc/. + - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools @@ -31,5 +34,8 @@ - [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + > Merkel, D. (2014). Docker: lightweight linux containers for consistent development and deployment. Linux Journal, 2014(239), 2. doi: 10.5555/2600239.2600241. + - [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/README.md b/README.md index 0671915..fce7cb7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fastquorum/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A522.10.1-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.04.0-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/) @@ -66,11 +66,11 @@ nextflow run nf-core/fastquorum \ > provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; > see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). -For more details, please refer to the [usage documentation](https://nf-co.re/fastquorum/usage) and the [parameter documentation](https://nf-co.re/fastquorum/parameters). +For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/fastquorum/usage) and the [parameter documentation](https://nf-co.re/fastquorum/parameters). ## Pipeline output -To see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/fastquorum/results) tab on the nf-core website pipeline page. +To see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/fastquorum/results) tab on the nf-core website pipeline page. For more details about the output files and reports, please refer to the [output documentation](https://nf-co.re/fastquorum/output). diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index be1bd6d..4a51e32 100644 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -3,17 +3,21 @@ description: "Suggested text and references to use when describing pipeline usag section_name: "nf-core/fastquorum Methods Description" section_href: "https://github.com/nf-core/fastquorum" plot_type: "html" -## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline ## You inject any metadata in the Nextflow '${workflow}' object data: |

    Methods

    -

    Data was processed using nf-core/fastquorum v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020).

    +

    Data was processed using nf-core/fastquorum v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020), utilising reproducible software environments from the Bioconda (Grüning et al., 2018) and Biocontainers (da Veiga Leprevost et al., 2017) projects.

    The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

    ${workflow.commandLine}
    +

    ${tool_citations}

    References

      -
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. https://doi.org/10.1038/nbt.3820
    • -
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. https://doi.org/10.1038/s41587-020-0439-x
    • +
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. doi: 10.1038/nbt.3820
    • +
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. doi: 10.1038/s41587-020-0439-x
    • +
    • Grüning, B., Dale, R., Sjödin, A., Chapman, B. A., Rowe, J., Tomkins-Tinch, C. H., Valieris, R., Köster, J., & Bioconda Team. (2018). Bioconda: sustainable and comprehensive software distribution for the life sciences. Nature Methods, 15(7), 475–476. doi: 10.1038/s41592-018-0046-7
    • +
    • da Veiga Leprevost, F., Grüning, B. A., Alves Aflitos, S., Röst, H. L., Uszkoreit, J., Barsnes, H., Vaudel, M., Moreno, P., Gatto, L., Weber, J., Bai, M., Jimenez, R. C., Sachsenberg, T., Pfeuffer, J., Vera Alvarez, R., Griss, J., Nesvizhskii, A. I., & Perez-Riverol, Y. (2017). BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics (Oxford, England), 33(16), 2580–2582. doi: 10.1093/bioinformatics/btx192
    • + ${tool_bibliography}
    Notes:
    diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 5b3a26d..eb791d2 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/fastquorum + This report has been generated by the nf-core/fastquorum analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fastquorum-methods-description": order: -1000 diff --git a/assets/nf-core-fastquorum_logo_light.png b/assets/nf-core-fastquorum_logo_light.png index bc2647a93c497cefc7245d27423d5898239f1e6b..4284651a391d8cc76c2d97c4cc90baa128bff4c9 100644 GIT binary patch literal 78152 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 } else { %>danger<%} %>", - "author_name": "sanger-tol/readmapping v${version} - ${runName}", + "author_name": "nf-core/fastquorum v${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/test_full.config b/conf/test_full.config index 37d3699..8a07aba 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,8 +10,6 @@ ---------------------------------------------------------------------------------------- */ -cleanup = true - params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' diff --git a/docs/usage.md b/docs/usage.md index a3789f0..2f5b170 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/fastquorum --input samplesheet.csv --outdir --genome GRCh37 -profile docker +nextflow run nf-core/fastquorum --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -76,7 +76,8 @@ If you wish to repeatedly use the same parameters for multiple runs, rather than Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. > ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). -> The above pipeline run specified with a params file in yaml format: + +The above pipeline run specified with a params file in yaml format: ```bash nextflow run nf-core/fastquorum -profile docker -params-file params.yaml @@ -88,7 +89,6 @@ with `params.yaml` containing: input: './samplesheet.csv' outdir: './results/' genome: 'GRCh37' -input: 'data' <...> ``` diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy deleted file mode 100755 index 9b34804..0000000 --- a/lib/NfcoreSchema.groovy +++ /dev/null @@ -1,530 +0,0 @@ -// -// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. -// - -import nextflow.Nextflow -import org.everit.json.schema.Schema -import org.everit.json.schema.loader.SchemaLoader -import org.everit.json.schema.ValidationException -import org.json.JSONObject -import org.json.JSONTokener -import org.json.JSONArray -import groovy.json.JsonSlurper -import groovy.json.JsonBuilder - -class NfcoreSchema { - - // - // Resolve Schema path relative to main workflow directory - // - public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { - return "${workflow.projectDir}/${schema_filename}" - } - - // - // Function to loop over all parameters defined in schema and check - // whether the given parameters adhere to the specifications - // - /* groovylint-disable-next-line UnusedPrivateMethodParameter */ - public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { - def has_error = false - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - // Check for nextflow core params and unexpected params - def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text - def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') - def nf_params = [ - // Options for base `nextflow` command - 'bg', - 'c', - 'C', - 'config', - 'd', - 'D', - 'dockerize', - 'h', - 'log', - 'q', - 'quiet', - 'syslog', - 'v', - - // Options for `nextflow run` command - 'ansi', - 'ansi-log', - 'bg', - 'bucket-dir', - 'c', - 'cache', - 'config', - 'dsl2', - 'dump-channels', - 'dump-hashes', - 'E', - 'entry', - 'latest', - 'lib', - 'main-script', - 'N', - 'name', - 'offline', - 'params-file', - 'pi', - 'plugins', - 'poll-interval', - 'pool-size', - 'profile', - 'ps', - 'qs', - 'queue-size', - 'r', - 'resume', - 'revision', - 'stdin', - 'stub', - 'stub-run', - 'test', - 'w', - 'with-apptainer', - 'with-charliecloud', - 'with-conda', - 'with-dag', - 'with-docker', - 'with-mpi', - 'with-notification', - 'with-podman', - 'with-report', - 'with-singularity', - 'with-timeline', - 'with-tower', - 'with-trace', - 'with-weblog', - 'without-docker', - 'without-podman', - 'work-dir' - ] - def unexpectedParams = [] - - // Collect expected parameters from the schema - def expectedParams = [] - def enums = [:] - for (group in schemaParams) { - for (p in group.value['properties']) { - expectedParams.push(p.key) - if (group.value['properties'][p.key].containsKey('enum')) { - enums[p.key] = group.value['properties'][p.key]['enum'] - } - } - } - - for (specifiedParam in params.keySet()) { - // nextflow params - if (nf_params.contains(specifiedParam)) { - log.error "ERROR: You used a core Nextflow option with two hyphens: '--${specifiedParam}'. Please resubmit with '-${specifiedParam}'" - has_error = true - } - // unexpected params - def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' - def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } - def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { - // Temporarily remove camelCase/camel-case params #1035 - def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} - if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ - unexpectedParams.push(specifiedParam) - } - } - } - - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - // Validate parameters against the schema - InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() - JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) - - // Remove anything that's in params.schema_ignore_params - raw_schema = removeIgnoredParams(raw_schema, params) - - Schema schema = SchemaLoader.load(raw_schema) - - // Clean the parameters - def cleanedParams = cleanParameters(params) - - // Convert to JSONObject - def jsonParams = new JsonBuilder(cleanedParams) - JSONObject params_json = new JSONObject(jsonParams.toString()) - - // Validate - try { - schema.validate(params_json) - } catch (ValidationException e) { - println '' - log.error 'ERROR: Validation of pipeline parameters failed!' - JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log, enums) - println '' - has_error = true - } - - // Check for unexpected parameters - if (unexpectedParams.size() > 0) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - println '' - def warn_msg = 'Found unexpected parameters:' - for (unexpectedParam in unexpectedParams) { - warn_msg = warn_msg + "\n* --${unexpectedParam}: ${params[unexpectedParam].toString()}" - } - log.warn warn_msg - log.info "- ${colors.dim}Ignore this warning: params.schema_ignore_params = \"${unexpectedParams.join(',')}\" ${colors.reset}" - println '' - } - - if (has_error) { - Nextflow.error('Exiting!') - } - } - - // - // Beautify parameters for --help - // - public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - Integer num_hidden = 0 - String output = '' - output += 'Typical pipeline command:\n\n' - output += " ${colors.cyan}${command}${colors.reset}\n\n" - Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) - Integer max_chars = paramsMaxChars(params_map) + 1 - Integer desc_indent = max_chars + 14 - Integer dec_linewidth = 160 - desc_indent - for (group in params_map.keySet()) { - Integer num_params = 0 - String group_output = colors.underlined + colors.bold + group + colors.reset + '\n' - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (group_params.get(param).hidden && !params.show_hidden_params) { - num_hidden += 1 - continue; - } - def type = '[' + group_params.get(param).type + ']' - def description = group_params.get(param).description - def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' - def description_default = description + colors.dim + defaultValue + colors.reset - // Wrap long description texts - // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap - if (description_default.length() > dec_linewidth){ - List olines = [] - String oline = "" // " " * indent - description_default.split(" ").each() { wrd -> - if ((oline.size() + wrd.size()) <= dec_linewidth) { - oline += wrd + " " - } else { - olines += oline - oline = wrd + " " - } - } - olines += oline - description_default = olines.join("\n" + " " * desc_indent) - } - group_output += " --" + param.padRight(max_chars) + colors.dim + type.padRight(10) + colors.reset + description_default + '\n' - num_params += 1 - } - group_output += '\n' - if (num_params > 0){ - output += group_output - } - } - if (num_hidden > 0){ - output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset - } - output += NfcoreTemplate.dashedLine(params.monochrome_logs) - return output - } - - // - // Groovy Map summarising parameters/workflow options used by the pipeline - // - public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { - // Get a selection of core Nextflow workflow options - def Map workflow_summary = [:] - if (workflow.revision) { - workflow_summary['revision'] = workflow.revision - } - workflow_summary['runName'] = workflow.runName - if (workflow.containerEngine) { - workflow_summary['containerEngine'] = workflow.containerEngine - } - if (workflow.container) { - workflow_summary['container'] = workflow.container - } - workflow_summary['launchDir'] = workflow.launchDir - workflow_summary['workDir'] = workflow.workDir - workflow_summary['projectDir'] = workflow.projectDir - workflow_summary['userName'] = workflow.userName - workflow_summary['profile'] = workflow.profile - workflow_summary['configFiles'] = workflow.configFiles.join(', ') - - // Get pipeline parameters defined in JSON Schema - def Map params_summary = [:] - def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) - for (group in params_map.keySet()) { - def sub_params = new LinkedHashMap() - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (params.containsKey(param)) { - def params_value = params.get(param) - def schema_value = group_params.get(param).default - def param_type = group_params.get(param).type - if (schema_value != null) { - if (param_type == 'string') { - if (schema_value.contains('$projectDir') || schema_value.contains('${projectDir}')) { - def sub_string = schema_value.replace('\$projectDir', '') - sub_string = sub_string.replace('\${projectDir}', '') - if (params_value.contains(sub_string)) { - schema_value = params_value - } - } - if (schema_value.contains('$params.outdir') || schema_value.contains('${params.outdir}')) { - def sub_string = schema_value.replace('\$params.outdir', '') - sub_string = sub_string.replace('\${params.outdir}', '') - if ("${params.outdir}${sub_string}" == params_value) { - schema_value = params_value - } - } - } - } - - // We have a default in the schema, and this isn't it - if (schema_value != null && params_value != schema_value) { - sub_params.put(param, params_value) - } - // No default in the schema, and this isn't empty - else if (schema_value == null && params_value != "" && params_value != null && params_value != false) { - sub_params.put(param, params_value) - } - } - } - params_summary.put(group, sub_params) - } - return [ 'Core Nextflow options' : workflow_summary ] << params_summary - } - - // - // Beautify parameters for summary and return as string - // - public static String paramsSummaryLog(workflow, params) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) - String output = '' - def params_map = paramsSummaryMap(workflow, params) - def max_chars = paramsMaxChars(params_map) - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - if (group_params) { - output += colors.bold + group + colors.reset + '\n' - for (param in group_params.keySet()) { - output += " " + colors.blue + param.padRight(max_chars) + ": " + colors.green + group_params.get(param) + colors.reset + '\n' - } - output += '\n' - } - } - output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" - output += NfcoreTemplate.dashedLine(params.monochrome_logs) - return output - } - - // - // Loop over nested exceptions and print the causingException - // - private static void printExceptions(ex_json, params_json, log, enums, limit=5) { - def causingExceptions = ex_json['causingExceptions'] - if (causingExceptions.length() == 0) { - def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ - // Missing required param - if (m.matches()) { - log.error "* Missing required parameter: --${m[0][1]}" - } - // Other base-level error - else if (ex_json['pointerToViolation'] == '#') { - log.error "* ${ex_json['message']}" - } - // Error with specific param - else { - def param = ex_json['pointerToViolation'] - ~/^#\// - def param_val = params_json[param].toString() - if (enums.containsKey(param)) { - def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" - if (enums[param].size() > limit) { - log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" - } else { - log.error "${error_msg}: ${enums[param].join(', ')})" - } - } else { - log.error "* --${param}: ${ex_json['message']} (${param_val})" - } - } - } - for (ex in causingExceptions) { - printExceptions(ex, params_json, log, enums) - } - } - - // - // Remove an element from a JSONArray - // - private static JSONArray removeElement(json_array, element) { - def list = [] - int len = json_array.length() - for (int i=0;i - if(raw_schema.keySet().contains('definitions')){ - raw_schema.definitions.each { definition -> - for (key in definition.keySet()){ - if (definition[key].get("properties").keySet().contains(ignore_param)){ - // Remove the param to ignore - definition[key].get("properties").remove(ignore_param) - // If the param was required, change this - if (definition[key].has("required")) { - def cleaned_required = removeElement(definition[key].required, ignore_param) - definition[key].put("required", cleaned_required) - } - } - } - } - } - if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { - raw_schema.get("properties").remove(ignore_param) - } - if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { - def cleaned_required = removeElement(raw_schema.required, ignore_param) - raw_schema.put("required", cleaned_required) - } - } - return raw_schema - } - - // - // Clean and check parameters relative to Nextflow native classes - // - private static Map cleanParameters(params) { - def new_params = params.getClass().newInstance(params) - for (p in params) { - // remove anything evaluating to false - if (!p['value']) { - new_params.remove(p.key) - } - // Cast MemoryUnit to String - if (p['value'].getClass() == nextflow.util.MemoryUnit) { - new_params.replace(p.key, p['value'].toString()) - } - // Cast Duration to String - if (p['value'].getClass() == nextflow.util.Duration) { - new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) - } - // Cast LinkedHashMap to String - if (p['value'].getClass() == LinkedHashMap) { - new_params.replace(p.key, p['value'].toString()) - } - } - return new_params - } - - // - // This function tries to read a JSON params file - // - private static LinkedHashMap paramsLoad(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = paramsRead(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - // - // Method to actually read in JSON file using Groovy. - // Group (as Key), values are all parameters - // - Parameter1 as Key, Description as Value - // - Parameter2 as Key, Description as Value - // .... - // Group - // - - private static LinkedHashMap paramsRead(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') - def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - * properties <- parameters can also be ungrouped, outside of definitions - parameter 1 - type - description - */ - - // Grouped params - def params_map = new LinkedHashMap() - schema_definitions.each { key, val -> - def Map group = schema_definitions."$key".properties // Gets the property object of the group - def title = schema_definitions."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - - // Ungrouped params - def ungrouped_params = new LinkedHashMap() - schema_properties.each { innerkey, value -> - ungrouped_params.put(innerkey, value) - } - params_map.put("Other parameters", ungrouped_params) - - return params_map - } - - // - // Get maximum number of characters across all parameter names - // - private static Integer paramsMaxChars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } -} diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 25a0a74..408951a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -128,7 +128,7 @@ class NfcoreTemplate { def email_html = html_template.toString() // Render the sendmail template - def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit + def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] def sf = new File("$projectDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) diff --git a/lib/WorkflowFastquorum.groovy b/lib/WorkflowFastquorum.groovy index 327d634..fa7cbc0 100755 --- a/lib/WorkflowFastquorum.groovy +++ b/lib/WorkflowFastquorum.groovy @@ -11,6 +11,7 @@ class WorkflowFastquorum { // Check and validate parameters // public static void initialise(params, log) { + genomeExistsError(params, log) @@ -46,15 +47,57 @@ class WorkflowFastquorum { return yaml_file_text } - public static String methodsDescriptionText(run_workflow, mqc_methods_yaml) { + // + // Generate methods description for MultiQC + // + + public static String toolCitationText(params) { + + // TODO Optionally add in-text citation tools to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def citation_text = [ + "Tools used in the workflow included:", + "FastQC (Andrews 2010),", + "MultiQC (Ewels et al. 2016)", + "." + ].join(' ').trim() + + return citation_text + } + + public static String toolBibliographyText(params) { + + // TODO Optionally add bibliographic entries to this list. + // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", + // Uncomment function in methodsDescriptionText to render in MultiQC report + def reference_text = [ + "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", + "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + ].join(' ').trim() + + return reference_text + } + + public static String methodsDescriptionText(run_workflow, mqc_methods_yaml, params) { // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file def meta = [:] meta.workflow = run_workflow.toMap() meta["manifest_map"] = run_workflow.manifest.toMap() + // Pipeline DOI meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + // Tool references + meta["tool_citations"] = "" + meta["tool_bibliography"] = "" + + // TODO Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! + //meta["tool_citations"] = toolCitationText(params).replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + //meta["tool_bibliography"] = toolBibliographyText(params) + + def methods_text = mqc_methods_yaml.text def engine = new SimpleTemplateEngine() diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index d2a98bc..c5f4a48 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -20,40 +20,11 @@ class WorkflowMain { " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" } - // - // Generate help string - // - public static String help(workflow, params) { - def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" - def help_string = '' - help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) - help_string += NfcoreSchema.paramsHelp(workflow, params, command) - help_string += '\n' + citation(workflow) + '\n' - help_string += NfcoreTemplate.dashedLine(params.monochrome_logs) - return help_string - } - - // - // Generate parameter summary log string - // - public static String paramsSummaryLog(workflow, params) { - def summary_log = '' - summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) - summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) - summary_log += '\n' + citation(workflow) + '\n' - summary_log += NfcoreTemplate.dashedLine(params.monochrome_logs) - return summary_log - } // // Validate parameters and print summary to screen // public static void initialise(workflow, params, log) { - // Print help to screen if required - if (params.help) { - log.info help(workflow, params) - System.exit(0) - } // Print workflow version and exit on --version if (params.version) { @@ -62,14 +33,6 @@ class WorkflowMain { System.exit(0) } - // Print parameter summary log to screen - log.info paramsSummaryLog(workflow, params) - - // Validate workflow parameters via the JSON schema - if (params.validate_params) { - NfcoreSchema.validateParameters(workflow, params, log) - } - // Check that a -profile or Nextflow config has been provided to run the pipeline NfcoreTemplate.checkConfigProvided(workflow, log) diff --git a/main.nf b/main.nf index b2e961d..01b5a9a 100644 --- a/main.nf +++ b/main.nf @@ -25,6 +25,22 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +include { validateParameters; paramsHelp } from 'plugin/nf-validation' + +// Print help message if needed +if (params.help) { + def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) + def citation = '\n' + WorkflowMain.citation(workflow) + '\n' + def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) + System.exit(0) +} + +// Validate input parameters +if (params.validate_params) { + validateParameters() +} + WorkflowMain.initialise(workflow, params, log) /* diff --git a/nextflow.config b/nextflow.config index d324bf6..59a69fe 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,12 +12,12 @@ params { // TODO nf-core: Specify your pipeline's command line flags // Input options input = null - - // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false + + // MultiQC options multiqc_config = null multiqc_title = null @@ -27,7 +27,6 @@ params { // Boilerplate options outdir = null - tracedir = "${params.outdir}/pipeline_info" publish_dir_mode = 'copy' email = null email_on_fail = null @@ -36,19 +35,15 @@ params { hook_url = null help = false version = false - validate_params = true - show_hidden_params = false - schema_ignore_params = 'genomes' - // Config options + config_profile_name = null + config_profile_description = null custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_description = null config_profile_contact = null config_profile_url = null - config_profile_name = null - + // Max resource options // Defaults only, expecting to be overwritten @@ -56,6 +51,13 @@ params { max_cpus = 16 max_time = '240.h' + // Schema validation default options + validationFailUnrecognisedParams = false + validationLenientMode = false + validationSchemaIgnoreParams = 'genomes' + validationShowHiddenParams = false + validate_params = true + } // Load base.config by default for all pipelines @@ -75,13 +77,11 @@ try { // } catch (Exception e) { // System.err.println("WARNING: Could not load nf-core/config/fastquorum profiles: ${params.custom_config_base}/pipeline/fastquorum.config") // } - - profiles { debug { dumpHashes = true process.beforeScript = 'echo $HOSTNAME' - cleanup = false + cleanup = false } conda { conda.enabled = true @@ -104,7 +104,6 @@ profiles { } docker { docker.enabled = true - docker.registry = 'quay.io' docker.userEmulation = true conda.enabled = false singularity.enabled = false @@ -128,7 +127,6 @@ profiles { } podman { podman.enabled = true - podman.registry = 'quay.io' conda.enabled = false docker.enabled = false singularity.enabled = false @@ -172,6 +170,18 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Set default registry for Apptainer, Docker, Podman and Singularity independent of -profile +// Will not be used unless Apptainer / Docker / Podman / Singularity are enabled +// Set to your registry if you have a mirror of containers +apptainer.registry = 'quay.io' +docker.registry = 'quay.io' +podman.registry = 'quay.io' +singularity.registry = 'quay.io' + +// Nextflow plugins +plugins { + id 'nf-validation' // Validation of pipeline parameters and creation of an input channel from a sample sheet +} // Load igenomes.config if required if (!params.igenomes_ignore) { @@ -179,8 +189,6 @@ if (!params.igenomes_ignore) { } else { params.genomes = [:] } - - // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. @@ -198,19 +206,19 @@ process.shell = ['/bin/bash', '-euo', 'pipefail'] def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { enabled = true - file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/execution_timeline_${trace_timestamp}.html" } report { enabled = true - file = "${params.tracedir}/execution_report_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/execution_report_${trace_timestamp}.html" } trace { enabled = true - file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" + file = "${params.outdir}/pipeline_info/execution_trace_${trace_timestamp}.txt" } dag { enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.html" + file = "${params.outdir}/pipeline_info/pipeline_dag_${trace_timestamp}.html" } manifest { @@ -219,7 +227,7 @@ manifest { homePage = 'https://github.com/nf-core/fastquorum' description = """fgbio Best Practices FASTQ to Consensus Pipeline""" mainScript = 'main.nf' - nextflowVersion = '!>=22.10.1' + nextflowVersion = '!>=23.04.0' version = '1.0dev' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index f7ea5ff..aa856f8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -15,9 +15,9 @@ "input": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/csv", "pattern": "^\\S+\\.csv$", - "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/fastquorum/usage#samplesheet-input).", "fa_icon": "fas fa-file-csv" @@ -57,6 +57,7 @@ "fasta": { "type": "string", "format": "file-path", + "exists": true, "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", @@ -157,7 +158,7 @@ "description": "Maximum amount of time that can be requested for any single job.", "default": "240.h", "fa_icon": "far fa-clock", - "pattern": "^(\\d+\\.?\\s*(s|m|h|day)\\s*)+$", + "pattern": "^(\\d+\\.?\\s*(s|m|h|d|day)\\s*)+$", "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" } @@ -174,12 +175,14 @@ "type": "boolean", "description": "Display help text.", "fa_icon": "fas fa-question-circle", + "default": false, "hidden": true }, "version": { "type": "boolean", "description": "Display version and exit.", "fa_icon": "fas fa-question-circle", + "default": false, "hidden": true }, "publish_dir_mode": { @@ -203,6 +206,7 @@ "type": "boolean", "description": "Send plain-text email instead of HTML.", "fa_icon": "fas fa-remove-format", + "default": false, "hidden": true }, "max_multiqc_email_size": { @@ -217,6 +221,7 @@ "type": "boolean", "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", + "default": false, "hidden": true }, "hook_url": { @@ -228,6 +233,7 @@ }, "multiqc_config": { "type": "string", + "format": "file-path", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", "hidden": true @@ -243,13 +249,6 @@ "description": "Custom MultiQC yaml file containing HTML including a methods description.", "fa_icon": "fas fa-cog" }, - "tracedir": { - "type": "string", - "description": "Directory to keep pipeline Nextflow logs and reports.", - "default": "${params.outdir}/pipeline_info", - "fa_icon": "fas fa-cogs", - "hidden": true - }, "validate_params": { "type": "boolean", "description": "Boolean whether to validate parameters against the schema at runtime", @@ -257,12 +256,29 @@ "fa_icon": "fas fa-check-square", "hidden": true }, - "show_hidden_params": { + "validationShowHiddenParams": { "type": "boolean", "fa_icon": "far fa-eye-slash", "description": "Show all params when using `--help`", + "default": false, "hidden": true, "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." + }, + "validationFailUnrecognisedParams": { + "type": "boolean", + "fa_icon": "far fa-check-circle", + "description": "Validation of parameters fails when an unrecognised parameter is found.", + "default": false, + "hidden": true, + "help_text": "By default, when an unrecognised parameter is found, it returns a warinig." + }, + "validationLenientMode": { + "type": "boolean", + "fa_icon": "far fa-check-circle", + "description": "Validation of parameters in lenient more.", + "default": false, + "hidden": true, + "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." } } } diff --git a/workflows/fastquorum.nf b/workflows/fastquorum.nf index aefa56c..77a0073 100644 --- a/workflows/fastquorum.nf +++ b/workflows/fastquorum.nf @@ -1,21 +1,19 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE INPUTS + PRINT PARAMS SUMMARY ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) +include { paramsSummaryLog; paramsSummaryMap } from 'plugin/nf-validation' -// Validate input parameters -WorkflowFastquorum.initialise(params, log) +def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) +def citation = '\n' + WorkflowMain.citation(workflow) + '\n' +def summary_params = paramsSummaryMap(workflow) -// TODO nf-core: Add all file path parameters for the pipeline to the list below -// Check input path parameters to see if they exist -def checkPathParamList = [ params.input, params.multiqc_config, params.fasta ] -for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } +// Print parameter summary log to screen +log.info logo + paramsSummaryLog(workflow) + citation -// Check mandatory parameters -if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } +WorkflowFastquorum.initialise(params, log) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -69,9 +67,12 @@ workflow FASTQUORUM { // SUBWORKFLOW: Read in samplesheet, validate and stage input files // INPUT_CHECK ( - ch_input + file(params.input) ) ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) + // TODO: OPTIONAL, you can use nf-validation plugin to create an input channel from the samplesheet with Channel.fromSamplesheet("input") + // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ + // ! There is currently no tooling to help you write a sample sheet schema // // MODULE: Run FastQC @@ -91,7 +92,7 @@ workflow FASTQUORUM { workflow_summary = WorkflowFastquorum.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) - methods_description = WorkflowFastquorum.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description) + methods_description = WorkflowFastquorum.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description, params) ch_methods_description = Channel.value(methods_description) ch_multiqc_files = Channel.empty() From 0c17f6ba80fbc112a968a002201143fa8770f7f2 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 25 Sep 2023 15:16:44 +0000 Subject: [PATCH 05/29] Template update for nf-core/tools version 2.10 --- .devcontainer/devcontainer.json | 1 + .github/CONTRIBUTING.md | 4 +- .github/workflows/linting.yml | 2 +- .github/workflows/release-announcments.yml | 68 +++++++++ CITATIONS.md | 2 +- CODE_OF_CONDUCT.md | 133 ++++++++++++++---- README.md | 21 +-- assets/multiqc_config.yml | 4 +- assets/nf-core-fastquorum_logo_light.png | Bin 78152 -> 20496 bytes conf/modules.config | 9 ++ docs/images/nf-core-fastquorum_logo_light.png | Bin 78152 -> 20496 bytes docs/output.md | 5 +- docs/usage.md | 16 ++- lib/NfcoreTemplate.groovy | 16 +++ lib/WorkflowFastquorum.groovy | 2 +- main.nf | 3 + modules.json | 6 +- .../custom/dumpsoftwareversions/main.nf | 2 +- modules/nf-core/fastqc/main.nf | 8 +- modules/nf-core/multiqc/main.nf | 2 +- nextflow.config | 7 +- nextflow_schema.json | 15 -- workflows/fastquorum.nf | 1 + 23 files changed, 251 insertions(+), 76 deletions(-) create mode 100644 .github/workflows/release-announcments.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ea27a58..4ecfbfe 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,6 +2,7 @@ "name": "nfcore", "image": "nfcore/gitpod:latest", "remoteUser": "gitpod", + "runArgs": ["--privileged"], // Configure tool-specific properties. "customizations": { diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fbca42c..c73f993 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,9 @@ Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) -> If you need help using or modifying nf-core/fastquorum then the best place to ask is on the nf-core Slack [#fastquorum](https://nfcore.slack.com/channels/fastquorum) channel ([join our Slack here](https://nf-co.re/join/slack)). +:::info +If you need help using or modifying nf-core/fastquorum then the best place to ask is on the nf-core Slack [#fastquorum](https://nfcore.slack.com/channels/fastquorum) channel ([join our Slack here](https://nf-co.re/join/slack)). +::: ## Contribution workflow diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 888cb4b..b8bdd21 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -78,7 +78,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: "3.8" + python-version: "3.11" architecture: "x64" - name: Install dependencies diff --git a/.github/workflows/release-announcments.yml b/.github/workflows/release-announcments.yml new file mode 100644 index 0000000..6ad3392 --- /dev/null +++ b/.github/workflows/release-announcments.yml @@ -0,0 +1,68 @@ +name: release-announcements +# Automatic release toot and tweet anouncements +on: + release: + types: [published] + workflow_dispatch: + +jobs: + toot: + runs-on: ubuntu-latest + steps: + - uses: rzr/fediverse-action@master + with: + access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} + host: "mstdn.science" # custom host if not "mastodon.social" (default) + # GitHub event payload + # 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 }}! + + Please see the changelog: ${{ github.event.release.html_url }} + + send-tweet: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v4 + 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@v0.0.2 + with: + post: | + Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + + Please see the changelog: ${{ github.event.release.html_url }} + env: + BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }} + BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }} + # diff --git a/CITATIONS.md b/CITATIONS.md index 150f526..c86684d 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - > Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. Available online https://www.bioinformatics.babraham.ac.uk/projects/fastqc/. + > Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f4fd052..c089ec7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,18 +1,20 @@ -# Code of Conduct at nf-core (v1.0) +# Code of Conduct at nf-core (v1.4) ## Our Pledge -In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core, pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: - Age +- Ability - Body size +- Caste - Familial status - Gender identity and expression - Geographical location - Level of experience - Nationality and national origins - Native language -- Physical and neurological ability +- Neurodiversity - Race or ethnicity - Religion - Sexual identity and orientation @@ -22,80 +24,133 @@ Please note that the list above is alphabetised and is therefore not ranked in a ## Preamble -> Note: This Code of Conduct (CoC) has been drafted by the nf-core Safety Officer and been edited after input from members of the nf-core team and others. "We", in this document, refers to the Safety Officer and members of the nf-core core team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will amended periodically to keep it up-to-date, and in case of any dispute, the most current version will apply. +:::note +This Code of Conduct (CoC) has been drafted by Renuka Kudva, Cris Tuñí, and Michael Heuer, with input from the nf-core Core Team and Susanna Marquez from the nf-core community. "We", in this document, refers to the Safety Officers and members of the nf-core Core Team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will be amended periodically to keep it up-to-date. In case of any dispute, the most current version will apply. +::: -An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). Our current safety officer is Renuka Kudva. +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). + +Our Safety Officers are Saba Nafees, Cris Tuñí, and Michael Heuer. nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. -We have therefore adopted this code of conduct (CoC), which we require all members of our community and attendees in nf-core events to adhere to in all our workspaces at all times. Workspaces include but are not limited to Slack, meetings on Zoom, Jitsi, YouTube live etc. +We have therefore adopted this CoC, which we require all members of our community and attendees of nf-core events to adhere to in all our workspaces at all times. Workspaces include, but are not limited to, Slack, meetings on Zoom, gather.town, YouTube live etc. -Our CoC will be strictly enforced and the nf-core team reserve the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. +Our CoC will be strictly enforced and the nf-core team reserves the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. -We ask all members of our community to help maintain a supportive and productive workspace and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. +We ask all members of our community to help maintain supportive and productive workspaces and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. -Questions, concerns or ideas on what we can include? Contact safety [at] nf-co [dot] re +Questions, concerns, or ideas on what we can include? Contact members of the Safety Team on Slack or email safety [at] nf-co [dot] re. ## Our Responsibilities -The safety officer is responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. +Members of the Safety Team (the Safety Officers) are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. -The safety officer in consultation with the nf-core core team have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +The Safety Team, in consultation with the nf-core core team, have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this CoC, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. -Members of the core team or the safety officer who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and be subject to the same actions as others in violation of the CoC. +Members of the core team or the Safety Team who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and will be subject to the same actions as others in violation of the CoC. -## When are where does this Code of Conduct apply? +## When and where does this Code of Conduct apply? -Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events. This includes but is not limited to the following listed alphabetically and therefore in no order of preference: +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events, such as hackathons, workshops, bytesize, and collaborative workspaces on gather.town. These guidelines include, but are not limited to, the following (listed alphabetically and therefore in no order of preference): - Communicating with an official project email address. - Communicating with community members within the nf-core Slack channel. - Participating in hackathons organised by nf-core (both online and in-person events). -- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence. -- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, Jitsi, YouTube live etc. +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence, and on the nf-core gather.town workspace. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, gather.town, Jitsi, YouTube live etc. - Representing nf-core on social media. This includes both official and personal accounts. ## nf-core cares 😊 -nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include but are not limited to the following (listed in alphabetical order): +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include, but are not limited to, the following (listed in alphabetical order): - Ask for consent before sharing another community member’s personal information (including photographs) on social media. - Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. -- Celebrate your accomplishments at events! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) +- Celebrate your accomplishments! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) - Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) - Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) - Focus on what is best for the team and the community. (When in doubt, ask) -- Graciously accept constructive criticism, yet be unafraid to question, deliberate, and learn. +- Accept feedback, yet be unafraid to question, deliberate, and learn. - Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) -- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communications to be kind.**) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communication to be kind.**) - Take breaks when you feel like you need them. -- Using welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack.) +- Use welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack) ## nf-core frowns on 😕 -The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this code of conduct. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces. +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this CoC. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces: - Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. - “Doxing” i.e. posting (or threatening to post) another person’s personal identifying information online. - Spamming or trolling of individuals on social media. -- Use of sexual or discriminatory imagery, comments, or jokes and unwelcome sexual attention. -- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion or work experience. +- Use of sexual or discriminatory imagery, comments, jokes, or unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion, or work experience. ### Online Trolling -The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the added issue of online trolling. This is unacceptable, reports of such behaviour will be taken very seriously, and perpetrators will be excluded from activities immediately. +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the risk of online trolling. This is unacceptable — reports of such behaviour will be taken very seriously and perpetrators will be excluded from activities immediately. -All community members are required to ask members of the group they are working within for explicit consent prior to taking screenshots of individuals during video calls. +All community members are **required** to ask members of the group they are working with for explicit consent prior to taking screenshots of individuals during video calls. -## Procedures for Reporting CoC violations +## Procedures for reporting CoC violations If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. -You can reach out to members of the [nf-core core team](https://nf-co.re/about) and they will forward your concerns to the safety officer(s). +You can reach out to members of the Safety Team (Saba Nafees, Cris Tuñí, and Michael Heuer) on Slack. Alternatively, contact a member of the nf-core core team [nf-core core team](https://nf-co.re/about), and they will forward your concerns to the Safety Team. + +Issues directly concerning members of the Core Team or the Safety Team will be dealt with by other members of the core team and the safety manager — possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson and details will be shared in due course. + +All reports will be handled with the utmost discretion and confidentiality. + +You can also report any CoC violations to safety [at] nf-co [dot] re. In your email report, please do your best to include: + +- Your contact information. +- Identifying information (e.g. names, nicknames, pseudonyms) of the participant who has violated the Code of Conduct. +- The behaviour that was in violation and the circumstances surrounding the incident. +- The approximate time of the behaviour (if different than the time the report was made). +- Other people involved in the incident, if applicable. +- If you believe the incident is ongoing. +- If there is a publicly available record (e.g. mailing list record, a screenshot). +- Any additional information. + +After you file a report, one or more members of our Safety Team will contact you to follow up on your report. + +## Who will read and handle reports + +All reports will be read and handled by the members of the Safety Team at nf-core. + +If members of the Safety Team are deemed to have a conflict of interest with a report, they will be required to recuse themselves as per our Code of Conduct and will not have access to any follow-ups. + +To keep this first report confidential from any of the Safety Team members, please submit your first report by direct messaging on Slack/direct email to any of the nf-core members you are comfortable disclosing the information to, and be explicit about which member(s) you do not consent to sharing the information with. + +## Reviewing reports + +After receiving the report, members of the Safety Team will review the incident report to determine whether immediate action is required, for example, whether there is immediate threat to participants’ safety. + +The Safety Team, in consultation with members of the nf-core core team, will assess the information to determine whether the report constitutes a Code of Conduct violation, for them to decide on a course of action. + +In the case of insufficient information, one or more members of the Safety Team may contact the reporter, the reportee, or any other attendees to obtain more information. -Issues directly concerning members of the core team will be dealt with by other members of the core team and the safety manager, and possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson, and details will be shared in due course. +Once additional information is gathered, the Safety Team will collectively review and decide on the best course of action to take, if any. The Safety Team reserves the right to not act on a report. -All reports will be handled with utmost discretion and confidentially. +## Confidentiality + +All reports, and any additional information included, are only shared with the team of safety officers (and possibly members of the core team, in case the safety officer is in violation of the CoC). We will respect confidentiality requests for the purpose of protecting victims of abuse. + +We will not name harassment victims, beyond discussions between the safety officer and members of the nf-core team, without the explicit consent of the individuals involved. + +## Enforcement + +Actions taken by the nf-core’s Safety Team may include, but are not limited to: + +- Asking anyone to stop a behaviour. +- Asking anyone to leave the event and online spaces either temporarily, for the remainder of the event, or permanently. +- Removing access to the gather.town and Slack, either temporarily or permanently. +- Communicating to all participants to reinforce our expectations for conduct and remind what is unacceptable behaviour; this may be public for practical reasons. +- Communicating to all participants that an incident has taken place and how we will act or have acted — this may be for the purpose of letting event participants know we are aware of and dealing with the incident. +- Banning anyone from participating in nf-core-managed spaces, future events, and activities, either temporarily or permanently. +- No action. ## Attribution and Acknowledgements @@ -106,6 +161,22 @@ All reports will be handled with utmost discretion and confidentially. ## Changelog -### v1.0 - March 12th, 2021 +### v1.4 - February 8th, 2022 + +- Included a new member of the Safety Team. Corrected a typographical error in the text. + +### v1.3 - December 10th, 2021 + +- Added a statement that the CoC applies to nf-core gather.town workspaces. Corrected typographical errors in the text. + +### v1.2 - November 12th, 2021 + +- Removed information specific to reporting CoC violations at the Hackathon in October 2021. + +### v1.1 - October 14th, 2021 + +- Updated with names of new Safety Officers and specific information for the hackathon in October 2021. + +### v1.0 - March 15th, 2021 - Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/README.md b/README.md index fce7cb7..4656c66 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_light.png#gh-light-mode-only) ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_dark.png#gh-dark-mode-only) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fastquorum/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![GitHub Actions CI Status](https://github.com/nf-core/fastquorum/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fastquorum/actions?query=workflow%3A%22nf-core+CI%22) +[![GitHub Actions Linting Status](https://github.com/nf-core/fastquorum/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fastquorum/actions?query=workflow%3A%22nf-core+linting%22)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fastquorum/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.04.0-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/) @@ -29,10 +30,11 @@ ## Usage -> **Note** -> 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. +:::note +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. +::: vw*v^@3&_u4%5R^8~d+5g0;sU;69P+BDh%&m;lkwDL~;d4hmPdLe71j+;^u- z>RTnqEMnYH04R8vtmb*a)zfpAtTpf4=@Q9)d0N@-WwG)lJ^p??OKao2oEFppwkQ$C zSUYzCtqi$BwqU(bM}lB5x(+!yG173@J%4p z2ygP(i!NcP4nTe|t0Ga(YV0J7R!Ws5s*{}&@ehe_W2(Ss#sT(Rz^sg!*?c^}WxvZT zFpWGW*>y>jyT1P_5>~BrVOYj-%)woi`&^3c2Q6j}yL=A<_cj>f#qg)-uUPfQ2O zOVIu=^pRfhDtB4{yo)xg`)6=1IVkAdPTI-|RwbZ&Rqlw7q5=3LLPps^m74)uRvp|@ zdA=&)?R2Hp^#11t?RK6a4&|y5{Y!p{30D^VfChkG@UFRHIA-aQEjX2hdX3}MqTEG> z9+;CvX)8y8)d)(S196hwRsMI-yJ{@bD|4Diwt5+xWW62|DrN&dB&zS+7 z=@A&ePQM0=qv8-!-Y6*i-frc_)FZno+>9t`&^|e~0NSc;vMKlm;)4ce54%u$Gqi2R zHk9$vKN3-c(~Ki9f&PeSO6uu390mvoeL%W9T{<7C?#>4g+V8dw!cnYN|8JN#!ZaX z|;fNjrn2PNazxAq=1D&-mrGEyy(*|<8U77Xb z`5%Ab*8@5j(hDmd1N18~R3^Am59xZFve*j?&pEM`29_8W@dsAFE%>{V|nA4)wm>(q#Iea=={OwkC0Q*qqB>}Y}x)WmxxA2Ho zmW9`uTHU$H2_at^+O*j^A)1*wLdp?^H#50CrC>MH9tKn12ER)M2yyurDm+bfI5juO zT;G^Hrk~g3G5-Ek6-|bEXta}f@DsCwuvZIkaqV|@tph480zws;TMo zKo6;gKR8&IXx}{^23n1Q%a$1Zlc(+V$l$*5U8NZyqxsk&|8!WW#pzF31`^kim8E_X zH^QU5x1`*#=jw6=Lqxj60jU*S*MC*1i~|lCg)r0{>TQ#&bqa|)g=#e#0EB5oosiRc1)_4Ik!=m#5ua-Y4o6uywgft z*QLUx)!jeF*~8fVbCWP;fm{?$o790J?HEOe58~TRvMO+HBw6bdvjVq3W4OajF&X({ zB*ZZ&g>xc29QdBvI(Q93cu>LZqffr@@r2daRu>%P!x4~{t~v4!f>;j}&}y(=4(Yw| zxe!pV)5phBE>BlKMgL&C_2ZYh{{`J=wDQJ@8Ev4OaeGeLodrwWZkessf+a>p(h}Ha zI01wctUi0Pyg|Drp5|>5bmReZu-zrWO$b!UHWPJm4&`!)oE=BQX*bhRNkUzaeAM~9 zfC#1L1Z)uIn&d6}9VcEP2ka@8nhP?WB{u!#Q8ZK$cUEZ&kY7|}zg08FGZt*yvN)QV z%$uK?vhZ0J0Nu53>+A*CdwjDRt7H0~8ya2X1`@#cbPz4>{V|~S<2u>m1+9f`Q)%vA zxt(=PXmW+3PXfeTH*gURF(D6MTDtFb-;=NC6i8BzA}YBh-fBj*>3IfVhTeV=Q@HOs zJj5OwLDQR_;v{O4vzwSUZBFO!n|mI``_cfqh|+*|mQ+?{+HT}=s3pwxXZvs?#N?*=-Xah4_#BwKX6f#956?{& z4ge!vIE%~4MkV!qW`eBt8iPhLGiXZSW|VpG{PJ&gIxQ9wQS@cd4AkqQTKJ1F|0t$1 zKxV0hP3q6b`Q46eXE?Z8P%kex@l!d^p2wF}H6SPw8 zMt%+OSH;W>x+__{_%88QIl)Ou*IB+Zk|lSy}E`=n#gX z9SG8&FvFm>TLHvLLHx_bQjXjWF&~u8RRWWZQ(4bfvPwK$T4=0Z%?F?`$;|^eh!}2&OsF|6G zO8MBK_YjX<_5_^HqeWQ>#w$C@cU!;w!oGN$#8nyU9P^En{^8wuny(+ZI(FvIz#cYw zut<@kz);at(yBw8o>gi>$!a3Avijz?Ek$ts;_9fTq&5r3II>ZETgd&|&GrMP0-;ag z4Uahik~~@Z&1HY_p^vj=6a$Dp)-uhg2;{UGyDz-};Ep1^Azj+th+KUFH>V>Uq1F$Cf%m_s**SN&lPx#G|4H>)O2}th(dC> zt=8!rLrI+c@0ws0PGyeeT`Z))2UE3@^D8Y@V>sMG`Q%0Z5@sbNf@?{sXqoq5-Sziz zK3>vJoZ9@(^w%ZhFPXLj$TS*G@w6V8k^o^Y!+PvqxrEmUFPeuf9vRCmXvD8mQSd1H z`dB05FPg80+tKMuHE|PWfhFp-c^>1P1r&oT4~Q)%Sy2o?Pb9kWflw8~P(;sPU||?i zd>S$GW)w)aOE^^&H@l-bn94PAVeRH#Wt7nEa`^$usX&z$rZ)Y9re7qjhrLI=_Eexv ztGUv7w5c(_BdNQC_-eUypwAxq&6|5>=a~@dhd#ISi<;}Y7CQ967B=VwP2MCZA{nIC zsP}OC!97#6KC-n2(Q%sX$JJ`n!6ktOl&GiB*Ft+PS6)}{IV0A+l83Kc&~697UGpbA zLUwX?iN`3JO*98dAx(O9(#?N!w~cqmJ}=WOwK1dcu+L5ke3k{|#~pLZtVgB>)04(5 zsqg%MEUkKGv@oTS#TCINh$6(xd=d*EFU)vTMw-M7<_PY|vWVfSDfm8*Q4`z^ozhUjD1|AWEMCz zaTHaWpD=cc`y@EoGBo0|f6j+h+kWwD5xR8GvRV1U@9a_KNE!J|?xh%5zxfXW{kBsf z)SmMQP6&HjarnYfiJBk5L=V0B;XVE@oiBM>lbz2HQ}n^2hYQvfT&RZXzEeRM${|v`J&yW zG1Vh+Bvuk-(s~xEzU& zv2H7eiKC8d97Bd4P+F)~J2p>lT^LSJWbA=EZpTg>n$+XaWebRR&TpSDJYVj2YKXfR zpfD%zCpeGxPRrHVy8PlglE%(6b5oBa^f-4>=}fAUym5Y#9a91&i@VSJs~~W^HBQf< zgl}1Su7O#ZhkrI>P7q{qn+(0VtSh8VcD~6}0Rg;;9&qyG?jNPj z_%fALkDJpoKet)@YS|j^SEA?J6_$JSB}IBt!&lqm=)7k$OTVabp_2V1wRc1+t zrq^4z66U!Qrj(%OoJ5D1o1M^!J8SRNrHic67B)1?gWOQlVF^EOnzWkZru|RfsaLFV zk1KJ#U$~IxYFy@x?X_konxRUV0hz@EVm_-j0>EE~eZ6&}5O6;|2eovaLehtFjRvcPn za@F7Z@k%dfO zhv^OBzrPL6D(t=vnBV{W*!Fh~;q!$5{vCVx=-597+WtYO0?>zl|42Fv`uzJx^uPYs z61IPkTnF38_D7(9d=jpE|NVC&`Qam3|2~W?oNE00NB+~3tZogIJ>W-J9(#O?A8N%s z^Q%?AinzvhO!x1bqTt)F_DMkhbw3=H_n+6SA`rE^|8;W~V)Ws^E(AolUH-3YNfm_u zd5I+AVr=-oZZ`b?j{l#A2k+ncA07Wc4G-oAfBxT}|38iYpN5D2b?MmuiueKl`F~aX zf8Rg(e--~yvAN5(1mXW!;Tr!xD<9ZA=zmhV{~O8yzyJ0B*?9gN filename.equals('versions.yml') ? null : filename } + ] + } + } diff --git a/docs/images/nf-core-fastquorum_logo_light.png b/docs/images/nf-core-fastquorum_logo_light.png index 4284651a391d8cc76c2d97c4cc90baa128bff4c9..2c190220433d248d583d212247e94f451b0bd469 100644 GIT binary patch delta 13 UcmX@{h-Jb8#svnOy&MD-04rz(9RL6T delta 58123 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 **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. +:::note +The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. +::: ### MultiQC @@ -62,6 +64,7 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. + - Parameters used by the pipeline run: `params.json`. diff --git a/docs/usage.md b/docs/usage.md index 2f5b170..03557f0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -75,7 +75,9 @@ If you wish to repeatedly use the same parameters for multiple runs, rather than Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. -> ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +:::warning +Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). +::: The above pipeline run specified with a params file in yaml format: @@ -112,11 +114,15 @@ This version number will be logged in reports when you run the pipeline, so that To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. -> 💡 If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. +:::tip +If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. +::: ## Core Nextflow arguments -> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). +:::note +These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). +::: ### `-profile` @@ -124,7 +130,9 @@ Use this parameter to choose a configuration profile. Profiles can give configur Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. -> We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. +:::info +We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. +::: The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 408951a..01b8653 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -3,6 +3,7 @@ // import org.yaml.snakeyaml.Yaml +import groovy.json.JsonOutput class NfcoreTemplate { @@ -222,6 +223,21 @@ class NfcoreTemplate { } } + // + // Dump pipeline parameters in a json file + // + public static void dump_parameters(workflow, params) { + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + + def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + def output_pf = new File(output_d, "params_${timestamp}.json") + def jsonStr = JsonOutput.toJson(params) + output_pf.text = JsonOutput.prettyPrint(jsonStr) + } + // // Print pipeline summary on completion // diff --git a/lib/WorkflowFastquorum.groovy b/lib/WorkflowFastquorum.groovy index fa7cbc0..a3c50ae 100755 --- a/lib/WorkflowFastquorum.groovy +++ b/lib/WorkflowFastquorum.groovy @@ -53,7 +53,7 @@ class WorkflowFastquorum { public static String toolCitationText(params) { - // TODO Optionally add in-text citation tools to this list. + // TODO nf-core: Optionally add in-text citation tools to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ diff --git a/main.nf b/main.nf index 01b5a9a..aba020a 100644 --- a/main.nf +++ b/main.nf @@ -17,6 +17,9 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +// TODO nf-core: Remove this line if you don't need a FASTA file +// This is an example of how to use getGenomeAttribute() to fetch parameters +// from igenomes.config using `--genome` params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* diff --git a/modules.json b/modules.json index 57a2902..0fde8a1 100644 --- a/modules.json +++ b/modules.json @@ -7,17 +7,17 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "bd8092b67b5103bdd52e300f75889442275c3117", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", "installed_by": ["modules"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 800a609..ebc8727 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -5,7 +5,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 9ae5838..249f906 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -5,7 +5,7 @@ process FASTQC { conda "bioconda::fastqc=0.11.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : - 'quay.io/biocontainers/fastqc:0.11.9--0' }" + 'biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -29,7 +29,11 @@ process FASTQC { 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 $renamed_files + + fastqc \\ + $args \\ + --threads $task.cpus \\ + $renamed_files cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 4b60474..1fc387b 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -4,7 +4,7 @@ process MULTIQC { conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/nextflow.config b/nextflow.config index 59a69fe..3a6bf4f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -54,7 +54,7 @@ params { // Schema validation default options validationFailUnrecognisedParams = false validationLenientMode = false - validationSchemaIgnoreParams = 'genomes' + validationSchemaIgnoreParams = 'genomes,igenomes_base' validationShowHiddenParams = false validate_params = true @@ -154,6 +154,7 @@ profiles { } apptainer { apptainer.enabled = true + apptainer.autoMounts = true conda.enabled = false docker.enabled = false singularity.enabled = false @@ -163,8 +164,8 @@ profiles { } gitpod { executor.name = 'local' - executor.cpus = 16 - executor.memory = 60.GB + executor.cpus = 4 + executor.memory = 8.GB } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } diff --git a/nextflow_schema.json b/nextflow_schema.json index aa856f8..c78cc2a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -64,14 +64,6 @@ "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, - "igenomes_base": { - "type": "string", - "format": "directory-path", - "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes", - "fa_icon": "fas fa-cloud-download-alt", - "hidden": true - }, "igenomes_ignore": { "type": "boolean", "description": "Do not load the iGenomes reference config.", @@ -175,14 +167,12 @@ "type": "boolean", "description": "Display help text.", "fa_icon": "fas fa-question-circle", - "default": false, "hidden": true }, "version": { "type": "boolean", "description": "Display version and exit.", "fa_icon": "fas fa-question-circle", - "default": false, "hidden": true }, "publish_dir_mode": { @@ -206,7 +196,6 @@ "type": "boolean", "description": "Send plain-text email instead of HTML.", "fa_icon": "fas fa-remove-format", - "default": false, "hidden": true }, "max_multiqc_email_size": { @@ -221,7 +210,6 @@ "type": "boolean", "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", - "default": false, "hidden": true }, "hook_url": { @@ -260,7 +248,6 @@ "type": "boolean", "fa_icon": "far fa-eye-slash", "description": "Show all params when using `--help`", - "default": false, "hidden": true, "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." }, @@ -268,7 +255,6 @@ "type": "boolean", "fa_icon": "far fa-check-circle", "description": "Validation of parameters fails when an unrecognised parameter is found.", - "default": false, "hidden": true, "help_text": "By default, when an unrecognised parameter is found, it returns a warinig." }, @@ -276,7 +262,6 @@ "type": "boolean", "fa_icon": "far fa-check-circle", "description": "Validation of parameters in lenient more.", - "default": false, "hidden": true, "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." } diff --git a/workflows/fastquorum.nf b/workflows/fastquorum.nf index 77a0073..1bdf734 100644 --- a/workflows/fastquorum.nf +++ b/workflows/fastquorum.nf @@ -120,6 +120,7 @@ workflow.onComplete { if (params.email || params.email_on_fail) { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } + NfcoreTemplate.dump_parameters(workflow, params) NfcoreTemplate.summary(workflow, params, log) if (params.hook_url) { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) From a036ca3c50ab34a3026a4b50105a2bfd0dd23a60 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 19 Dec 2023 19:03:37 +0000 Subject: [PATCH 06/29] Template update for nf-core/tools version 2.11 --- .github/CONTRIBUTING.md | 3 + .github/PULL_REQUEST_TEMPLATE.md | 1 + .github/workflows/ci.yml | 2 +- .github/workflows/fix-linting.yml | 4 +- .github/workflows/linting.yml | 12 +- .gitpod.yml | 4 +- README.md | 17 +-- assets/multiqc_config.yml | 2 +- assets/slackreport.json | 2 +- conf/modules.config | 2 +- docs/usage.md | 4 +- lib/NfcoreTemplate.groovy | 32 ++--- modules.json | 6 +- .../dumpsoftwareversions/environment.yml | 7 ++ .../custom/dumpsoftwareversions/main.nf | 6 +- .../custom/dumpsoftwareversions/meta.yml | 7 +- .../dumpsoftwareversions/tests/main.nf.test | 38 ++++++ .../tests/main.nf.test.snap | 27 +++++ .../dumpsoftwareversions/tests/tags.yml | 2 + modules/nf-core/fastqc/environment.yml | 7 ++ modules/nf-core/fastqc/main.nf | 10 +- modules/nf-core/fastqc/meta.yml | 5 + modules/nf-core/fastqc/tests/main.nf.test | 109 ++++++++++++++++++ .../nf-core/fastqc/tests/main.nf.test.snap | 10 ++ modules/nf-core/fastqc/tests/tags.yml | 2 + modules/nf-core/multiqc/environment.yml | 7 ++ modules/nf-core/multiqc/main.nf | 8 +- modules/nf-core/multiqc/meta.yml | 11 +- modules/nf-core/multiqc/tests/main.nf.test | 63 ++++++++++ modules/nf-core/multiqc/tests/tags.yml | 2 + nextflow.config | 10 +- 31 files changed, 358 insertions(+), 64 deletions(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/environment.yml create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml create mode 100644 modules/nf-core/fastqc/environment.yml create mode 100644 modules/nf-core/fastqc/tests/main.nf.test create mode 100644 modules/nf-core/fastqc/tests/main.nf.test.snap create mode 100644 modules/nf-core/fastqc/tests/tags.yml create mode 100644 modules/nf-core/multiqc/environment.yml create mode 100644 modules/nf-core/multiqc/tests/main.nf.test create mode 100644 modules/nf-core/multiqc/tests/tags.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c73f993..8e2fdfc 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -27,6 +27,9 @@ If you're not used to this workflow with git, you can start with some [docs from ## Tests +You can optionally test your changes by running the pipeline locally. Then it is recommended to use the `debug` profile to +receive warnings about process selectors and other debug info. Example: `nextflow run . -profile debug,test,docker --outdir `. + When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index faa7025..ceaa100 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,6 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/fast - [ ] If necessary, also make a PR on the nf-core/fastquorum _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65168b3..d999817 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 94349a5..590d778 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@v3 + - uses: actions/checkout@v4 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -24,7 +24,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install Prettier run: npm install -g prettier @prettier/plugin-php diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index b8bdd21..905c58e 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,9 +14,9 @@ jobs: EditorConfig: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -27,9 +27,9 @@ jobs: Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install Prettier run: npm install -g prettier @@ -40,7 +40,7 @@ jobs: PythonBlack: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check code lints with Black uses: psf/black@stable @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.gitpod.yml b/.gitpod.yml index 25488dc..acf7269 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,7 +4,9 @@ tasks: command: | pre-commit install --install-hooks nextflow self-update - + - name: unset JAVA_TOOL_OPTIONS + command: | + unset JAVA_TOOL_OPTIONS vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files diff --git a/README.md b/README.md index 4656c66..5a5eb9f 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,8 @@ ## Usage -:::note -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. -::: +> [!NOTE] +> 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. - + diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 58c45c2..4f66930 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,5 +1,5 @@ report_comment: > - This report has been generated by the nf-core/fastquorum + This report has been generated by the nf-core/fastquorum analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: diff --git a/assets/slackreport.json b/assets/slackreport.json index 517ac6b..533a5e6 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "nf-core/fastquorum v${version} - ${runName}", + "author_name": "nf-core/fastquorum ${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/modules.config b/conf/modules.config index 39e8138..d91c6ab 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -39,7 +39,7 @@ process { } withName: 'MULTIQC' { - ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' + ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, mode: params.publish_dir_mode, diff --git a/docs/usage.md b/docs/usage.md index 03557f0..cb83fcf 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -20,7 +20,7 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: -```console +```csv title="samplesheet.csv" sample,fastq_1,fastq_2 CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz @@ -33,7 +33,7 @@ The pipeline will auto-detect whether a sample is single- or paired-end using th A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. -```console +```csv title="samplesheet.csv" sample,fastq_1,fastq_2 CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 01b8653..e248e4c 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -4,6 +4,7 @@ import org.yaml.snakeyaml.Yaml import groovy.json.JsonOutput +import nextflow.extension.FilesEx class NfcoreTemplate { @@ -141,12 +142,14 @@ class NfcoreTemplate { try { if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } // Try to send HTML e-mail using sendmail + def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html") + sendmail_tf.withWriter { w -> w << sendmail_html } [ 'sendmail', '-t' ].execute() << sendmail_html log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" } catch (all) { // Catch failures and try with plaintext def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { + if ( mqc_report != null && mqc_report.size() <= max_multiqc_email_size.toBytes() ) { mail_cmd += [ '-A', mqc_report ] } mail_cmd.execute() << email_html @@ -155,14 +158,16 @@ class NfcoreTemplate { } // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") + def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") + FilesEx.copyTo(output_hf.toPath(), "${params.outdir}/pipeline_info/pipeline_report.html"); + output_hf.delete() + + // Write summary e-mail TXT to a file + def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } + FilesEx.copyTo(output_tf.toPath(), "${params.outdir}/pipeline_info/pipeline_report.txt"); + output_tf.delete() } // @@ -227,15 +232,14 @@ class NfcoreTemplate { // Dump pipeline parameters in a json file // public static void dump_parameters(workflow, params) { - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_pf = new File(output_d, "params_${timestamp}.json") + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") def jsonStr = JsonOutput.toJson(params) - output_pf.text = JsonOutput.prettyPrint(jsonStr) + temp_pf.text = JsonOutput.prettyPrint(jsonStr) + + FilesEx.copyTo(temp_pf.toPath(), "${params.outdir}/pipeline_info/params_${timestamp}.json") + temp_pf.delete() } // diff --git a/modules.json b/modules.json index 0fde8a1..6bcaf9f 100644 --- a/modules.json +++ b/modules.json @@ -7,17 +7,17 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "bba7e362e4afead70653f84d8700588ea28d0f9e", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "bd8092b67b5103bdd52e300f75889442275c3117", + "git_sha": "65ad3e0b9a4099592e1102e92e10455dc661cf53", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "4ab13872435962dadc239979554d13709e20bf29", "installed_by": ["modules"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml new file mode 100644 index 0000000..f0c63f6 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/environment.yml @@ -0,0 +1,7 @@ +name: custom_dumpsoftwareversions +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.17 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index ebc8727..7685b33 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.17--pyhdfd78af_0' : + 'biocontainers/multiqc:1.17--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index c32657d..5f15a5f 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: @@ -16,7 +16,6 @@ input: type: file description: YML file containing software versions pattern: "*.yml" - output: - yml: type: file @@ -30,7 +29,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@drpatelh" - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 0000000..eec1db1 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,38 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "../main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + + test("Should run without failures") { + when { + process { + """ + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 0000000..4274ed5 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,27 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" + ], + "1": [ + "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" + ], + "2": [ + "versions.yml:md5,3843ac526e762117eedf8825b40683df" + ], + "mqc_yml": [ + "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" + ], + "versions": [ + "versions.yml:md5,3843ac526e762117eedf8825b40683df" + ], + "yml": [ + "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" + ] + } + ], + "timestamp": "2023-11-03T14:43:22.157011" + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml new file mode 100644 index 0000000..405aa24 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml @@ -0,0 +1,2 @@ +custom/dumpsoftwareversions: + - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml new file mode 100644 index 0000000..1787b38 --- /dev/null +++ b/modules/nf-core/fastqc/environment.yml @@ -0,0 +1,7 @@ +name: fastqc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 249f906..9e19a74 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -2,10 +2,10 @@ process FASTQC { tag "$meta.id" label 'process_medium' - conda "bioconda::fastqc=0.11.9" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : - 'biocontainers/fastqc:0.11.9--0' }" + 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : + 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" input: tuple val(meta), path(reads) @@ -37,7 +37,7 @@ process FASTQC { cat <<-END_VERSIONS > versions.yml "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) END_VERSIONS """ @@ -49,7 +49,7 @@ process FASTQC { cat <<-END_VERSIONS > versions.yml "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 4da5bb5..ee5507e 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -50,3 +50,8 @@ authors: - "@grst" - "@ewels" - "@FelixKrueger" +maintainers: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test new file mode 100644 index 0000000..b9e8f92 --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -0,0 +1,109 @@ +nextflow_process { + + name "Test Process FASTQC" + script "../main.nf" + process "FASTQC" + tag "modules" + tag "modules_nfcore" + tag "fastqc" + + test("Single-Read") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [ id: 'test', single_end:true ], + [ + file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. + // looks like this:
    Mon 2 Oct 2023
    test.gz
    + // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 + { assert process.out.html.get(0).get(1) ==~ ".*/test_fastqc.html" }, + { assert path(process.out.html.get(0).get(1)).getText().contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match("versions") }, + { assert process.out.zip.get(0).get(1) ==~ ".*/test_fastqc.zip" } + ) + } + } +// TODO +// // +// // Test with paired-end data +// // +// workflow test_fastqc_paired_end { +// input = [ +// [id: 'test', single_end: false], // meta map +// [ +// file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), +// file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true) +// ] +// ] + +// FASTQC ( input ) +// } + +// // +// // Test with interleaved data +// // +// workflow test_fastqc_interleaved { +// input = [ +// [id: 'test', single_end: false], // meta map +// file(params.test_data['sarscov2']['illumina']['test_interleaved_fastq_gz'], checkIfExists: true) +// ] + +// FASTQC ( input ) +// } + +// // +// // Test with bam data +// // +// workflow test_fastqc_bam { +// input = [ +// [id: 'test', single_end: false], // meta map +// file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true) +// ] + +// FASTQC ( input ) +// } + +// // +// // Test with multiple samples +// // +// workflow test_fastqc_multiple { +// input = [ +// [id: 'test', single_end: false], // meta map +// [ +// file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true), +// file(params.test_data['sarscov2']['illumina']['test_2_fastq_gz'], checkIfExists: true), +// file(params.test_data['sarscov2']['illumina']['test2_1_fastq_gz'], checkIfExists: true), +// file(params.test_data['sarscov2']['illumina']['test2_2_fastq_gz'], checkIfExists: true) +// ] +// ] + +// FASTQC ( input ) +// } + +// // +// // Test with custom prefix +// // +// workflow test_fastqc_custom_prefix { +// input = [ +// [ id:'mysample', single_end:true ], // meta map +// file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) +// ] + +// FASTQC ( input ) +// } +} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap new file mode 100644 index 0000000..636a32c --- /dev/null +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -0,0 +1,10 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ] + ], + "timestamp": "2023-10-09T23:40:54+0000" + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..bc0bdb5 --- /dev/null +++ b/modules/nf-core/multiqc/environment.yml @@ -0,0 +1,7 @@ +name: multiqc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.18 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 1fc387b..00cc48d 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.14" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.18--pyhdfd78af_0' : + 'biocontainers/multiqc:1.18--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" @@ -25,12 +25,14 @@ process MULTIQC { def args = task.ext.args ?: '' def config = multiqc_config ? "--config $multiqc_config" : '' def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def logo = multiqc_logo ? /--cl-config 'custom_logo: "${multiqc_logo}"'/ : '' """ multiqc \\ --force \\ $args \\ $config \\ $extra_config \\ + $logo \\ . cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index f93b5ee..f1aa660 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,5 +1,5 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -name: MultiQC +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: multiqc description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - QC @@ -13,7 +13,6 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] - input: - multiqc_files: type: file @@ -31,7 +30,6 @@ input: type: file description: Optional logo file for MultiQC pattern: "*.{png}" - output: - report: type: file @@ -54,3 +52,8 @@ authors: - "@bunop" - "@drpatelh" - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test new file mode 100644 index 0000000..c2dad21 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,63 @@ +nextflow_process { + + name "Test Process MULTIQC" + script "../main.nf" + process "MULTIQC" + tag "modules" + tag "modules_nfcore" + tag "multiqc" + + test("MULTIQC: FASTQC") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz_fastqc_zip'], checkIfExists: true)]) + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.report.get(0)).exists() }, + { assert path(process.out.data.get(0)).exists() }, + { assert path(process.out.versions.get(0)).getText().contains("multiqc") } + ) + } + + } + + test("MULTIQC: FASTQC and a config file") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz_fastqc_zip'], checkIfExists: true)]) + input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.report.get(0)).exists() }, + { assert path(process.out.data.get(0)).exists() }, + { assert path(process.out.versions.get(0)).getText().contains("multiqc") } + ) + } + + } +} 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 3a6bf4f..3c69474 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,7 +14,7 @@ params { input = null // References genome = null - igenomes_base = 's3://ngi-igenomes/igenomes' + igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false @@ -82,6 +82,7 @@ profiles { dumpHashes = true process.beforeScript = 'echo $HOSTNAME' cleanup = false + nextflow.enable.configProcessNamesValidation = true } conda { conda.enabled = true @@ -104,13 +105,13 @@ profiles { } docker { docker.enabled = true - docker.userEmulation = true conda.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false + runOptions = '-u $(id -u):$(id -g)' } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' @@ -181,7 +182,7 @@ singularity.registry = 'quay.io' // Nextflow plugins plugins { - id 'nf-validation' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-validation@1.1.3' // Validation of pipeline parameters and creation of an input channel from a sample sheet } // Load igenomes.config if required @@ -204,6 +205,9 @@ env { // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] +// Disable process selector warnings by default. Use debug profile to enable warnings. +nextflow.enable.configProcessNamesValidation = false + def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { enabled = true From f47ae521834028e6f83183ad16ab6e11e0359558 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 20 Dec 2023 15:57:12 +0000 Subject: [PATCH 07/29] Template update for nf-core/tools version 2.11.1 --- .../{release-announcments.yml => release-announcements.yml} | 0 nextflow.config | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{release-announcments.yml => release-announcements.yml} (100%) diff --git a/.github/workflows/release-announcments.yml b/.github/workflows/release-announcements.yml similarity index 100% rename from .github/workflows/release-announcments.yml rename to .github/workflows/release-announcements.yml diff --git a/nextflow.config b/nextflow.config index 3c69474..4f8b05f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -111,10 +111,10 @@ profiles { shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false - runOptions = '-u $(id -u):$(id -g)' + docker.runOptions = '-u $(id -u):$(id -g)' } arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { singularity.enabled = true From 4f1b4a59b3a0ac264e4f7d052e98dc3911238c2c Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 29 Jan 2024 14:51:03 +0000 Subject: [PATCH 08/29] Template update for nf-core/tools version 2.12 --- .editorconfig | 8 + .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 67 +++++ .github/workflows/fix-linting.yml | 72 +++-- .github/workflows/linting.yml | 61 +--- .github/workflows/linting_comment.yml | 2 +- .github/workflows/release-announcements.yml | 4 +- .gitpod.yml | 1 + .pre-commit-config.yaml | 7 +- README.md | 8 +- assets/email_template.html | 2 +- assets/email_template.txt | 2 +- assets/nf-core-fastquorum_logo_light.png | Bin 20496 -> 114994 bytes docs/images/nf-core-fastquorum_logo_dark.png | Bin 78253 -> 29110 bytes docs/images/nf-core-fastquorum_logo_light.png | Bin 20496 -> 24844 bytes lib/WorkflowMain.groovy | 16 +- lib/nfcore_external_java_deps.jar | Bin 2291171 -> 0 bytes main.nf | 2 +- modules.json | 6 +- .../dumpsoftwareversions/environment.yml | 2 +- .../custom/dumpsoftwareversions/main.nf | 4 +- .../dumpsoftwareversions/tests/main.nf.test | 7 +- .../tests/main.nf.test.snap | 50 ++-- modules/nf-core/fastqc/tests/main.nf.test | 265 ++++++++++++------ .../nf-core/fastqc/tests/main.nf.test.snap | 12 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 6 +- modules/nf-core/multiqc/meta.yml | 1 - modules/nf-core/multiqc/tests/main.nf.test | 48 +++- .../nf-core/multiqc/tests/main.nf.test.snap | 21 ++ nextflow.config | 3 +- pyproject.toml | 17 +- workflows/fastquorum.nf | 7 + 36 files changed, 490 insertions(+), 221 deletions(-) create mode 100644 .github/workflows/download_pipeline.yml delete mode 100644 lib/nfcore_external_java_deps.jar create mode 100644 modules/nf-core/multiqc/tests/main.nf.test.snap diff --git a/.editorconfig b/.editorconfig index b6b3190..9b99008 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,3 +22,11 @@ indent_size = unset [/assets/email*] indent_size = unset + +# ignore Readme +[README.md] +indent_style = unset + +# ignore python +[*.{py}] +indent_style = unset diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index cef3003..69eb99b 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -31,7 +31,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: Tower debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 26a3e00..7c62d9a 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: Tower debug log file path: | diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index cdb5634..15eb4c1 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -19,7 +19,7 @@ jobs: # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() - uses: mshick/add-pr-comment@v1 + uses: mshick/add-pr-comment@v2 with: message: | ## This PR is against the `master` branch :x: diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 694e90e..e37cfda 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@v7 + - uses: actions/stale@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 new file mode 100644 index 0000000..8611458 --- /dev/null +++ b/.github/workflows/download_pipeline.yml @@ -0,0 +1,67 @@ +name: Test successful pipeline download with 'nf-core download' + +# Run the workflow when: +# - dispatched manually +# - when a PR is opened or reopened to master branch +# - the head branch of the pull request is updated, i.e. if fixes for a release are pushed last minute to dev. +on: + workflow_dispatch: + pull_request: + types: + - opened + branches: + - master + pull_request_target: + branches: + - master + +env: + NXF_ANSI_LOG: false + +jobs: + download: + runs-on: ubuntu-latest + steps: + - name: Install Nextflow + uses: nf-core/setup-nextflow@v1 + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + architecture: "x64" + - uses: eWaterCycle/setup-singularity@v7 + with: + singularity-version: 3.8.3 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install git+https://github.com/nf-core/tools.git@dev + + - name: Get the repository name and current branch set as environment variable + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> ${GITHUB_ENV} + echo "REPO_BRANCH=${GITHUB_REF#refs/heads/}" >> ${GITHUB_ENV} + + - name: Download the pipeline + env: + NXF_SINGULARITY_CACHEDIR: ./ + run: | + nf-core download ${{ env.REPO_LOWERCASE }} \ + --revision ${{ env.REPO_BRANCH }} \ + --outdir ./${{ env.REPOTITLE_LOWERCASE }} \ + --compress "none" \ + --container-system 'singularity' \ + --container-library "quay.io" -l "docker.io" -l "ghcr.io" \ + --container-cache-utilisation 'amend' \ + --download-configuration + + - name: Inspect download + run: tree ./${{ env.REPOTITLE_LOWERCASE }} + + - name: Run the downloaded pipeline + env: + NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 590d778..0948032 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -4,7 +4,7 @@ on: types: [created] jobs: - deploy: + fix-linting: # Only run if comment is on a PR with the main repo, and if it contains the magic keywords if: > contains(github.event.comment.html_url, '/pull/') && @@ -13,10 +13,17 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@v4 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # 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@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ github.event.comment.id }} + reactions: eyes + # Action runs on the issue comment, so we don't get the PR by default # Use the gh cli to check out the PR - name: Checkout Pull Request @@ -24,32 +31,59 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v4 + # Install and run pre-commit + - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + with: + python-version: 3.11 - - name: Install Prettier - run: npm install -g prettier @prettier/plugin-php + - name: Install pre-commit + run: pip install pre-commit - # Check that we actually need to fix something - - name: Run 'prettier --check' - id: prettier_status - run: | - if prettier --check ${GITHUB_WORKSPACE}; then - echo "result=pass" >> $GITHUB_OUTPUT - else - echo "result=fail" >> $GITHUB_OUTPUT - fi + - name: Run pre-commit + id: pre-commit + run: pre-commit run --all-files + continue-on-error: true - - name: Run 'prettier --write' - if: steps.prettier_status.outputs.result == 'fail' - run: prettier --write ${GITHUB_WORKSPACE} + # indication that the linting has finished + - name: react if linting finished succesfully + if: steps.pre-commit.outcome == 'success' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ github.event.comment.id }} + reactions: "+1" - name: Commit & push changes - if: steps.prettier_status.outputs.result == 'fail' + id: commit-and-push + if: steps.pre-commit.outcome == 'failure' run: | git config user.email "core@nf-co.re" git config user.name "nf-core-bot" git config push.default upstream git add . git status - git commit -m "[automated] Fix linting with Prettier" + git commit -m "[automated] Fix code linting" git push + + - name: react if linting errors were fixed + id: react-if-fixed + if: steps.commit-and-push.outcome == 'success' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ github.event.comment.id }} + reactions: hooray + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ github.event.comment.id }} + reactions: confused + + - name: react if linting errors were not fixed + if: steps.commit-and-push.outcome == 'failure' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + issue-number: ${{ github.event.issue.number }} + body: | + @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. + See [CI log](https://github.com/nf-core/fastquorum/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 905c58e..81cd098 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,61 +11,22 @@ on: types: [published] jobs: - EditorConfig: + pre-commit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - - - name: Install editorconfig-checker - run: npm install -g editorconfig-checker - - - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - - Prettier: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - - - name: Install Prettier - run: npm install -g prettier - - - name: Run Prettier --check - run: prettier --check ${GITHUB_WORKSPACE} - - PythonBlack: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Check code lints with Black - uses: psf/black@stable - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 with: - message: | - ## Python linting (`black`) is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` - * Fix formatting errors in your pipeline: `black .` - - Once you push these changes the test should pass, and you can hide this comment :+1: + python-version: 3.11 + cache: "pip" - We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install pre-commit + run: pip install pre-commit - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run pre-commit + run: pre-commit run --all-files nf-core: runs-on: ubuntu-latest @@ -76,7 +37,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.11" architecture: "x64" @@ -99,7 +60,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bbcd30..147bcd1 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@v2 + uses: dawidd6/action-download-artifact@v3 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 6ad3392..21ac3f0 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies @@ -56,7 +56,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@v0.0.2 + - uses: zentered/bluesky-post-action@v0.1.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.gitpod.yml b/.gitpod.yml index acf7269..363d5b1 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -7,6 +7,7 @@ tasks: - name: unset JAVA_TOOL_OPTIONS command: | unset JAVA_TOOL_OPTIONS + vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c31cdb..af57081 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,10 @@ repos: - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" + rev: "v3.1.0" hooks: - id: prettier + - repo: https://github.com/editorconfig-checker/editorconfig-checker.python + rev: "2.7.3" + hooks: + - id: editorconfig-checker + alias: ec diff --git a/README.md b/README.md index 5a5eb9f..99d7774 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ -# ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_light.png#gh-light-mode-only) ![nf-core/fastquorum](docs/images/nf-core-fastquorum_logo_dark.png#gh-dark-mode-only) - +

    + + + nf-core/fastquorum + +

    [![GitHub Actions CI Status](https://github.com/nf-core/fastquorum/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fastquorum/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fastquorum/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fastquorum/actions?query=workflow%3A%22nf-core+linting%22)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fastquorum/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) diff --git a/assets/email_template.html b/assets/email_template.html index 99b571b..2f82d79 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -12,7 +12,7 @@ -

    nf-core/fastquorum v${version}

    +

    nf-core/fastquorum ${version}

    Run Name: $runName

    <% if (!success){ diff --git a/assets/email_template.txt b/assets/email_template.txt index ca1dde7..1c6b654 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -4,7 +4,7 @@ |\\ | |__ __ / ` / \\ |__) |__ } { | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, `._,._,' - nf-core/fastquorum v${version} + nf-core/fastquorum ${version} ---------------------------------------------------- Run Name: $runName diff --git a/assets/nf-core-fastquorum_logo_light.png b/assets/nf-core-fastquorum_logo_light.png index 2c190220433d248d583d212247e94f451b0bd469..f37c6e1f3fd6ed15b03073583153ab29e5f8270a 100644 GIT binary patch literal 114994 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