diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74c..0000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d05e9ad..153b3a6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -78,7 +78,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 0000000..3408527 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 0000000..bf44d96 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,109 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 23c0502..e2c961f 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: run-platform: name: Run AWS full tests # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/pairgenomealign' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' + if: github.repository == 'nf-core/pairgenomealign' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' runs-on: ubuntu-latest steps: - name: Set revision variable @@ -39,7 +39,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 80d571e..de61a41 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index c063163..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/pairgenomealign') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.10.1" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f2..ac030fd 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@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ab06316..999bcc3 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -52,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: Setup Apptainer @@ -120,6 +112,7 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -132,3 +125,10 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 96% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index 8805d20..83ca397 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5..8b0f88c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -16,10 +13,10 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - name: Set up Python 3.13 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit @@ -36,13 +33,13 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 95b6b6a..d43797d 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@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 0000000..e7b5844 --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,143 @@ +name: Run nf-test +on: + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.2" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-nf-test + - runner=4cpu-linux-x64 + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "24.10.5" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=${{ github.run_id }}-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed (excluding latest-everything) + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 76a9e67..0f73249 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 + - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 95% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529b..beb5c77 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -14,7 +14,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.nf-core.yml b/.nf-core.yml index 09e1e4f..da850b1 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,7 +1,7 @@ lint: files_unchanged: - assets/nf-core-pairgenomealign_logo_light.png -nf_core_version: 3.2.1 +nf_core_version: 3.3.2 repository_type: pipeline template: author: charles-plessy @@ -11,4 +11,4 @@ template: name: pairgenomealign org: nf-core outdir: . - version: 1.1.1 + version: 2.2.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec865..bb41bee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + - prettier@3.6.2 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a7..07dbd8b 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/CHANGELOG.md b/CHANGELOG.md index cb282bd..6010d90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ 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). +## [v2.2.1](https://github.com/nf-core/pairgenomealign/releases/tag/2.2.1) "C’est quoi ça?" - [August 5th 2025] + +### `Fixed` + +- Conforms to nf-core template version 3.3.2, hopefully fixing AWS tests ([#85](https://github.com/nf-core/pairgenomealign/pull/85)) ([#83](https://github.com/nf-core/pairgenomealign/pull/83)). +- Added missing pipeline and subworkflow test snapshots and stabilise line order in some output files ([#84](https://github.com/nf-core/pairgenomealign/pull/84)). +- Update modules to latest version, thereby pulling an important fix for a race condition in `last/mafconvert` ([#87](https://github.com/nf-core/pairgenomealign/pull/87)), ([#88](https://github.com/nf-core/pairgenomealign/pull/88)). +- Report `jq` version used in `MULTIQC_ASSEMBLYSCAN_PLOT_DATA` ([#81](https://github.com/nf-core/pairgenomealign/pull/81)). +- Document module names in tube map ([#74](https://github.com/nf-core/pairgenomealign/pull/74)). +- Add mising modules in tube map ([#68](https://github.com/nf-core/pairgenomealign/pull/68)). +- Materialise output files in tube map ([#75](https://github.com/nf-core/pairgenomealign/pull/75)). + +### `Dependencies` + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `MultiQC` | 1.28 | 1.30 | + ## [v2.2.0](https://github.com/nf-core/pairgenomealign/releases/tag/2.2.0) "Chagara ponzu" - [May 29th 2025] ### `Added` diff --git a/README.md b/README.md index 7e3d353..702a018 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,18 @@ -[![GitHub Actions CI Status](https://github.com/nf-core/pairgenomealign/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/pairgenomealign/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/pairgenomealign/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13910535-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13910535) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.10.1-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/pairgenomealign) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pairgenomealign-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pairgenomealign)[![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) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pairgenomealign-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pairgenomealign)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 12db0c7..ec044b5 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/pairgenomealign analysis pipeline. For information about - how to interpret these results, please see the documentation. report_section_order: "nf-core-pairgenomealign-methods-description": diff --git a/conf/base.config b/conf/base.config index 3b67330..7b38da2 100644 --- a/conf/base.config +++ b/conf/base.config @@ -14,7 +14,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -57,4 +57,8 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } + } } diff --git a/docs/images/pairgenomealign-tubemap.png b/docs/images/pairgenomealign-tubemap.png index 1624239..ed502a6 100644 Binary files a/docs/images/pairgenomealign-tubemap.png and b/docs/images/pairgenomealign-tubemap.png differ diff --git a/docs/images/pairgenomealign-tubemap.svg b/docs/images/pairgenomealign-tubemap.svg index 3160d67..41c5c7d 100644 --- a/docs/images/pairgenomealign-tubemap.svg +++ b/docs/images/pairgenomealign-tubemap.svg @@ -2,16 +2,16 @@ + + + + + + + + + + + + + + + + + + + transform="translate(-14.374769,-40.906011)"> + + + + + + + last/dotplot + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transform="matrix(0.82868225,-0.64152186,1.5099622,0.35207358,-83.059076,173.12852)"> - - + d="m 256.68383,89.400269 176.61536,0.720973 0.10264,14.822918" + id="path88" + sodipodi:nodetypes="ccc" /> + sodipodi:nodetypes="ccc" /> - - + style="stroke-width:4.03224;stroke-dasharray:none" /> - - Indexseeds + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.32292" + x="149.41658" + y="69.561821" + id="tspan85">last/lastdb seqtk cutN + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.32292" + x="108.32681" + y="55.208851">seqtk/cutn assembly-scan + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.32292" + x="63.505283" + y="54.982609">assemblyscan Target Target genome + x="17.771902" + y="86.627846" + id="tspan34" /> TrainParameters + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.32292" + x="198.27255" + y="76.376396" + id="tspan84">last/train Query genome(s) - + x="15.769502" + y="64.819618">Queries fasta fasta - - - png - - - - - - png - - - - - - - - - - - - - - - - - - - - - - + + + maf - - - - - maf + + + + + maf - + id="text6825" + transform="scale(1,-1)">BAM + + + + + CRAM + + Inputs + x="19.49715" + y="51.166058" + id="tspan4367">Input - m2o - m2m - o2o + id="g1546" + transform="translate(-2.7185421e-6,-4.540324)"> o2o + x="185.77745" + y="103.22358" + id="tspan4475">m2o + id="g981" + transform="translate(29.829741,-4.540324)"> m2o + x="225.13293" + y="103.25355" + id="tspan4479">m2m + id="g6118" + transform="translate(0.50224568,-7.4588477)"> m2o + x="186.11133" + y="125.68999" + id="tspan4483">o2o + id="g758" + transform="translate(17.566003,-20.43875)"> m2m + x="209.79419" + y="138.66989" + id="tspan4491">m2o + transform="translate(40.746697,-19.762516)"> o2m + last/split + + last/mafconvert + last/lastal - - o2m + id="g6404" + transform="translate(-103.60377,92.829652)"> + + + + maf + + + + + PNG + + + + + + + + + maf + + + + + MAF + + + + + (Optional) + transform="matrix(0.26458333,0,0,0.26458333,81.182646,-43.520291)" + id="text7814" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:13.3333px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono';text-align:justify;white-space:pre;shape-inside:url(#rect7816);display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.4;stroke-dashoffset:624.756;stroke-opacity:0" + x="0" + y="0">samtools +/ +bgzip + samtools +/ +dict Default - - + x="318.11328" + y="180.52196" + id="tspan62-7">Export + + + + + v2.2 + + + + + + + + + + + + + + + + + + + nf- + core / + + + + + + + pairgenome + align + + + + + + + + + + + + + + + + One-to-one + + + + Many-to-one + + + + Outputs + + + + modules + + + + One-to-many + + + + Target genome + + + + + Query genome(s) + + + Inputs + + + + + Many-to-many + + + Optional / Alternative + + + + diff --git a/modules.json b/modules.json index 5600f12..cda6c6f 100644 --- a/modules.json +++ b/modules.json @@ -7,62 +7,62 @@ "nf-core": { "assemblyscan": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "last/dotplot": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "last/lastal": { "branch": "master", - "git_sha": "90689d2e4b5a6a50dd0e0a5a29cb5f5b0fc6ab95", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "last/lastdb": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "last/mafconvert": { "branch": "master", - "git_sha": "299a50faa298a9cfd794b33d1fd19513ead43074", + "git_sha": "c1de1f68429a3e9d3bf862276ab4bb41fe606051", "installed_by": ["modules"] }, "last/split": { "branch": "master", - "git_sha": "8d93c521ea9887d6539fcd2e4d909d863eef6fec", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "last/train": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "7b50cb7be890e4b28cffb82e438cc6a8d7805d3f", + "git_sha": "c9a31c472ef2d86802eb44f27322955849859361", "installed_by": ["modules"] }, "samtools/bgzip": { "branch": "master", - "git_sha": "f2dba87f4793a4015f0611cd1743cbfb598c74e7", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "samtools/dict": { "branch": "master", - "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } diff --git a/modules/local/multiqc_assemblyscan_plot_data/environment.yml b/modules/local/multiqc_assemblyscan_plot_data/environment.yml index e8331cd..761454e 100644 --- a/modules/local/multiqc_assemblyscan_plot_data/environment.yml +++ b/modules/local/multiqc_assemblyscan_plot_data/environment.yml @@ -1,3 +1,5 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda diff --git a/modules/local/multiqc_assemblyscan_plot_data/main.nf b/modules/local/multiqc_assemblyscan_plot_data/main.nf index a10f22e..730cfc1 100644 --- a/modules/local/multiqc_assemblyscan_plot_data/main.nf +++ b/modules/local/multiqc_assemblyscan_plot_data/main.nf @@ -14,7 +14,8 @@ process MULTIQC_ASSEMBLYSCAN_PLOT_DATA { path(json) output: - path ("*_mqc.tsv"), emit: tsv + path ("*_mqc.tsv") , emit: tsv + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -52,5 +53,23 @@ process MULTIQC_ASSEMBLYSCAN_PLOT_DATA { printf "\$(basename \$i .json)\t" >> contig_length_mqc.tsv jq -r '[.total_contig_length, .min_contig_length, .max_contig_length, .total_contig, .contigs_greater_1k, .contigs_greater_10k] | @tsv' \$i >> contig_length_mqc.tsv done + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + jq: \$(jq --version 2>&1 | sed 's/jq-//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch gc_summary_mqc.tsv + touch contig_length_mqc.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + jq: \$(jq --version 2>&1 | sed 's/jq-//') + END_VERSIONS """ } diff --git a/modules/nf-core/assemblyscan/main.nf b/modules/nf-core/assemblyscan/main.nf index 5a3dff4..928f792 100644 --- a/modules/nf-core/assemblyscan/main.nf +++ b/modules/nf-core/assemblyscan/main.nf @@ -18,10 +18,9 @@ process ASSEMBLYSCAN { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - assembly-scan $assembly > ${prefix}.json + assembly-scan ${assembly} > ${prefix}.json cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/assemblyscan/meta.yml b/modules/nf-core/assemblyscan/meta.yml index d8bcf06..d11ea5e 100644 --- a/modules/nf-core/assemblyscan/meta.yml +++ b/modules/nf-core/assemblyscan/meta.yml @@ -23,9 +23,10 @@ input: type: file description: FASTA file for a given assembly pattern: "*.fasta" + ontologies: [] output: - - json: - - meta: + json: + - - meta: type: map description: | Groovy Map containing sample information @@ -34,11 +35,15 @@ output: type: file description: Assembly statistics in JSON format pattern: "*.json" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3464 # JSON + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@sateeshperi" - "@mjcipriano" diff --git a/modules/nf-core/assemblyscan/tests/main.nf.test b/modules/nf-core/assemblyscan/tests/main.nf.test index 7ca4444..eae9b4f 100644 --- a/modules/nf-core/assemblyscan/tests/main.nf.test +++ b/modules/nf-core/assemblyscan/tests/main.nf.test @@ -7,17 +7,14 @@ nextflow_process { tag "modules_nfcore" tag "assemblyscan" - test("Should run without failures") { + test("genome.fasta") { when { - params { - outdir = "$outputDir" - } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] + input[0] = [ [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] """ } } @@ -28,7 +25,5 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } - } diff --git a/modules/nf-core/assemblyscan/tests/main.nf.test.snap b/modules/nf-core/assemblyscan/tests/main.nf.test.snap index b459af8..3985ac6 100644 --- a/modules/nf-core/assemblyscan/tests/main.nf.test.snap +++ b/modules/nf-core/assemblyscan/tests/main.nf.test.snap @@ -1,5 +1,5 @@ { - "Should run without failures": { + "genome.fasta": { "content": [ { "0": [ diff --git a/modules/nf-core/last/dotplot/meta.yml b/modules/nf-core/last/dotplot/meta.yml index 8599d07..26d2625 100644 --- a/modules/nf-core/last/dotplot/meta.yml +++ b/modules/nf-core/last/dotplot/meta.yml @@ -25,11 +25,13 @@ input: type: file description: Multiple Alignment Format (MAF) file, compressed with gzip pattern: "*.{maf.gz}" + ontologies: [] - annot_b: type: file description: Annotation file in BED, Repeamasker, genePred or AGP format for the second (vertical) sequence pattern: "*.{bed,bed.gz,out,out.gz,rmsk.txt,rmsk.txt.gz,genePred,genePred.gz,gff,gff.gz,gtf,gtf.gz,gap.txt,gap.txt.gz}" + ontologies: [] - - meta2: type: map description: | @@ -40,15 +42,16 @@ input: description: Annotation file in BED, Repeamasker, genePred or AGP format for the first (horizontal) sequence pattern: "*.{bed,bed.gz,out,out.gz,rmsk.txt,rmsk.txt.gz,genePred,genePred.gz,gff,gff.gz,gtf,gtf.gz,gap.txt,gap.txt.gz}" - - - format: - type: string - description: Output format (PNG or GIF). - - - filter: - type: boolean - description: Remove isolated alignments using the `maf-linked` software. + ontologies: [] + - format: + type: string + description: Output format (PNG or GIF). + - filter: + type: boolean + description: Remove isolated alignments using the `maf-linked` software. output: - - gif: - - meta: + gif: + - - meta: type: map description: | Groovy Map containing sample information @@ -57,8 +60,9 @@ output: type: file description: Pairwise alignment dot plot image, in GIF format. pattern: "*.gif" - - png: - - meta: + ontologies: [] + png: + - - meta: type: map description: | Groovy Map containing sample information @@ -67,11 +71,14 @@ output: type: file description: Pairwise alignment dot plot image, in PNG format. pattern: "*.png" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@charles-plessy" maintainers: diff --git a/modules/nf-core/last/lastal/meta.yml b/modules/nf-core/last/lastal/meta.yml index 162cfa0..43cfb88 100644 --- a/modules/nf-core/last/lastal/meta.yml +++ b/modules/nf-core/last/lastal/meta.yml @@ -24,17 +24,20 @@ input: type: file description: FASTA/FASTQ file pattern: "*.{fasta,fastq}" + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ - param_file: type: file description: Trained parameter file pattern: "*.train" - - - index: - type: directory - description: Directory containing the files of the LAST index - pattern: "lastdb/" + ontologies: [] + - index: + type: directory + description: Directory containing the files of the LAST index + pattern: "lastdb/" output: - - maf: - - meta: + maf: + - - meta: type: map description: | Groovy Map containing sample information @@ -43,8 +46,9 @@ output: type: file description: Gzipped MAF (Multiple Alignment Format) file pattern: "*.{maf.gz}" - - multiqc: - - meta: + ontologies: [] + multiqc: + - - meta: type: map description: | Groovy Map containing sample information @@ -57,11 +61,15 @@ output: consideration (because there is no standard definition of percent identity). pattern: "*.tsv" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@charles-plessy" maintainers: diff --git a/modules/nf-core/last/lastdb/meta.yml b/modules/nf-core/last/lastdb/meta.yml index 5c7be37..9a5bcbb 100644 --- a/modules/nf-core/last/lastdb/meta.yml +++ b/modules/nf-core/last/lastdb/meta.yml @@ -25,9 +25,11 @@ input: description: > Sequence file in FASTA or FASTQ format. May be compressed with gzip. pattern: "*.{fasta,fasta.gz,fastq,fastq.gz}" + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ output: - - index: - - meta: + index: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,11 +38,13 @@ output: type: directory description: directory containing the files of the LAST index pattern: "lastdb/" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@charles-plessy" maintainers: diff --git a/modules/nf-core/last/mafconvert/main.nf b/modules/nf-core/last/mafconvert/main.nf index bc2b463..ab7fb80 100644 --- a/modules/nf-core/last/mafconvert/main.nf +++ b/modules/nf-core/last/mafconvert/main.nf @@ -21,7 +21,7 @@ process LAST_MAFCONVERT { tuple val(meta), path("*.blast.gz"), optional:true, emit: blast_gz tuple val(meta), path("*.blasttab.gz"), optional:true, emit: blasttab_gz tuple val(meta), path("*.chain.gz"), optional:true, emit: chain_gz - tuple val(meta), path("*.cram"), path(fasta), optional:true, emit: cram + tuple val(meta), path("*.cram"), optional:true, emit: cram tuple val(meta), path("*.gff.gz"), optional:true, emit: gff_gz tuple val(meta), path("*.html.gz"), optional:true, emit: html_gz tuple val(meta), path("*.psl.gz"), optional:true, emit: psl_gz diff --git a/modules/nf-core/last/mafconvert/meta.yml b/modules/nf-core/last/mafconvert/meta.yml index e4a6929..fcc2a23 100644 --- a/modules/nf-core/last/mafconvert/meta.yml +++ b/modules/nf-core/last/mafconvert/meta.yml @@ -25,6 +25,7 @@ input: description: Multiple Alignment Format (MAF) file, optionally compressed with gzip pattern: "*.{maf.gz,maf}" + ontologies: [] - format: type: string description: Output format (one of axt, bam, blast, blasttab, cram, chain, gff, @@ -36,9 +37,10 @@ input: e.g. `[ id:'sample1', single_end:false ]` - fasta: type: file - description: Genome file in FASTA format for CRAM conversion. If compressed it - must be done in BGZF format (like with the bgzip tool). + description: Genome file in FASTA format for CRAM conversion. If compressed + it must be done in BGZF format (like with the bgzip tool). pattern: "*.{fasta,fasta.gz,fasta.bgz,fasta.bgzf}" + ontologies: [] - - meta3: type: map description: | @@ -48,6 +50,7 @@ input: type: file description: Genome index file needed for CRAM conversion. pattern: "*.fai" + ontologies: [] - - meta4: type: map description: | @@ -58,6 +61,7 @@ input: description: Genome index file needed for CRAM conversion when the genome file was compressed with the BGZF algorithm. pattern: "*.gzi" + ontologies: [] - - meta5: type: map description: | @@ -67,9 +71,10 @@ input: type: file description: Samtools dictionary of the genome file. pattern: "*.dict" + ontologies: [] output: - - axt_gz: - - meta: + axt_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -78,8 +83,10 @@ output: type: file description: Gzipped pairwise alignment in Axt (Blastz) format (optional) pattern: "*.axt.gz" - - bam: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -88,8 +95,9 @@ output: type: file description: Pairwise alignment in BAM format (optional) pattern: "*.bam" - - bed_gz: - - meta: + ontologies: [] + bed_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -98,8 +106,10 @@ output: type: file description: Gzipped pairwise alignment in BED format (optional) pattern: "*.bed.gz" - - blast_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + blast_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -108,8 +118,10 @@ output: type: file description: Gzipped pairwise alignment in blast format (optional) pattern: "*.blast.gz" - - blasttab_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + blasttab_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -118,8 +130,10 @@ output: type: file description: Gzipped pairwise alignment in blasttab format (optional) pattern: "*.blasttab.gz" - - chain_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + chain_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -128,8 +142,10 @@ output: type: file description: Gzipped pairwise alignment in UCSC chain format (optional) pattern: "*.chain.gz" - - cram: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -138,12 +154,9 @@ output: type: file description: Pairwise alignment in CRAM format (optional) pattern: "*.cram" - - fasta: - type: file - description: Genome file to recover sequences from the CRAM file (optional) - pattern: "*.{fasta,fasta.gz,fasta.bgz,fasta.bgzf}" - - gff_gz: - - meta: + ontologies: [] + gff_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -152,8 +165,10 @@ output: type: file description: Gzipped pairwise alignment in GFF format (optional) pattern: "*.gff.gz" - - html_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + html_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -162,8 +177,10 @@ output: type: file description: Gzipped pairwise alignment in HTML format (optional) pattern: "*.html.gz" - - psl_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + psl_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -172,8 +189,10 @@ output: type: file description: Gzipped pairwise alignment in PSL (BLAT) format (optional) pattern: "*.psl.gz" - - sam_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + sam_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -182,8 +201,10 @@ output: type: file description: Gzipped pairwise alignment in SAM format (optional) pattern: "*.sam.gz" - - tab_gz: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tab_gz: + - - meta: type: map description: | Groovy Map containing sample information @@ -192,11 +213,15 @@ output: type: file description: Gzipped pairwise alignment in TAB format (optional) pattern: "*.tab.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@aleksandrabliznina" - "@charles-plessy" diff --git a/modules/nf-core/last/mafconvert/tests/main.nf.test b/modules/nf-core/last/mafconvert/tests/main.nf.test index fd3eb5f..a7af341 100644 --- a/modules/nf-core/last/mafconvert/tests/main.nf.test +++ b/modules/nf-core/last/mafconvert/tests/main.nf.test @@ -124,7 +124,7 @@ nextflow_process { assertAll( { assert process.success }, { assert snapshot( - process.out.cram.collect { cram(it[1], it[2]).getReadsMD5() }, + process.out.cram.collect { cram(it[1], it[1].replaceAll(/[^\/]+\.cram$/, 'genome.fasta')).getReadsMD5() }, process.out.versions ).match() } ) diff --git a/modules/nf-core/last/split/meta.yml b/modules/nf-core/last/split/meta.yml index 334e0ff..d91fb11 100644 --- a/modules/nf-core/last/split/meta.yml +++ b/modules/nf-core/last/split/meta.yml @@ -25,9 +25,10 @@ input: type: file description: Multiple Alignment Format (MAF) file, compressed with gzip pattern: "*.{maf.gz}" + ontologies: [] output: - - maf: - - meta: + maf: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,8 +37,9 @@ output: type: file description: Multiple Alignment Format (MAF) file, compressed with gzip pattern: "*.{maf.gz}" - - multiqc: - - meta: + ontologies: [] + multiqc: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,11 +52,15 @@ output: consideration (because there is no standard definition of percent identity). pattern: "*.tsv" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@aleksandrabliznina" - "@charles-plessy" diff --git a/modules/nf-core/last/train/meta.yml b/modules/nf-core/last/train/meta.yml index d91ceca..cd518a3 100644 --- a/modules/nf-core/last/train/meta.yml +++ b/modules/nf-core/last/train/meta.yml @@ -24,13 +24,15 @@ input: type: file description: FASTA/FASTQ file pattern: "*.{fasta,fastq}" - - - index: - type: directory - description: Directory containing the files of the LAST index - pattern: "lastdb/" + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ + - index: + type: directory + description: Directory containing the files of the LAST index + pattern: "lastdb/" output: - - param_file: - - meta: + param_file: + - - meta: type: map description: | Groovy Map containing sample information @@ -39,8 +41,9 @@ output: type: file description: Trained parameter file pattern: "*.train" - - multiqc: - - meta: + ontologies: [] + multiqc: + - - meta: type: map description: | Groovy Map containing sample information @@ -49,11 +52,15 @@ output: type: file description: Alignment parameter summary for MultiQC pattern: "*.tsv" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@aleksandrabliznina" - "@charles-plessy" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d430da5..f893704 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.28 + - bioconda::multiqc=1.30 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index f3b5704..a508541 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.28--pyhdfd78af_0' : - 'biocontainers/multiqc:1.28--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.30--pyhdfd78af_0' : + 'biocontainers/multiqc:1.30--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c187..ce30eb7 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - 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: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 26d7430..0d3f288 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,b05075d2d2b4f485c0d627a5c8e475b2" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.4" + "nf-test": "0.9.2", + "nextflow": "25.04.3" }, - "timestamp": "2025-03-26T16:05:18.927925" + "timestamp": "2025-07-10T08:06:23.563041241" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,b05075d2d2b4f485c0d627a5c8e475b2" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.4" + "nf-test": "0.9.2", + "nextflow": "25.04.3" }, - "timestamp": "2025-03-26T16:05:55.639955" + "timestamp": "2025-07-10T08:06:48.96226832" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,b05075d2d2b4f485c0d627a5c8e475b2" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.4" + "nf-test": "0.9.2", + "nextflow": "25.04.3" }, - "timestamp": "2025-03-26T16:05:44.067369" + "timestamp": "2025-07-10T08:06:40.627008706" } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/bgzip/meta.yml b/modules/nf-core/samtools/bgzip/meta.yml index a081e7d..e9e1007 100644 --- a/modules/nf-core/samtools/bgzip/meta.yml +++ b/modules/nf-core/samtools/bgzip/meta.yml @@ -25,9 +25,10 @@ input: type: file description: FASTA file, compressed or not. pattern: "*.{fa,fa.gz,fa.bz2,fa.xz,fasta,fasta.gz,fasta.bz2,fasta.xz}" + ontologies: [] output: - - fasta: - - meta: + fasta: + - - meta: type: map description: | Groovy Map containing sample information @@ -39,11 +40,13 @@ output: A FASTA file compressed with the BGZF algorithm. It will be the original file if it was already BGZF-compressed. pattern: "*.{fa.gz,fasta.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@charles-plessy" maintainers: diff --git a/modules/nf-core/samtools/dict/meta.yml b/modules/nf-core/samtools/dict/meta.yml index a84b1cf..95f58ed 100644 --- a/modules/nf-core/samtools/dict/meta.yml +++ b/modules/nf-core/samtools/dict/meta.yml @@ -25,9 +25,10 @@ input: type: file description: FASTA file pattern: "*.{fa,fasta}" + ontologies: [] output: - - dict: - - meta: + dict: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,11 +37,14 @@ output: type: file description: FASTA dictionary file pattern: "*.{dict}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@muffato" maintainers: diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index 256a330..b7a2e0c 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -26,6 +26,7 @@ input: type: file description: FASTA file pattern: "*.{fa,fasta}" + ontologies: [] - - meta2: type: map description: | @@ -35,13 +36,14 @@ input: type: file description: FASTA index file pattern: "*.{fai}" - - - get_sizes: - type: boolean - description: use cut to get the sizes of the index (true) or not (false) + ontologies: [] + - get_sizes: + type: boolean + description: use cut to get the sizes of the index (true) or not (false) output: - - fa: - - meta: + fa: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,28 +52,31 @@ output: type: file description: FASTA file pattern: "*.{fa}" - - fai: - - meta: + ontologies: [] + sizes: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.fai": + - "*.sizes": type: file - description: FASTA index file - pattern: "*.{fai}" - - sizes: - - meta: + description: File containing chromosome lengths + pattern: "*.{sizes}" + ontologies: [] + fai: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.sizes": + - "*.fai": type: file - description: File containing chromosome lengths - pattern: "*.{sizes}" - - gzi: - - meta: + description: FASTA index file + pattern: "*.{fai}" + ontologies: [] + gzi: + - - meta: type: map description: | Groovy Map containing sample information @@ -80,11 +85,14 @@ output: type: file description: Optional gzip index file for compressed inputs pattern: "*.gzi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/seqtk/cutn/meta.yml b/modules/nf-core/seqtk/cutn/meta.yml index 2e39a47..98123ed 100644 --- a/modules/nf-core/seqtk/cutn/meta.yml +++ b/modules/nf-core/seqtk/cutn/meta.yml @@ -24,9 +24,10 @@ input: type: file description: A single fasta file to be split. pattern: "*.{fasta}" + ontologies: [] output: - - bed: - - meta: + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -35,11 +36,14 @@ output: type: file description: The output bed which summarised locations of cuts pattern: "*.{bed}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@DLBPointon" maintainers: diff --git a/nextflow.config b/nextflow.config index b8917ad..87cada4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -187,16 +187,25 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } test_small{ includeConfig 'conf/test_small.config'} // Just a pair of fungal genomes test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/pairgenomealign custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + // Load nf-core/pairgenomealign custom profiles from different institutions. -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/pairgenomealign.config" : "/dev/null" +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/pairgenomealign.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -275,14 +284,14 @@ manifest { description = """Pairwise alignment pipeline (genome to genome or reads to genome)""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.1' - version = '2.2.0' + nextflowVersion = '!>=24.10.5' + version = '2.2.1' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 0000000..3a1fff5 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' + + // run all test with defined profile(s) from the main nextflow.config + profile "test" + + // list of filenames or patterns that should be trigger a full test run + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 9927d11..069fb78 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-05-29T02:39:54+00:00", - "description": "

\n \n \n \"nf-core/pairgenomealign\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/pairgenomealign/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/pairgenomealign/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13910535-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13910535)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.10.1-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/pairgenomealign)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pairgenomealign-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pairgenomealign)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/pairgenomealign** is a bioinformatics pipeline that aligns one or more _query_ genomes to a _target_ genome, and plots pairwise representations.\n\n![Tubemap workflow summary](docs/images/pairgenomealign-tubemap.png \"Tubemap workflow summary\")\n\nThe main steps of the pipeline are:\n\n1. Genome QC ([`assembly-scan`](https://github.com/rpetit3/assembly-scan)).\n2. Genome indexing ([`lastdb`](https://gitlab.com/mcfrith/last/-/blob/main/doc/lastdb.rst)).\n3. Genome pairwise alignments ([`lastal`](https://gitlab.com/mcfrith/last/-/blob/main/doc/lastal.rst)).\n4. Alignment plotting ([`last-dotplot`](https://gitlab.com/mcfrith/last/-/blob/main/doc/last-dotplot.rst)).\n5. Alignment export to various formats with [`maf-convert`](https://gitlab.com/mcfrith/last/-/blob/main/doc/maf-convert.rst), plus [`Samtools`](https://www.htslib.org/) for SAM/BAM/CRAM.\n\nThe pipeline can generate four kinds of outputs, called _many-to-many_, _many-to-one_, _one-to-many_ and _one-to-one_, depending on whether sequences of one genome are allowed match the other genome multiple times or not.\n\nThese alignments are output in [MAF](https://genome.ucsc.edu/FAQ/FAQformat.html#format5) format, and optional line plot representations are output in PNG format.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.csv`:\n\n```csv\nsample,fasta\nquery_1,path-to-query-genome-file-one.fasta\nquery_2,path-to-query-genome-file-two.fasta\n```\n\nEach row represents a fasta file, this can also contain multiple rows to accomodate multiple query genomes in fasta format.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/pairgenomealign \\\n -profile \\\n --target sequencefile.fa \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/pairgenomealign/usage) and the [parameter documentation](https://nf-co.re/pairgenomealign/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/pairgenomealign/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/pairgenomealign/output).\n\n## Credits\n\n`nf-core/pairgenomealign` was originally written by [charles-plessy](https://github.com/charles-plessy); the original versions are available at .\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Mahdi Mohammed](https://github.com/U13bs1125) ported the original pipeline to _nf-core_ template 2.14.x.\n- [Martin Frith](https://github.com/mcfrith/), the author of LAST, gave us extensive feedback and advices.\n- [Michael Mansfield](https://github.com/mjmansfi) tested the pipeline and provided critical comments.\n- [Aleksandra Bliznina](https://github.com/aleksandrabliznina) contributed to the creation of the initial `last/*` modules.\n- [Jiashun Miao](https://github.com/miaojiashun) and [Huyen Pham](https://github.com/ngochuyenpham) tested the pipeline on vertebrate genomes.\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#pairgenomealign` channel](https://nfcore.slack.com/channels/pairgenomealign) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use this pipeline, please cite:\n\n> **Extreme genome scrambling in marine planktonic Oikopleura dioica cryptic species.**\n> Charles Plessy, Michael J. Mansfield, Aleksandra Bliznina, Aki Masunaga, Charlotte West, Yongkai Tan, Andrew W. Liu, Jan Gra\u0161i\u010d, Mar\u00eda Sara del R\u00edo Pisula, Gaspar S\u00e1nchez-Serna, Marc Fabrega-Torrus, Alfonso Ferr\u00e1ndez-Rold\u00e1n, Vittoria Roncalli, Pavla Navratilova, Eric M. Thompson, Takeshi Onuma, Hiroki Nishida, Cristian Ca\u00f1estro, Nicholas M. Luscombe.\n> _Genome Res._ 2024. 34: 426-440; doi: [10.1101/2023.05.09.539028](https://doi.org/10.1101/gr.278295.123). PubMed ID: [38621828](https://pubmed.ncbi.nlm.nih.gov/38621828/)\n\n[OIST research news article](https://www.oist.jp/news-center/news/2024/4/25/oikopleura-who-species-identity-crisis-genome-community)\n\nAnd also please cite the [LAST papers](https://gitlab.com/mcfrith/last/-/blob/main/doc/last-papers.rst).\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-08-04T13:46:41+00:00", + "description": "

\n \n \n \"nf-core/pairgenomealign\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/pairgenomealign/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/pairgenomealign/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/pairgenomealign/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13910535-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13910535)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/pairgenomealign)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pairgenomealign-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pairgenomealign)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/pairgenomealign** is a bioinformatics pipeline that aligns one or more _query_ genomes to a _target_ genome, and plots pairwise representations.\n\n![Tubemap workflow summary](docs/images/pairgenomealign-tubemap.png \"Tubemap workflow summary\")\n\nThe main steps of the pipeline are:\n\n1. Genome QC ([`assembly-scan`](https://github.com/rpetit3/assembly-scan)).\n2. Genome indexing ([`lastdb`](https://gitlab.com/mcfrith/last/-/blob/main/doc/lastdb.rst)).\n3. Genome pairwise alignments ([`lastal`](https://gitlab.com/mcfrith/last/-/blob/main/doc/lastal.rst)).\n4. Alignment plotting ([`last-dotplot`](https://gitlab.com/mcfrith/last/-/blob/main/doc/last-dotplot.rst)).\n5. Alignment export to various formats with [`maf-convert`](https://gitlab.com/mcfrith/last/-/blob/main/doc/maf-convert.rst), plus [`Samtools`](https://www.htslib.org/) for SAM/BAM/CRAM.\n\nThe pipeline can generate four kinds of outputs, called _many-to-many_, _many-to-one_, _one-to-many_ and _one-to-one_, depending on whether sequences of one genome are allowed match the other genome multiple times or not.\n\nThese alignments are output in [MAF](https://genome.ucsc.edu/FAQ/FAQformat.html#format5) format, and optional line plot representations are output in PNG format.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.csv`:\n\n```csv\nsample,fasta\nquery_1,path-to-query-genome-file-one.fasta\nquery_2,path-to-query-genome-file-two.fasta\n```\n\nEach row represents a fasta file, this can also contain multiple rows to accomodate multiple query genomes in fasta format.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/pairgenomealign \\\n -profile \\\n --target sequencefile.fa \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/pairgenomealign/usage) and the [parameter documentation](https://nf-co.re/pairgenomealign/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/pairgenomealign/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/pairgenomealign/output).\n\n## Credits\n\n`nf-core/pairgenomealign` was originally written by [charles-plessy](https://github.com/charles-plessy); the original versions are available at .\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Mahdi Mohammed](https://github.com/U13bs1125) ported the original pipeline to _nf-core_ template 2.14.x.\n- [Martin Frith](https://github.com/mcfrith/), the author of LAST, gave us extensive feedback and advices.\n- [Michael Mansfield](https://github.com/mjmansfi) tested the pipeline and provided critical comments.\n- [Aleksandra Bliznina](https://github.com/aleksandrabliznina) contributed to the creation of the initial `last/*` modules.\n- [Jiashun Miao](https://github.com/miaojiashun) and [Huyen Pham](https://github.com/ngochuyenpham) tested the pipeline on vertebrate genomes.\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#pairgenomealign` channel](https://nfcore.slack.com/channels/pairgenomealign) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use this pipeline, please cite:\n\n> **Extreme genome scrambling in marine planktonic Oikopleura dioica cryptic species.**\n> Charles Plessy, Michael J. Mansfield, Aleksandra Bliznina, Aki Masunaga, Charlotte West, Yongkai Tan, Andrew W. Liu, Jan Gra\u0161i\u010d, Mar\u00eda Sara del R\u00edo Pisula, Gaspar S\u00e1nchez-Serna, Marc Fabrega-Torrus, Alfonso Ferr\u00e1ndez-Rold\u00e1n, Vittoria Roncalli, Pavla Navratilova, Eric M. Thompson, Takeshi Onuma, Hiroki Nishida, Cristian Ca\u00f1estro, Nicholas M. Luscombe.\n> _Genome Res._ 2024. 34: 426-440; doi: [10.1101/2023.05.09.539028](https://doi.org/10.1101/gr.278295.123). PubMed ID: [38621828](https://pubmed.ncbi.nlm.nih.gov/38621828/)\n\n[OIST research news article](https://www.oist.jp/news-center/news/2024/4/25/oikopleura-who-species-identity-crisis-genome-community)\n\nAnd also please cite the [LAST papers](https://gitlab.com/mcfrith/last/-/blob/main/doc/last-papers.rst).\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#320cb964-03ab-417e-a9e4-71e5359ea925" + "@id": "#f1f18087-a501-4361-b9bd-b1a99e1a9ef3" } ], "name": "nf-core/pairgenomealign" @@ -138,7 +138,7 @@ } ], "dateCreated": "", - "dateModified": "2025-05-29T11:39:54Z", + "dateModified": "2025-08-04T22:46:41Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -173,10 +173,10 @@ }, "url": [ "https://github.com/nf-core/pairgenomealign", - "https://nf-co.re/pairgenomealign/2.2.0/" + "https://nf-co.re/pairgenomealign/2.2.1/" ], "version": [ - "2.2.0" + "2.2.1" ] }, { @@ -189,14 +189,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.10.1" + "version": "!>=24.10.5" }, { - "@id": "#320cb964-03ab-417e-a9e4-71e5359ea925", + "@id": "#f1f18087-a501-4361-b9bd-b1a99e1a9ef3", "@type": "TestSuite", "instance": [ { - "@id": "#0424929a-e1f9-4b4c-8cc0-613c9adda7a8" + "@id": "#c26aec1a-1706-4a26-b074-d9950de4f635" } ], "mainEntity": { @@ -205,10 +205,10 @@ "name": "Test suite for nf-core/pairgenomealign" }, { - "@id": "#0424929a-e1f9-4b4c-8cc0-613c9adda7a8", + "@id": "#c26aec1a-1706-4a26-b074-d9950de4f635", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/pairgenomealign", - "resource": "repos/nf-core/pairgenomealign/actions/workflows/ci.yml", + "resource": "repos/nf-core/pairgenomealign/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/fasta_bgzip_index_dict_samtools/main.nf b/subworkflows/local/fasta_bgzip_index_dict_samtools/main.nf index f23723a..7b9869c 100644 --- a/subworkflows/local/fasta_bgzip_index_dict_samtools/main.nf +++ b/subworkflows/local/fasta_bgzip_index_dict_samtools/main.nf @@ -19,7 +19,7 @@ workflow FASTA_BGZIP_INDEX_DICT_SAMTOOLS { ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) SAMTOOLS_DICT ( SAMTOOLS_BGZIP.out.fasta ) - ch_versions = ch_versions.mix(SAMTOOLS_DICT .out.versions) + ch_versions = ch_versions.mix(SAMTOOLS_DICT.out.versions) emit: fasta_gz = SAMTOOLS_BGZIP.out.fasta // channel: [ val(meta), fasta.gz ] @@ -29,4 +29,3 @@ workflow FASTA_BGZIP_INDEX_DICT_SAMTOOLS { versions = ch_versions // channel: [ versions.yml ] } - diff --git a/subworkflows/local/fasta_bgzip_index_dict_samtools/tests/main.nf.test.snap b/subworkflows/local/fasta_bgzip_index_dict_samtools/tests/main.nf.test.snap new file mode 100644 index 0000000..a4974b5 --- /dev/null +++ b/subworkflows/local/fasta_bgzip_index_dict_samtools/tests/main.nf.test.snap @@ -0,0 +1,95 @@ +{ + "sarscov2 - fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz:md5,6e9fe4042a72f2345f644f239272b7e6" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.dict:md5,f953d89119d6d0ae5ceab0c81aac83f6" + ] + ], + "4": [ + "versions.yml:md5,2eaf0c4b36636d3321599dcff1b2c0ea", + "versions.yml:md5,3a95ae193360da51d01e9cfccdbfc74a", + "versions.yml:md5,69ccb03f4e3fda6002d3faca55426d2a" + ], + "dict": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.dict:md5,f953d89119d6d0ae5ceab0c81aac83f6" + ] + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "fasta_gz": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz:md5,6e9fe4042a72f2345f644f239272b7e6" + ] + ], + "gzi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "versions": [ + "versions.yml:md5,2eaf0c4b36636d3321599dcff1b2c0ea", + "versions.yml:md5,3a95ae193360da51d01e9cfccdbfc74a", + "versions.yml:md5,69ccb03f4e3fda6002d3faca55426d2a" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-07-31T09:54:00.831095632" + } +} \ No newline at end of file diff --git a/subworkflows/local/pairalign_m2m/main.nf b/subworkflows/local/pairalign_m2m/main.nf index 1a6614e..bf5cf7d 100644 --- a/subworkflows/local/pairalign_m2m/main.nf +++ b/subworkflows/local/pairalign_m2m/main.nf @@ -143,7 +143,7 @@ workflow PAIRALIGN_M2M { ALIGNMENT_SPLIT_O2O ( ALIGNMENT_SPLIT_M2O.out.maf ) - ch_versions = ch_versions.mix(ALIGNMENT_SPLIT_O2O_FLT.out.versions) + ch_versions = ch_versions.mix(ALIGNMENT_SPLIT_O2O.out.versions) if (! (params.skip_dotplot_o2o) ) { ALIGNMENT_DOTPLOT_O2O ( ALIGNMENT_SPLIT_O2O.out.maf.join(ch_queries_bed), diff --git a/subworkflows/local/utils_nfcore_pairgenomealign_pipeline/main.nf b/subworkflows/local/utils_nfcore_pairgenomealign_pipeline/main.nf index 003f9fa..be8dea0 100644 --- a/subworkflows/local/utils_nfcore_pairgenomealign_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_pairgenomealign_pipeline/main.nf @@ -242,4 +242,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac5..09ef842 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 0000000..9e37f7a --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,12 @@ +.DS_Store +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +fastqc/*_fastqc.{html,zip} +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 0000000..c60f1d0 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_pairgenomealign_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 0000000..b99f4a1 --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,134 @@ +{ + "-profile test": { + "content": [ + 20, + { + "ALIGNMENT_DOTPLOT_M2O": { + "last": 1611 + }, + "ALIGNMENT_DOTPLOT_O2O": { + "last": 1611 + }, + "ALIGNMENT_LASTAL_M2O": { + "last": 1611 + }, + "ALIGNMENT_LASTDB": { + "last": 1611 + }, + "ALIGNMENT_SPLIT_O2O": { + "last": 1611 + }, + "ALIGNMENT_TRAIN": { + "last": 1611 + }, + "ASSEMBLYSCAN": { + "assemblyscan": "0.4.1" + }, + "CUTN_TARGET": { + "seqtk": "1.4-r122" + }, + "MULTIQC_ASSEMBLYSCAN_PLOT_DATA": { + "jq": "1.7.1" + }, + "Workflow": { + "nf-core/pairgenomealign": "v2.2.1" + } + }, + [ + "alignment", + "alignment/target___test1.m2o_plt.png", + "alignment/target___test1.o2o_aln.maf.gz", + "alignment/target___test1.o2o_aln.tsv", + "alignment/target___test1.o2o_plt.png", + "alignment/target___test1.sam.gz", + "alignment/target___test1.train", + "alignment/target___test1.train.tsv", + "alignment/target___test2.m2o_plt.png", + "alignment/target___test2.o2o_aln.maf.gz", + "alignment/target___test2.o2o_aln.tsv", + "alignment/target___test2.o2o_plt.png", + "alignment/target___test2.sam.gz", + "alignment/target___test2.train", + "alignment/target___test2.train.tsv", + "assemblyscan", + "assemblyscan/test1.json", + "assemblyscan/test2.json", + "cutn", + "cutn/targetGenome.bed", + "cutn/test1.bed", + "cutn/test2.bed", + "multiqc", + "multiqc/assemblyscan_plot_data", + "multiqc/assemblyscan_plot_data/contig_length_mqc.tsv", + "multiqc/assemblyscan_plot_data/gc_summary_mqc.tsv", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_base_content_summary_plot.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_contigs_length_statistics_plot.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_last_o2o.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_train.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/base_content_summary_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/base_content_summary_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/contigs_length_statistics_plot.pdf", + "multiqc/multiqc_plots/pdf/last_o2o.pdf", + "multiqc/multiqc_plots/pdf/train.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/base_content_summary_plot-cnt.png", + "multiqc/multiqc_plots/png/base_content_summary_plot-pct.png", + "multiqc/multiqc_plots/png/contigs_length_statistics_plot.png", + "multiqc/multiqc_plots/png/last_o2o.png", + "multiqc/multiqc_plots/png/train.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/base_content_summary_plot-cnt.svg", + "multiqc/multiqc_plots/svg/base_content_summary_plot-pct.svg", + "multiqc/multiqc_plots/svg/contigs_length_statistics_plot.svg", + "multiqc/multiqc_plots/svg/last_o2o.svg", + "multiqc/multiqc_plots/svg/train.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_pairgenomealign_software_mqc_versions.yml" + ], + [ + "target___test1.m2o_plt.png:md5,e724b83e019743759706e42d51ab987c", + "target___test1.o2o_aln.maf.gz:md5,a5bef93ad94cd32e62503bbb993e17cf", + "target___test1.o2o_aln.tsv:md5,19b18bcb79fbaff65967160566546216", + "target___test1.o2o_plt.png:md5,e724b83e019743759706e42d51ab987c", + "target___test1.sam.gz:md5,1e7ce899a96c522af7cd716dda2addff", + "target___test1.train:md5,0024bdd7f4129fcecebeddc9e844389c", + "target___test1.train.tsv:md5,d4ffa79ce19cc67164804b5dbc34b4c8", + "target___test2.m2o_plt.png:md5,9f969c075068688c8b0d8e45c902efef", + "target___test2.o2o_aln.maf.gz:md5,35f2b1fda59aec6a2e7b90bf93d9bd07", + "target___test2.o2o_aln.tsv:md5,bbdfc5bf501b41df1330b0e10e173529", + "target___test2.o2o_plt.png:md5,5692a7095b111d2470abe0951527f295", + "target___test2.sam.gz:md5,8dcdb07614097a2a55f7c3f717eda97e", + "target___test2.train:md5,276f08718454c0b7b016b96474055100", + "target___test2.train.tsv:md5,06491581f51dda4637ec441676841c48", + "test1.json:md5,9140e3d43f2d676f62e1325ace5dd8bd", + "test2.json:md5,32d34d97e75fd3444cf1f9588070b5df", + "targetGenome.bed:md5,d41d8cd98f00b204e9800998ecf8427e", + "test1.bed:md5,d41d8cd98f00b204e9800998ecf8427e", + "test2.bed:md5,d41d8cd98f00b204e9800998ecf8427e", + "contig_length_mqc.tsv:md5,851b7c50f78b040264f44762d0035110", + "gc_summary_mqc.tsv:md5,3d6f3875c87fb7c810bbeff004bea4ba", + "multiqc_base_content_summary_plot.txt:md5,34b6c2cfdbeea4d761b6b1361d95b1c8", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_contigs_length_statistics_plot.txt:md5,d5d8303533a3a3dc6f0bf268707864c7", + "multiqc_last_o2o.txt:md5,f101fe8063599dfa30ff286403209853", + "multiqc_train.txt:md5,29c3f1f223d94d90df2068199fe617ba" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-05T09:27:55.405056507" + } +} \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 0000000..285a372 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,12 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/pairgenomealign' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/workflows/pairgenomealign.nf b/workflows/pairgenomealign.nf index d20483b..46408c1 100644 --- a/workflows/pairgenomealign.nf +++ b/workflows/pairgenomealign.nf @@ -49,10 +49,13 @@ workflow PAIRGENOMEALIGN { if (! params.skip_assembly_qc ) { ASSEMBLYSCAN ( ch_samplesheet ) ch_versions = ch_versions.mix(ASSEMBLYSCAN.out.versions) - MULTIQC_ASSEMBLYSCAN_PLOT_DATA ( - ASSEMBLYSCAN.out.json.collect{it[1]} - ) + assemblyscan_sorted_json_files = ASSEMBLYSCAN.out.json + .toSortedList { a, b -> a[0].id <=> b[0].id } + .map { sorted_list -> sorted_list.collect { it[1] } } + // Sorted intput is needed for stable MD5 output + MULTIQC_ASSEMBLYSCAN_PLOT_DATA ( assemblyscan_sorted_json_files ) ch_multiqc_files = ch_multiqc_files.mix(MULTIQC_ASSEMBLYSCAN_PLOT_DATA.out.tsv) + ch_versions = ch_versions.mix(MULTIQC_ASSEMBLYSCAN_PLOT_DATA.out.versions) } // Prefix query ids with target genome name before producing alignment files