diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..1ab19682 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the IntGenomicsLab/lrsomatic devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- 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 720724b7..cefff7d3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,9 +1,9 @@ -# `IntGenomicsLab/lr_somatic`: Contributing Guidelines +# `IntGenomicsLab/lrsomatic`: Contributing Guidelines Hi there! -Many thanks for taking an interest in improving IntGenomicsLab/lr_somatic. +Many thanks for taking an interest in improving IntGenomicsLab/lrsomatic. -We try to manage the required tasks for IntGenomicsLab/lr_somatic using GitHub issues, you probably came to this page when creating one. +We try to manage the required tasks for IntGenomicsLab/lrsomatic using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! @@ -11,10 +11,10 @@ Contributions to the code are even more welcome ;) ## Contribution workflow -If you'd like to write some code for IntGenomicsLab/lr_somatic, the standard workflow is as follows: +If you'd like to write some code for IntGenomicsLab/lrsomatic, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lr_somatic issues](https://github.com/IntGenomicsLab/lr_somatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lr_somatic repository](https://github.com/IntGenomicsLab/lr_somatic) to your GitHub account +1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lrsomatic issues](https://github.com/IntGenomicsLab/lrsomatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lrsomatic repository](https://github.com/IntGenomicsLab/lrsomatic) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged @@ -58,7 +58,7 @@ These tests are run both with the latest available version of `Nextflow` and als ## Pipeline contribution conventions -To make the `IntGenomicsLab/lr_somatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. +To make the `IntGenomicsLab/lrsomatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. ### Adding a new step @@ -71,7 +71,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`. @@ -108,7 +108,7 @@ This repo includes a devcontainer configuration which will create a GitHub Codes To get started: -- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lr_somatic/codespaces) +- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lrsomatic/codespaces) - Tools installed - nf-core - Nextflow diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1cd94f85..458770e1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -39,4 +39,4 @@ body: * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - * Version of IntGenomicsLab/lr_somatic _(eg. 1.1, 1.5, 1.8.2)_ + * Version of IntGenomicsLab/lrsomatic _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 8a49b9b9..0e27f761 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Suggest an idea for the IntGenomicsLab/lr_somatic pipeline +description: Suggest an idea for the IntGenomicsLab/lrsomatic pipeline labels: enhancement body: - type: textarea diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d23d77b4..41961fd1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,21 +1,21 @@ ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lr_somatic/tree/main/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lrsomatic/tree/main/.github/CONTRIBUTING.md) - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /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 00000000..3b9724c7 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,111 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + with: + python-version: "3.14" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge + channel-priority: strict + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# πŸš€ nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| βœ… | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 6b774892..0e125373 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,9 +13,9 @@ jobs: steps: # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs - if: github.repository == 'IntGenomicsLab/lr_somatic' + if: github.repository == 'IntGenomicsLab/lrsomatic' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lr_somatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lrsomatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 1ad5fc3a..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,85 +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 == 'IntGenomicsLab/lr_somatic') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 13b51e2c..45884ff9 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 @@ -34,6 +26,17 @@ jobs: REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} + steps: + - name: Get the repository name and current branch + id: get_repo_properties + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + + download: + runs-on: ubuntu-latest + needs: configure steps: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -41,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@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -54,23 +57,12 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev - - - name: Get the repository name and current branch set as environment variable - id: get_repo_properties - run: | - echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" - echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" - echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | mkdir -p ./singularity_container_images - download: - runs-on: ubuntu-latest - needs: configure - steps: - name: Download the pipeline env: NXF_SINGULARITY_CACHEDIR: ./singularity_container_images @@ -87,6 +79,9 @@ jobs: - name: Inspect download run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} + - name: Inspect container images + run: tree ./singularity_container_images | tee ./container_initial + - name: Count the downloaded number of container images id: count_initial run: | @@ -117,14 +112,23 @@ 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 }} final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} difference=$((final_count - initial_count)) echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" - tree ./singularity_container_images + tree ./singularity_container_images > ./container_afterwards + diff ./container_initial ./container_afterwards exit 1 else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 75% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index 0075e577..b9b23241 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -9,17 +9,17 @@ jobs: if: > contains(github.event.comment.html_url, '/pull/') && contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'IntGenomicsLab/lr_somatic' + github.repository == 'IntGenomicsLab/lrsomatic' runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,23 +67,23 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. - See [CI log](https://github.com/IntGenomicsLab/lr_somatic/actions/runs/${{ github.run_id }}) for more details. + See [CI log](https://github.com/IntGenomicsLab/lrsomatic/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..7a527a34 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] @@ -14,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -31,18 +28,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" 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@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bed96d3..e6e9bc26 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@80620a5d27ce0ae443b965134db88467fc607b43 # v7 + 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@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..a22a97fc --- /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.3" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use GitHub runners + - "ubuntu-latest" + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use GitHub runners + - "ubuntu-latest" + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "25.04.0" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use GitHub runners + - "ubuntu-latest" + 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/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 91% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..e8560fc7 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,12 +9,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: 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/.gitignore b/.gitignore index a42ce016..9e307203 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ testing/ testing* *.pyc null/ +.nf-test +.nf-test.log diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index 80948bbf..662ad88c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,18 +1,24 @@ -repository_type: pipeline - -nf_core_version: 3.1.1 - lint: + files_exist: + - CODE_OF_CONDUCT.md + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png + - .github/ISSUE_TEMPLATE/config.yml + - .github/workflows/awstest.yml + - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md - assets/email_template.txt - docs/README.md + multiqc_config: + - report_comment nextflow_config: - manifest.name - manifest.homePage @@ -20,25 +26,17 @@ lint: - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText - multiqc_config: - - report_comment - files_exist: - - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png - - .github/ISSUE_TEMPLATE/config.yml - - .github/workflows/awstest.yml - - .github/workflows/awsfulltest.yml - + schema_params: false +nf_core_version: 3.5.1 +repository_type: pipeline template: - org: IntGenomicsLab - name: lr_somatic - description: Workflow for somatic variant calling of long read data author: Jonas Demeulemeester - version: 1.0.0dev - force: true + description: Workflow for somatic variant calling of long read data + force: false + is_nfcore: false + name: lrsomatic + org: IntGenomicsLab outdir: . skip_features: - fastqc - is_nfcore: false + version: 1.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e9f0e1c..d06777a8 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.0.3" + - prettier@3.6.2 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.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/.prettierignore b/.prettierignore index edd29f01..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,7 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 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 ee035dca..0f89d7ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,33 @@ -# IntGenomicsLab/lr_somatic: Changelog +# IntGenomicsLab/lrsomatic: Changelog The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## v1.0.0dev - [date] -Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. +Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` +- ClairS-TO Module +- cramino module +- modkit pileup module +- mosdepth module +- minimap2/index module +- minimap2/align module +- pigz module +- samtools/cat module +- samtools faidx module +- bam_stats_samtools subworkflow +- mosdepth added to workflow +- add longphase/tag and longphase/phase modules + ### `Fixed` +- New channel structure +- No longer possible to have duplicated naming after samtools cat +- restructured minimap2 + ### `Dependencies` ### `Deprecated` diff --git a/CITATIONS.md b/CITATIONS.md index 08105ad6..19daeb37 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Citations +# IntGenomicsLab/lrsomatic: Citations ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) @@ -10,9 +10,69 @@ ## Pipeline tools +- [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) + + > Van Loo P, Nordgard SH, LingjΓ¦rde OC, Russnes HG, Rye IH, Sun W, Weigman VJ, Marynen P, Zetterberg A, Naume B, Perou CM, BΓΈrresen-Dale AL, Kristensen VN. Allele-specific copy number analysis of tumors. Proc Natl Acad Sci U S A. 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. + +- [bcftools](https://pubmed.ncbi.nlm.nih.gov/33590861/) + + > Danecek P, Bonfield JK, Liddle J, Marshall J, Ohan V, Pollard MO, Whitwham A, Keane T, McCarthy SA, Davies RM, Li H. Twelve years of SAMtools and BCFtools. Gigascience. 2021 Feb 16;10(2):giab008. doi: 10.1093/gigascience/giab008. PMID: 33590861; PMCID: PMC7931819. + +- [Clair3](https://www.nature.com/articles/s43588-022-00387-x) + + > Zheng, Z., Li, S., Su, J. et al. Symphonizing pileup and full-alignment for deep learning-based long-read variant calling. Nat Comput Sci 2, 797–803 (2022). https://doi.org/10.1038/s43588-022-00387-x + +- [ClairS](https://www.biorxiv.org/content/10.1101/2023.08.17.553778v1) + + > Zhenxian Zheng, Junhao Su, Lei Chen, Yan-Lam Lee, Tak-Wah Lam, Ruibang Luo. ClairS: a deep-learning method for long-read somatic small variant calling. bioRxiv 2023.08.17.553778; doi: https://doi.org/10.1101/2023.08.17.553778 + +- [ClairS-TO](https://pubmed.ncbi.nlm.nih.gov/41173866/) + + > Chen L, Zheng Z, Su J, Yu X, Wong AOK, Zhang J, Lee YL, Luo R. ClairS-TO: a deep-learning method for long-read tumor-only somatic small variant calling. Nat Commun. 2025 Oct 31;16(1):9630. doi: 10.1038/s41467-025-64547-z. PMID: 41173866; PMCID: PMC12579226. + +- [cramino](https://github.com/wdecoster/cramino) + + > De Coster W. cramino: A fast and simple tool for quality control of long read sequencing data [Software]. GitHub. https://github.com/wdecoster/cramino + +- [Ensembl VEP](https://pubmed.ncbi.nlm.nih.gov/27268795/) + + > McLaren W, Gil L, Hunt SE, Riat HS, Ritchie GR, Thormann A, Flicek P, Cunningham F. The Ensembl Variant Effect Predictor. Genome Biol. 2016 Jun 6;17(1):122. doi: 10.1186/s13059-016-0974-4. PubMed PMID: 27268795; PubMed Central PMCID: PMC4893825. + +- [fibertools-rs](https://doi.org/10.1101/gr.279095.124) + + > Jha, A., Bohaczuk, S. C., Mao, Y., Ranchalis, J., Mallory, B. J., Min, A. T., Hamm, M. O., Swanson, E., Dubocanin, D., Finkbeiner, C., Li, T., Whittington, D., Noble, W. S., Stergachis, A. B., & Vollger, M. R. (2024). DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools. Genome Research. + +- [LongPhase](https://pubmed.ncbi.nlm.nih.gov/35104333/) + + > Lin JH, Chen LC, Yu SC, Huang YT. LongPhase: an ultra-fast chromosome-scale phasing algorithm for small and large variants. Bioinformatics. 2022 Apr 28;38(9):2452-2455. doi: 10.1093/bioinformatics/btac126. PubMed PMID: 35253834; PubMed Central PMCID: PMC9048675. + +- [minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) + + > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PubMed PMID: 29750242; PubMed Central PMCID: PMC6137996. + +- [modkit](https://github.com/nanoporetech/modkit) + + > Oxford Nanopore Technologies. modkit: A tool for analyzing and manipulating modified base calls [Software]. GitHub. https://github.com/nanoporetech/modkit + +- [mosdepth](https://pubmed.ncbi.nlm.nih.gov/29096012/) + + > Pedersen BS, Quinlan AR. mosdepth: quick coverage calculation for genomes and exomes. Bioinformatics. 2018 Mar 1;34(5):867-868. doi: 10.1093/bioinformatics/btx699. PubMed PMID: 29096012; PubMed Central PMCID: PMC6030888. + - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) -> Ewels P, Magnusson M, Lundin S, KΓ€ller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + > Ewels P, Magnusson M, Lundin S, KΓ€ller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +- [SAMtools](https://pubmed.ncbi.nlm.nih.gov/19505943/) + + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +- [Severus](https://www.nature.com/articles/s41587-025-02618-8) + + > Keskus, A.G., Bryant, A., Ahmad, T. et al. Severus detects somatic structural variation and complex rearrangements in cancer genomes using long-read sequencing. Nat Biotechnol (2025). https://doi.org/10.1038/s41587-025-02618-8 + +- [Wakhan](https://github.com/KolmogorovLab/Wakhan) + + > A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads (Oxford Nanopore, PacBio). https://github.com/KolmogorovLab/Wakhan ## Software packaging/containerisation tools diff --git a/LICENSE b/LICENSE index 21de0ec6..27d3cdc5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) The IntGenomicsLab/lr_somatic team +Copyright (c) The IntGenomicsLab/lrsomatic team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 3b4672ea..cc18d01b 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,157 @@ -# IntGenomicsLab/lr_somatic +# IntGenomicsLab/lrsomatic -[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml) -[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) +[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.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/IntGenomicsLab/lr_somatic) +[![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/IntGenomicsLab/lrsomatic) ## Introduction -**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. - +This **end-to-end pipeline** handles the entire workflow β€” **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. + +It can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design. + +Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. + +## Pipeline summary + +**1) Pre-processing:** + +a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) + +b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) + +c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) + +d. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs)) + +**2i) Matched mode: small variant calling:** + +a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) + +b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) + +**2ii) Tumour only mode: small variant calling:** + +a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) + +b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +**3) Large variant calling:** + +a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) + +b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) + +**4) Annotation:** + +a. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep)) + +b. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> ## Usage > [!NOTE] -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. - - +Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: - - ```bash -nextflow run IntGenomicsLab/lr_somatic \ +nextflow run IntGenomicsLab/lrsomatic \ -profile \ --input samplesheet.csv \ --outdir ``` +More detail is given in our [usage documentation](/docs/usage.md) + > [!WARNING] > Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files). ## Credits -IntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra PančíkovΓ‘, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester. + +## Pipeline output + +This pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report. -We thank the following people for their extensive assistance in the development of this pipeline: +Besides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles. + +Example output directory structure: + +``` +β”œβ”€β”€ Sample 1 +β”‚ β”œβ”€β”€ ascat +β”‚ β”œβ”€β”€ bamfiles +β”‚ β”œβ”€β”€ qc +β”‚ β”‚ β”œβ”€β”€ tumor +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”œβ”€β”€ variants +β”‚ β”‚ β”œβ”€β”€clairS-TO +β”‚ β”‚ β”œβ”€β”€severus +β”‚ β”œβ”€β”€ vep +β”‚ β”‚ β”œβ”€β”€ germline +β”‚ β”‚ β”œβ”€β”€ somatic +β”‚ β”‚ β”œβ”€β”€ SVs +β”‚ +β”œβ”€β”€ Sample 2 +β”‚ β”œβ”€β”€ ascat +β”‚ β”œβ”€β”€ bamfiles +β”‚ β”œβ”€β”€ qc +β”‚ β”‚ β”œβ”€β”€ tumor +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”‚ β”œβ”€β”€ normal +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”œβ”€β”€ variants +β”‚ β”‚ β”œβ”€β”€ clair3 +β”‚ β”‚ β”œβ”€β”€ clairS +β”‚ β”‚ β”œβ”€β”€ severus +β”‚ β”œβ”€β”€ vep +β”‚ β”‚ β”œβ”€β”€ germline +β”‚ β”‚ β”œβ”€β”€ somatic +β”‚ β”‚ β”œβ”€β”€ SVs +β”œβ”€β”€ pipeline_info +``` - +more detail is given in our [output documentation](/docs/output.md) ## Contributions and Support @@ -74,7 +160,7 @@ If you would like to contribute to this pipeline, please see the [contributing g ## Citations - + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json index 12604f03..a7f7c25d 100644 --- a/assets/adaptivecard.json +++ b/assets/adaptivecard.json @@ -17,7 +17,7 @@ "size": "Large", "weight": "Bolder", "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", - "text": "IntGenomicsLab/lr_somatic v${version} - ${runName}", + "text": "IntGenomicsLab/lrsomatic v${version} - ${runName}", "wrap": true }, { diff --git a/assets/email_template.html b/assets/email_template.html index 43e12a3f..f1b77923 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -4,21 +4,21 @@ - - IntGenomicsLab/lr_somatic Pipeline Report + + IntGenomicsLab/lrsomatic Pipeline Report
-

IntGenomicsLab/lr_somatic ${version}

+

IntGenomicsLab/lrsomatic ${version}

Run Name: $runName

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

IntGenomicsLab/lr_somatic execution completed unsuccessfully!

+

IntGenomicsLab/lrsomatic execution completed unsuccessfully!

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

The full error message was:

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

IntGenomicsLab/lr_somatic execution co } else { out << """
- IntGenomicsLab/lr_somatic execution completed successfully! + IntGenomicsLab/lrsomatic execution completed successfully!
""" } @@ -44,8 +44,8 @@

Pipeline Configuration:

-

IntGenomicsLab/lr_somatic

-

https://github.com/IntGenomicsLab/lr_somatic

+

IntGenomicsLab/lrsomatic

+

https://github.com/IntGenomicsLab/lrsomatic

diff --git a/assets/email_template.txt b/assets/email_template.txt index 95bc07e2..ceaf72dd 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,10 +1,10 @@ Run Name: $runName <% if (success){ - out << "## IntGenomicsLab/lr_somatic execution completed successfully! ##" + out << "## IntGenomicsLab/lrsomatic execution completed successfully! ##" } else { out << """#################################################### -## IntGenomicsLab/lr_somatic execution completed unsuccessfully! ## +## IntGenomicsLab/lrsomatic execution completed unsuccessfully! ## #################################################### The exit status of the task that caused the workflow execution to fail was: $exitStatus. The full error message was: @@ -27,5 +27,5 @@ Pipeline Configuration: <% out << summary.collect{ k,v -> " - $k: $v" }.join("\n") %> -- -IntGenomicsLab/lr_somatic -https://github.com/IntGenomicsLab/lr_somatic +IntGenomicsLab/lrsomatic +https://github.com/IntGenomicsLab/lrsomatic diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index 2ec82a50..fca23d8a 100644 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -1,13 +1,13 @@ -id: "IntGenomicsLab-lr_somatic-methods-description" +id: "IntGenomicsLab-lrsomatic-methods-description" description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." -section_name: "IntGenomicsLab/lr_somatic Methods Description" -section_href: "https://github.com/IntGenomicsLab/lr_somatic" +section_name: "IntGenomicsLab/lrsomatic Methods Description" +section_href: "https://github.com/IntGenomicsLab/lrsomatic" plot_type: "html" ## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline ## You inject any metadata in the Nextflow '${workflow}' object data: |

Methods

-

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

+

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

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

${workflow.commandLine}

${tool_citations}

diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index d1ad8766..4705d98d 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,12 +1,11 @@ report_comment: > - This report has been generated by the IntGenomicsLab/lr_somatic - analysis pipeline. + This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. report_section_order: - "IntGenomicsLab-lr_somatic-methods-description": + "IntGenomicsLab-lrsomatic-methods-description": order: -1000 software_versions: order: -1001 - "IntGenomicsLab-lr_somatic-summary": + "IntGenomicsLab-lrsomatic-summary": order: -1002 export_plots: true diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 5f653ab7..69db65ba 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,3 +1,5 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,tumour1.bam,normal1.bam,ont,female,n +sample2,tumour2.bam,,ont,female,y +sample3,tumour3.bam,,pb,male,n +sample4,tumour4.bam,normal4.bam,pb,male,y diff --git a/assets/schema_input.json b/assets/schema_input.json index fda49a3f..89ccc0bb 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/assets/schema_input.json", - "title": "IntGenomicsLab/lr_somatic pipeline - params.input schema", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/assets/schema_input.json", + "title": "IntGenomicsLab/lrsomatic pipeline - params.input schema", "description": "Schema for the file provided with params.input", "type": "array", "items": { @@ -13,21 +13,45 @@ "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["id"] }, - "fastq_1": { + "bam_tumor": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of tumor sample must be provided, cannot contain spaces and must have extension '.bam'" }, - "fastq_2": { + "bam_normal": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of normal sample must be provided, cannot contain spaces and must have extension '.bam'" + }, + "platform": { + "type": "string", + "enum": ["pb", "ont"], + "errorMessage": "Method must be one of the following: 'pb' or 'ont'" + }, + "sex": { + "type": "string", + "enum": ["male", "female"], + "errorMessage": "Biological sex must be either 'male' or 'female'" + }, + "fiber": { + "type": "string", + "enum": ["y", "n"], + "errorMessage": "Specifiy (y/n) if sample has had fiberseq performed" + }, + "clair3_model": { + "type": "string" + }, + "clairSTO_model": { + "type": "string" + }, + "clairS_model": { + "type": "string" } }, - "required": ["sample", "fastq_1"] + "required": ["sample", "bam_tumor", "platform", "sex", "fiber"] } } diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 831121de..2e397d1b 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -9,12 +9,12 @@ Content-Type: text/html; charset=utf-8 $email_html --nfcoremimeboundary -Content-Type: image/png;name="IntGenomicsLab-lr_somatic_logo.png" +Content-Type: image/png;name="IntGenomicsLab-lrsomatic_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="IntGenomicsLab-lr_somatic_logo_light.png" +Content-Disposition: inline; filename="IntGenomicsLab-lrsomatic_logo_light.png" -<% out << new File("$projectDir/assets/IntGenomicsLab-lr_somatic_logo_light.png"). +<% out << new File("$projectDir/assets/IntGenomicsLab-lrsomatic_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/assets/slackreport.json b/assets/slackreport.json index c7f8d912..e8425ad8 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "IntGenomicsLab/lr_somatic ${version} - ${runName}", + "author_name": "IntGenomicsLab/lrsomatic ${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/base.config b/conf/base.config index 8bc8e250..84625158 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow base config file + IntGenomicsLab/lrsomatic Nextflow base config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on @@ -15,7 +15,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' @@ -28,26 +28,31 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { cpus = { 1 } - memory = { 6.GB * task.attempt } - time = { 4.h * task.attempt } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_low { - cpus = { 2 * task.attempt } - memory = { 12.GB * task.attempt } - time = { 4.h * task.attempt } + cpus = { 2 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_medium { - cpus = { 6 * task.attempt } - memory = { 36.GB * task.attempt } - time = { 8.h * task.attempt } + cpus = { 6 * task.attempt } + memory = { 36.GB * task.attempt } + time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { 12 * task.attempt } - memory = { 72.GB * task.attempt } - time = { 16.h * task.attempt } + cpus = { 12 * task.attempt } + memory = { 72.GB * task.attempt } + time = { 16.h * task.attempt } + } + withLabel:process_very_high { + cpus = { 24 * task.attempt } + memory = { 144.GB * task.attempt } + time = { 16.h * task.attempt } } withLabel:process_long { - time = { 20.h * task.attempt } + time = { 20.h * task.attempt } } withLabel:process_high_memory { memory = { 200.GB * task.attempt } @@ -59,4 +64,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/conf/igenomes.config b/conf/igenomes.config index 3f114377..6e0a9349 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -11,38 +11,35 @@ params { // illumina iGenomes reference file paths genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + fasta = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Sequence/WholeGenomeFasta/Homo_sapiens_assembly38.fasta" + genome_name = "hg38" + ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_hg38.zip" + ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_hg38.zip" + centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" + pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" + bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" + vep_genome = "GRCh38" + vep_species = "homo_sapiens" + gnomad = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/gnomad.r2.1.af-ge-0.001.sites.vcf.gz" + dbsnp = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/dbsnp.b138.non-somatic.sites.vcf.gz" + onekgenomes = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/1000g-pon.sites.vcf.gz" + colors = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/CoLoRSdb.GRCh38.v1.1.0.deepvariant.glnexus.af-ge-0.001.vcf.gz" } 'CHM13' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" - bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" - gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" - mito_name = "chrM" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" + genome_name = "CHM13" + ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" + ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" + pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" + bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" + vep_genome = "T2T-CHM13v2.0" + vep_species = "homo_sapiens_gca009914755v4" + gnomad = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_gnomad.vcf.gz" + dbsnp = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_dbsnp.vcf.gz" + onekgenomes = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_1kgenomes.vcf.gz" + colors = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_colors.vcf.gz" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/modules.config b/conf/modules.config index f0b0d55a..d82196bb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -13,12 +13,17 @@ process { publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, // Added closing brace here mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: 'MULTIQC' { + + // + // QC Processes + // + + withName: '.*:MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, @@ -27,4 +32,326 @@ process { ] } + withName: '.*:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/samtools/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + + withName: '.*:CRAMINO_PRE' { + ext.args = '--ubam' + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_ubam" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:CRAMINO_POST' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_aln" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:FIBERTOOLSRS_QC' { + ext.args = { params.autocorrelation ? "--acf" : '' } + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/fibertoolsrs" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:MOSDEPTH' { + ext.args = { '-n -x' } + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/mosdepth" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // Preprocessing and other processes + // + + withName: '.*:PREPARE_REFERENCE_FILES' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:UNZIP_.*' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:METAEXTRACT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:SAMTOOLS_FAIDX' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:SAMTOOLS_CAT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:SAMTOOLS_INDEX' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/bamfiles" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:VCFSPLIT' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // MINIMAP2 + // + + withName: '.*:MINIMAP2_ALIGN' { + ext.prefix = { "${meta.id}_mapped" } + ext.args = { + [ + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), + params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no ", + "-y", + "-Y" + ].join(' ').trim() + } + ext.args4 = "-T '*'" + publishDir = [ + enabled: false + ] + } + + // + // Methylation related processes + // + + withName: '.*:MODKIT_PILEUP' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/modkit_pileup" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:FIBERTOOLSRS_PREDICTM6A' { + ext.args = { + [ + params.keep_kinetic_data ? "--keep" : '', + params.keep_all_calls ? "--all-calls" : '' + ].join(' ').trim() + } + publishDir = [ + enabled: false + ] + } + + withName: '.*:FIBERTOOLSRS_FIRE' { + ext.args = { (meta.platform == "ont") ? "--ont" : "" } + publishDir = [ + enabled: false + ] + } + + withName: '.*:FIBERTOOLSRS_NUCLEOSOMES' { + publishDir = [ + enabled: false + ] + } + + // + // Phasing processes + // + + withName: '.*:LONGPHASE_PHASE' { + ext.args = { + [ + meta.platform == 'pb' ? '--pb' : '--ont', + "--indels", + ].join(' ').trim() + } + publishDir = [ + enabled: false + ] + } + + withName: '.*:LONGPHASE_HAPLOTAG' { + ext.prefix = { "${meta.id}_${meta.type}" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/bamfiles" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // Structural variant calling processes + // + + withName: '.*:SEVERUS' { + ext.args = '--min-support 3 --output-read-ids ' + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/severus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // Small variant calling processes + // + withName: '.*:BCFTOOLS_CONCAT' { + ext.args = '--output-type z -a' + publishDir = [ + enabled: false + ] + } + withName: '.*:BCFTOOLS_SORT' { + ext.arge = '--output-type z' + publishDir = [ + enabled: false + ] + } + withName: '.*:CLAIRSTO' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:CLAIRS' { + ext.args = '--enable_indel_calling --haplotagged_tumor_bam_provided_so_skip_intermediate_phasing_and_haplotagging' + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairs" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:CLAIR3' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clair3" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // Copy number calling processes + // + + withName : '.*:ASCAT' { + ext.args = { [ + "gender": meta.sex == 'female' ? 'XX' : 'XY', + "purity": params.ascat_purity, + "ploidy": params.ascat_ploidy, + "minCounts": params.ascat_min_counts, + "chrom_names": params.ascat_chroms ?: meta.sex == 'female' ? "c(1:22, 'X')" : "c(1:22, 'X', 'Y')", + "min_base_qual": params.ascat_min_base_qual, + "min_map_qual": params.ascat_min_map_qual, + "longread_bins": params.ascat_longread_bins, + "allele_counter_flags": params.ascat_allelecounter_flags, + "penalty": params.ascat_penalty + ] } + publishDir = [ + path: { "${params.outdir}/${meta.id}/ascat" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName : '.*:WAKHAN' { + ext.args = { + [ + params.wakhan_chroms ? "--contigs ${params.wakhan_chroms}" : + (meta.sex == "female" ? "--contigs chr1-22,chrX" : "--contigs chr1-22,chrX,chrY"), + "--pdf-enable", + "--centromere ${params.centromere_bed}" + ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/${meta.id}/wakhan" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName : '.*:WGET' { + ext.suffix = { "tar.gz" } + publishDir = [ + enabled: false + ] + } + + withName : '.*:UNTAR' { + publishDir = [ + enabled: false + ] + } + + ///////// + // VEP // + ///////// + withName: 'ENSEMBLVEP_DOWNLOAD' { + //ext.args = { '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' } + publishDir = [ + mode: params.publish_dir_mode, + path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } + ] + } + + withName : '.*:SOMATIC_VEP' { + ext.args = { "$params.vep_args" } + ext.prefix = { "${meta.id}_SOMATIC_VEP" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/vep/somatic/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName : '.*:GERMLINE_VEP' { + ext.args = { "$params.vep_args" } + ext.prefix = { "${meta.id}_GERMLINE_VEP" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/vep/germline/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName : '.*:SV_VEP' { + ext.args = { "$params.vep_args" } + ext.prefix = { "${meta.id}_SV_VEP" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/vep/SVs/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } diff --git a/conf/test.config b/conf/test.config index ec9b4d95..416ed610 100644 --- a/conf/test.config +++ b/conf/test.config @@ -5,17 +5,19 @@ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test, --outdir ---------------------------------------------------------------------------------------- */ process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h' - ] + withName: '.*' { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] + } } params { @@ -23,10 +25,13 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" - // Genome references - genome = 'R64-1-1' + // Additional params + genome = "GRCh38" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + skip_wakhan = true + skip_ascat = true } diff --git a/conf/test_full.config b/conf/test_full.config index 67045bb5..416ed610 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,24 +1,37 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running full-size tests + Nextflow config file for running minimal tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a full size pipeline test. + Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test_full, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test, --outdir ---------------------------------------------------------------------------------------- */ +process { + withName: '.*' { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] + } +} + params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + // Input data + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" - // Genome references - genome = 'R64-1-1' + // Additional params + genome = "GRCh38" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + skip_wakhan = true + skip_ascat = true } diff --git a/docs/README.md b/docs/README.md index 4d1ead62..14889bd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# IntGenomicsLab/lr_somatic: Documentation +# IntGenomicsLab/lrsomatic: Documentation -The IntGenomicsLab/lr_somatic documentation is split into the following pages: +The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. diff --git a/docs/output.md b/docs/output.md index fc35fed4..29d1c7a3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,45 +1,484 @@ -# IntGenomicsLab/lr_somatic: Output +# IntGenomicsLab/lrsomatic: Output ## Introduction -This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. - +### Output Example -## Pipeline overview +``` +β”œβ”€β”€ Sample 1 +β”‚ β”œβ”€β”€ ascat +β”‚ β”œβ”€β”€ bamfiles +β”‚ β”œβ”€β”€ qc +β”‚ β”‚ β”œβ”€β”€ tumor +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”œβ”€β”€ variants +β”‚ β”‚ β”œβ”€β”€clairS-TO +β”‚ β”‚ β”œβ”€β”€severus +β”‚ β”œβ”€β”€ vep +β”‚ β”‚ β”œβ”€β”€ germline +β”‚ β”‚ β”œβ”€β”€ somatic +β”‚ β”‚ β”œβ”€β”€ SVs +β”‚ +β”œβ”€β”€ Sample 2 +β”‚ β”œβ”€β”€ ascat +β”‚ β”œβ”€β”€ bamfiles +β”‚ β”œβ”€β”€ qc +β”‚ β”‚ β”œβ”€β”€ tumor +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”‚ β”œβ”€β”€ normal +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”œβ”€β”€ variants +β”‚ β”‚ β”œβ”€β”€ clair3 +β”‚ β”‚ β”œβ”€β”€ clairS +β”‚ β”‚ β”œβ”€β”€ severus +β”‚ β”œβ”€β”€ vep +β”‚ β”‚ β”œβ”€β”€ germline +β”‚ β”‚ β”œβ”€β”€ somatic +β”‚ β”‚ β”œβ”€β”€ SVs +β”‚ β”œβ”€β”€ wakhan +β”œβ”€β”€ pipeline_info +β”œβ”€β”€ multiqc -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +``` -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +### `ascat` -### MultiQC +
+Output files + +``` +β”œβ”€β”€ ascat +β”‚ β”œβ”€β”€ sample.before_correction.sample.tumour.germline.png +β”‚ β”œβ”€β”€ sample.before_correction.sample.tumour.tumour.png +β”‚ β”œβ”€β”€ sample.cnvs.txt +β”‚ β”œβ”€β”€ sample.metrics.txt +β”‚ β”œβ”€β”€ sample.normal_alleleFrequencies_chr(1-22,X).txt +β”‚ β”œβ”€β”€ sample.purityploidy.txt +β”‚ β”œβ”€β”€ sample.segments.txt +β”‚ β”œβ”€β”€ sample.tumour_alleleFrequencies_chr(1-22,X).txt +β”‚ β”œβ”€β”€ sample.tumour_normalBAF_rawBAF.txt +β”‚ β”œβ”€β”€ sample.tumour_normalBAF.txt +β”‚ β”œβ”€β”€ sample.tumor_tumourLogR.txt +β”‚ β”œβ”€β”€ sample.tumour.ASCATprofile.png +β”‚ β”œβ”€β”€ sample.tumour.ASPCF.png +β”‚ β”œβ”€β”€ sample.tumour.rawprofile.png +β”‚ β”œβ”€β”€ sample.tumour.sunrise.png +``` + +| File | Description | +| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample before correction | +| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample before correction | +| `sample.cnvs.txt` | a tsv file describing each chromosome segment with a copy number alteration and it's major and minor copy number | +| `sample.metrics.txt` | a tsv file describing summary statistics for the sample | +| `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths | +| `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample | +| `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number | +| `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths | +| `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample | +| `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample | +| `sample.tumour_normalLogR.txt` | a tsv file with the LogR values in the normal sample | +| `sample.tumour_tumourBAF_rawBAF.txt` | a tsv file with the raw BAF values in the tumor sample | +| `sample.tumour_tumourBAF.txt` | a tsv file with the corrected BAF values in the tumor sample | +| `sample.tumour_tumourLogR.txt` | a tsv file with the corrected LogR values in the tumor sample | +| `sample.tumour.ASCATprofile.png` | a png file with the corrected overall copy number profile with ploidy, purity, and goodness of fit metrics | +| `sample.tumour.ASPCF.png` | a png file with the corrected LogR and BAF plots of the tumor sample | +| `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics | +| `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit | + +
+ +### `bamfiles`
Output files -- `multiqc/` - - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. +``` +β”œβ”€β”€ bamfiles +β”‚ β”œβ”€β”€ sample_normal.bam +β”‚ β”œβ”€β”€ sample_normal.bam.bai +β”‚ β”œβ”€β”€ sample_tumor.bam +β”‚ β”œβ”€β”€ sample_tumor.bam.bai +``` + +| File | Description | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | +| `sample_normal.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the normal sample | +| `sample_normal.bam.bai` | index file for the normal bam file | +| ` sample_tumor.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the tumor sample | +| `sample_tumor.bam.bai` | index file for the tumor bam file |
-[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. +### `qc` + +
+Output files + +``` +β”œβ”€β”€ qc +β”‚ β”œβ”€β”€ tumor +β”‚ β”‚ β”œβ”€β”€ cramino_aln +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.cramino.txt +β”‚ β”‚ β”œβ”€β”€ cramino_ubam +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.cramino.txt +β”‚ β”‚ β”œβ”€β”€ fibertoolsrs +β”‚ β”‚ β”‚ β”œβ”€β”€ sample_qc.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.mosdepth.global.dist.txt +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.mosdepth.summary.txt +β”‚ β”‚ β”œβ”€β”€ samtools +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.flagstat +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.idxstats +β”‚ β”‚ β”‚ β”œβ”€β”€ sample.stats +``` + +| File | Description | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| `cramino_aln/sample.cramino.txt` | cramino QC summary statistics for the aligned bam file | +| `cramino_ubam/sample.cramino.txt` | cramino QC summary statistics for the unaligned bam files | +| `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file | +| `mosdepth/sample.mosdepth.global.dist.txt` | a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value | +| `mosdepth/sample.mosdepth.summary.txt` | overall summary file from mosdepth tool | +| `samtools/sample.flagstat` | a summary of the counts of different samtools flags | +| `samtools/sample.idxstats` | a summary of the number of mapped and unmapped reads | +| `samtools/sample.stats` | summary statistics from the bamfile | + +
-Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information +### `variants`
Output files -- `pipeline_info/` - - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. - - Parameters used by the pipeline run: `params.json`. +#### `clair3` + +``` +β”œβ”€β”€ clair3 +β”‚ β”œβ”€β”€ merge_output.vcf.gz +β”‚ β”œβ”€β”€ merge_output.vcf.gz.tbi +``` + +| File | Description | +| --------------------- | ------------------------------------------------- | +| `merge_output.vcf.gz` | Merged germline indel and snv calls in vcf format | +| `merge_output.vcf.gz` | index for germline small variant calls | + +#### `clairS` + +``` +β”œβ”€β”€ clairS +β”‚ β”œβ”€β”€ indel.vcf.gz +β”‚ β”œβ”€β”€ indel.vcf.gz.tbi +β”‚ β”œβ”€β”€ snv.vcf.gz +β”‚ β”œβ”€β”€ snv.vcf.gz.tbi +``` + +| File | Description | +| ------------------ | --------------------------------- | +| `indel.vcf.gz` | Somatic indel calls in vcf format | +| `indel.vcf.gz.tbi` | Index for somatic indel calls | +| `snv.vcf.gz` | Somatic SNV calls in vcf format | +| `snv.vcf.gz.tbi` | Index for somatic SNV calls | + +#### `clairS-TO` + +``` +β”œβ”€β”€ clairS +β”‚ β”œβ”€β”€ germline.vcf.gz +β”‚ β”œβ”€β”€ germline.vcf.gz.tbi +β”‚ β”œβ”€β”€ indel.vcf.gz +β”‚ β”œβ”€β”€ indel.vcf.gz.tbi +β”‚ β”œβ”€β”€ snv.vcf.gz +β”‚ β”œβ”€β”€ snv.vcf.gz.tbi +β”‚ β”œβ”€β”€ somatic.vcf.gz +β”‚ β”œβ”€β”€ somatic.vcf.gz.tbi +``` + +| File | Description | +| --------------------- | --------------------------------------------------------------------- | +| `germline.vcf.gz` | SNV and indel calls marked as germline (will not include variants QC) | +| `germline.vcf.gz.tbi` | Index file for germline small variant calls | +| `indel.vcf.gz` | Raw indel calls in vcf format | +| `indel.vcf.gz.tbi` | Index for somatic indel calls | +| `snv.vcf.gz` | Raw SNV calls in vcf format | +| `snv.vcf.gz.tbi` | Index for SNV calls | +| `somatic.vcf.gz` | SNV and indel calls marked as PASS and without a germline tag | +| `somatic.vcf.gz` | Index for osmatic small variatn calls | + +#### `severus` + +``` +β”œβ”€β”€ severus +β”‚ β”œβ”€β”€ all_SVs +β”‚ β”‚ β”œβ”€β”€ plots +β”‚ β”‚ β”‚ β”œβ”€β”€ severus_{*}.html +β”‚ β”‚ β”œβ”€β”€ breakpoint_cluster_list.tsv +β”‚ β”‚ β”œβ”€β”€ breakpoint_clusters.tsv +β”‚ β”‚ β”œβ”€β”€ severus_all.vcf.gz +β”‚ β”‚ β”œβ”€β”€ severus_all.vcf.gz.tbi +β”‚ β”œβ”€β”€ somatic_SVs +β”‚ β”‚ β”œβ”€β”€ plots +β”‚ β”‚ β”‚ β”œβ”€β”€ severus_{*}.html +β”‚ β”‚ β”œβ”€β”€ breakpoint_cluster_list.tsv +β”‚ β”‚ β”œβ”€β”€ breakpoint_clusters.tsv +β”‚ β”‚ β”œβ”€β”€ severus_somatic.vcf.gz +β”‚ β”‚ β”œβ”€β”€ severus_somatic.vcf.gz.tbi +β”‚ β”œβ”€β”€ breakpoints_double.csv +β”‚ β”œβ”€β”€ read_ids.csv +β”‚ β”œβ”€β”€ read_qual.txt +β”‚ β”œβ”€β”€ severus.log +``` + +| File | Description | +| ----------------------------------------- | --------------------------------------------------------------------------------- | +| `all_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster | +| `all_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in all clustered events | +| `all_SVs/breakpoint_cluster.tsv` | a tsv containing all clustered events | +| `all_SVs/severus_all.vcf.gz` | A vcf file containing all identified structural variants | +| `somatic_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster | +| `somatic_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in somatic clustered events | +| `somatic_SVs/breakpoint_cluster.tsv` | a tsv containing somatic clustered events | +| `somatic_SVs/severus_somatic.vcf.gz` | A vcf file containing identified somatic structural variants | +| `somatic_SVs/severus_somatic.vcf.gz.tbi` | Index for identified somatic structural variants | +| `breakpoints_double.csv` | csv file containing detailed information about identified breakpoints in bam file | +| `read_ids.csv` | a csv file containing read ids associated with each identified SV | +| `read_qual.txt` | file containing quality statistics about identified segements | +| `severus.log` | log file |
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +### `vep` + +
+Output files + +``` +β”œβ”€β”€ vep +β”‚ β”œβ”€β”€ germline +β”‚ β”‚ β”œβ”€β”€ sample_GERMLINE_VEP.vcf.gz +β”‚ β”‚ β”œβ”€β”€ sample_GERMLINE_VEP_summary.html +β”‚ β”‚ β”œβ”€β”€ sample_GERMLINE_VEP.vcf.gz.tbi +β”‚ β”œβ”€β”€ somatic +β”‚ β”‚ β”œβ”€β”€ sample_SOMATIC_VEP.vcf.gz +β”‚ β”‚ β”œβ”€β”€ sample_SOMATIC_VEP_summary.html +β”‚ β”‚ β”œβ”€β”€ sample_SOMATIC_VEP.vcf.gz.tbi +β”‚ β”œβ”€β”€ SVs +β”‚ β”‚ β”œβ”€β”€ sample_SV_VEP.vcf.gz +β”‚ β”‚ β”œβ”€β”€ sample_SV_VEP_summary.html +β”‚ β”‚ β”œβ”€β”€ sample_SV_VEP.vcf.gz.tbi +``` + +| File | Description | +| ------------------------------------------- | ----------------------------------------------------------------------- | +| `germline/sample_GERMLINE_VEP.vcf.gz` | Annotated germline indel and SNV vcf file | +| `germline/sample_GERMLINE_VEP_summary.html` | Visual summary of germline indel and SNV annotations in html format | +| `germline/sample_GERMLINE_VEP.vcf.gz.tbi` | Annotated germline indel and SNV vcf index file | +| `somatic/sample_SOMATIC_VEP.vcf.gz` | Annotated somatic indel and SNV vcf file | +| `somatic/sample_SOMATIC_VEP_summary.html` | Visual summary of somatic indel and SNV annotations in html format | +| `somatic/sample_SOMATIC_VEP.vcf.gz.tbi` | Annotated somatic indel and SNV vcf index file | +| `SVs/sample_SV_VEP.vcf.gz` | Annotated somatic structural variant vcf file | +| `SVs/sample_SV_VEP_summary.html` | Visual summary of somatic structural variant annotations in html format | +| `SVs/sample_SV_VEP.vcf.gz.tbi` | Annotated somatic structural variant vcf index file | + +
+ +### `wakhan` + +
+Output files + +``` +β”œβ”€β”€ wakhan +β”‚ β”œβ”€β”€ {ploidy}_{purity}_{confidence} +β”‚ β”‚ β”œβ”€β”€ bed_output +β”‚ β”‚ β”‚ β”œβ”€β”€ genes_copynumber_states.bed +β”‚ β”‚ β”‚ β”œβ”€β”€ loh_regions.bed +β”‚ β”‚ β”‚ β”œβ”€β”€ sample_{ploidy}_{purity}_{confidence}_HP_1.bed +β”‚ β”‚ β”‚ β”œβ”€β”€ sample_{ploidy}_{purity}_{confidence}_HP_2.bed +β”‚ β”‚ β”œβ”€β”€ variation_plots +β”‚ β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_cn.html +β”‚ β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_cn.pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ CN_VARIATION_INDEX.html +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genes_genome.html +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genes_genome.pdf +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_breakpoints.html +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_breakpoints.pdf +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.html +β”‚ β”‚ β”œβ”€β”€ sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.pdf +β”‚ β”œβ”€β”€ coverage_data +β”‚ β”‚ β”œβ”€β”€ {0-23}_SNPS.csv +β”‚ β”‚ β”œβ”€β”€ coverage_ps.csv +β”‚ β”‚ β”œβ”€β”€ phase_corrected_coverage.csv +β”‚ β”‚ β”œβ”€β”€ pileup_SNPs.csv +β”‚ β”œβ”€β”€ coverage_plots +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_cov.html +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}.pdf +β”‚ β”‚ β”œβ”€β”€ COVERAGE_INDEX.html +β”‚ β”œβ”€β”€ phasing output +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_phase_correction_0.html +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_phase_correction_1.html +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}_without_phase_correction.html +β”‚ β”‚ β”œβ”€β”€ chr{1-22,X,Y}.pdf +β”‚ β”‚ β”œβ”€β”€ sample.rephased.vcf.gz +β”‚ β”‚ β”œβ”€β”€ sample.rephased.vcf.gz.tbi +β”‚ β”œβ”€β”€ sample_heatmap_ploidy_purity.html +β”‚ β”œβ”€β”€ sample_heatmap_ploidy_purity.html.pdf +β”‚ β”œβ”€β”€ sample_optimized_peak.html +β”‚ β”œβ”€β”€ solutions_ranks.tsv + +``` + +| File | Description | +| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `{ploidy}_{purity}_{confidence}/bed_output/genes_copynumber_states.bed` | bed file containing allele specific copy number values with coverage information | +| `{ploidy}_{purity}_{confidence}/bed_output/loh_regions.bed` | bed file containing positions of loss of heterozygosity regions | +| `{ploidy}_{purity}_{confidence}/bed_output/sample_{ploidy}_{purity}_{confidence}_HP_1.bed` | bed file containing copy number states, coverage, and SV breakpoints for haplotype 1 | +| `{ploidy}_{purity}_{confidence}/bed_output/sample_{ploidy}_{purity}_{confidence}_HP_2.bed` | bed file containing copy number states, coverage, and SV breakpoints for haplotype 2 | +| `{ploidy}_{purity}_{confidence}/variation_plots/chr{1-22,X,Y}_cn.html` | html based plotly plot of copy number and coverage for individual chromosomes | +| `{ploidy}_{purity}_{confidence}/variation_plots/chr{1-22,X,Y}_cn.pdf` | pdf based plotly plot of copy number and coverage for individual chromosomes | +| `{ploidy}_{purity}_{confidence}/variation_plots/CN_VARIATION_INDEX.html` | unclear html plot | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genes_genome.html` | html plots of copy number variations in highlighted genes | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genes_genome.pdf` | pdf plots of copy number variations in highlighted genes | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.html` | genome-wide html copy number plots with coverage information on same axis | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.pdf` | genome-wide pdf copy number plots with coverage information on same axis | +| `coverage_data/{0-23}_SNP.csv` | CSV of coverage data per chromosome | +| `coverage_data/coverage_ps.csv` | CSV of overall haplotype specific coverage data | +| `coverage_data/coverage.csv` | CSV of overall coverage data | +| `coverage_data/phase_corrected_coverage.csv` | CSV of overall phase-corrected coverage data | +| `coverage_data/pileup_SNPs.csv` | CSV of SNP pileup data | +| `coverage_plots/chr{1-22,X,Y}_cov.html` | chromosome specific html coverage plots | +| `coverage_plots/chr{1-22,X,Y}_cov.pdf` | chromosome specific pdf coverage plots | +| `coverage_plots/COVERAGE_INDEX.html` | unclear html plot | +| `phasing_output/chr{1-23,X,Y}_phase_correction_0.html` | Phase-switch error correction plot per chromosome | +| `phasing_output/chr{1-23,X,Y}_phase_correction_1.html` | Phase-switch error correction plot per chromosome | +| `phasing_output/chr{1-22,X,Y}_without_phase_correction.html` | Phase-switch error without phase correction plot per chromosome | +| `phasing_output/chr{1-22,X,Y}.pdf` | Phase-switch error correction plot | +| `phasing_output/PHASE_CORRECTION_INDEX` | unclear html plot | +| `phasing_output/sample_rephased.vcf.gz` | phase corrected SNP vcf file | +| `phasing_output/sample_rephased.vcf.gz.tbi` | phase corrected SNP vcf index file | +| `sample_heatmap_ploidy_purity.html` | heatmap html plot of purity ploidy fit | +| `sample_heatmap_ploidy_purity.html.pdf` | heatmap html plot of purity ploidy fit | +| `sample_optimized_peak.html` | optimization peak plot | +| `solutions_ranks.tsv` | rank of potential purity ploidy solutions | + +
+ +### `multiqc` + +
+Output files + +``` +β”œβ”€β”€ multiqc +β”‚ β”œβ”€β”€ multiqc_data +β”‚ β”‚ β”œβ”€β”€ BETA-multiqc.parquet +β”‚ β”‚ β”œβ”€β”€ llms-full.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth_cov_dist.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth_cumcov_dist.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth_perchrom.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth-cumcoverage-dist-id.txt +β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot.txt +β”‚ β”‚ β”œβ”€β”€ multiqc_citations +β”‚ β”‚ β”œβ”€β”€ multiqc_data.json +β”‚ β”‚ β”œβ”€β”€ multiqc_general_stats.txt +β”‚ β”‚ β”œβ”€β”€ multiqc_software_versions.txt +β”‚ β”‚ β”œβ”€β”€ multiqc_sources.txt +β”‚ β”‚ β”œβ”€β”€ multiqc.log +β”‚ β”œβ”€β”€ multiqc_plots +β”‚ β”‚ β”œβ”€β”€ pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-cnt.pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-log.pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-cumcoverage-dist-id.pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-cnt.pdf +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-pct.pdf +β”‚ β”‚ β”œβ”€β”€ png +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-cnt.png +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-log.png +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-cumcoverage-dist-id.png +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-cnt.png +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-pct.png +β”‚ β”‚ β”œβ”€β”€ svg +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-cnt.svg +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-coverage-per-contig-multi-log.svg +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-cumcoverage-dist-id.svg +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-cnt.svg +β”‚ β”‚ β”‚ β”œβ”€β”€ mosdepth-xy-coverage-plot-pct.svg +β”‚ β”œβ”€β”€ multiqc_report.html + +``` + +| File | Description | +| -------------------------------------------------------------- | ------------------------------------------------------------ | +| `multiqc_data/BETA-multiqc.parquet` | Multiqc data in Apache Parquet format (BETA) | +| `multiqc_data/llms-full.txt` | Prompt for large-language-model summary | +| `multiqc_data/mosdepth_cov_dist.txt` | text file of coverage distribution | +| `multiqc_data/mosdepth_cumcov_dist.txt` | text file of cummulative coverage distribution | +| `multiqc_data/mosdepth_perchrom.txt` | text file of coverage per chromosome | +| `multiqc_data/mosdepth-coverage-per-contig-multi.txt` | text file of coverage per contig | +| `multiqc_data/mosdepth-cumcoverage-dist-id.txt` | unclear text file | +| `multiqc_data/mosdepth-xy-coverage-plot.txt` | summary of chr X, chr Y coverage | +| `multiqc_data/multiqc_citations` | citations for multiqc | +| `multiqc_data/multiqc_data.json` | json file containing multiqc data output | +| `multiqc_data/multiqc_general_stats.txt` | summary statistics for the samples | +| `multiqc_data/multiqc_software_versions.txt` | software versions for tools used in multiqc | +| `multiqc_data/multiqc_sources.txt` | software sources for tools used in multiqc | +| `multiqc_data/multiqc.log` | log file for multiqc | +| `multiqc_plots/pdf/mosdepth-coverage-per-contig-multi-cnt.pdf` | pdf format plot of coverage per contig | +| `multiqc_plots/pdf/mosdepth-coverage-per-contig-multi-log.pdf` | pdf format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf` | pdf format plot of distribution of cumulative coverage | +| `multiqc_plots/pdf/mosdepth-xy-coverage-plot-cnt.pdf` | pdf format plot of chr X and chr Y coverage by count | +| `multiqc_plots/pdf/mosdepth-xy-coverage-plot-pct.pdf` | pdf format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/png/mosdepth-coverage-per-contig-multi-cnt.png` | png format plot of coverage per contig | +| `multiqc_plots/png/mosdepth-coverage-per-contig-multi-log.png` | png format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/png/mosdepth-cumcoverage-dist-id.png` | png format plot of distribution of cumulative coverage | +| `multiqc_plots/png/mosdepth-xy-coverage-plot-cnt.png` | png format plot of chr X and chr Y coverage by count | +| `multiqc_plots/png/mosdepth-xy-coverage-plot-pct.png` | png format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/svg/mosdepth-coverage-per-contig-multi-cnt.svg` | svg format plot of coverage per contig | +| `multiqc_plots/svg/mosdepth-coverage-per-contig-multi-log.svg` | svg format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg` | svg format plot of distribution of cumulative coverage | +| `multiqc_plots/svg/mosdepth-xy-coverage-plot-cnt.svg` | svg format plot of chr X and chr Y coverage by count | +| `multiqc_plots/svg/mosdepth-xy-coverage-plot-pct.svg` | svg format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/multiqc_report.html` | svg format plot of chr X and chr Y coverage by percentage | + +### `pipeline_info` + +
+Output files + +``` +β”œβ”€β”€ pipeline_info +β”‚ β”œβ”€β”€ execution_report_{DATE}.html +β”‚ β”œβ”€β”€ execution_timeline_{DATE}.html +β”‚ β”œβ”€β”€ execution_trace_{DATE}.txt +β”‚ β”œβ”€β”€ lrsomatic_softwar_mqc_versions.yml +β”‚ β”œβ”€β”€ params_{DATE}.json +β”‚ β”œβ”€β”€ pipeline_dag_{DATE}/html +``` + +| File | Description | +| ------------------------------------ | ------------------------------------------------------------------------------------------- | +| `execution_report_{DATE}.hmtl` | summary of pipeline resource and timing usage in a html report | +| `execution_timeline_{DATE}.hmtl` | a graphical summary of the timing of each module's task over the course of the pipeline run | +| `lrsomatic_softwar_mqc_versions.yml` | summary of the versions of each tool used by the pipeline | +| `params_{DATE}.json` | summary of the paramaters used in the pipeline | +| `pipeline_dag_{DATE}.html` | flow chart summarizing the pipeline run | + +
diff --git a/docs/usage.md b/docs/usage.md index 3881d3c1..30fa00af 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,14 +1,30 @@ -# IntGenomicsLab/lr_somatic: Usage +# IntGenomicsLab/lrsomatic: Usage > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ -## Introduction +## Samplesheet input - +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file of the following form: -## Samplesheet input +```csv +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,tumour.bam,normal.bam,ont,female,n +sample2,tumour.bam,,ont,female,y +sample3,tumour.bam,,pb,male,n +sample4,tumour.bam,normal.bam,pb,male,y +``` -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +lrsomatic extracts information from the bam header files to decide which models to use for Clair3, ClairS, or ClairS-TO. However, this can optionally be specified manually. You can do this for one or many samples, if the field is left blank, the pipeline will default to extracting this information. You can specify this by creating your csv in the following form: + +```csv +sample,bam_tumor,bam_normal,platform,sex,fiber,clair3_model,clairSTO_model,clairS_model +sample1,tumour.bam,normal.bam,ont,female,n +sample2,tumour.bam,,ont,female,y +sample3,tumour.bam,normal.bam,pb,male,n,r1041_e82_400bps_sup_v420,,ont_r10_dorado_sup_5khz_ssrs +sample4,tumour.bam,normal.bam,pb,male,y +``` + +Use the `input` parameter to specify the location to this input csv. ```bash --input '[path to samplesheet file]' @@ -18,35 +34,26 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +```csv +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,tumour1.bam,normal.bam,ont,female,n +sample1,tumour2.bam,,ont,female,y +sample1,tumour3.bam,,pb,male,n ``` -### Full samplesheet - -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. +### Full Description of Samplesheet Columns -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` - -| Column | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| Column | Description | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `bam_tumor` | Full path to BAM file for the tumor. File must end in `.bam`. | +| `bam_normal` | Full path to BAM file for the tumor. File must end in `.bam`. | +| `platform` | A string specifying the platform used for sequencing, can be either `pb` for PacBio sequencing data or `ont` for Oxford Nanopore sequencing data | +| `sex` | A string specifying the biological sex of the sample, can either be `m` or `f` | +| `fiber` | A string specifying if the sample has been subjected to Fiber-seq. Can either be `y` or `n` | +| `clair3_model` | A string describing which model is to be used for Clair3's small variant calling (_optional_) | +| `clairSTO_model` | A string describing which model is to be used for ClairS-TO's small variant calling (_optional_) | +| `clairS_model` | A string describing which model is to be used for ClairS's small variant calling (_optional_) | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -55,7 +62,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run IntGenomicsLab/lr_somatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh38 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -67,11 +74,8 @@ work # Directory containing the nextflow working files # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. - -Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. +``` > [!WARNING] > Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). @@ -79,7 +83,7 @@ Pipeline settings can be provided in a `yaml` or `json` file via `-params-file < The above pipeline run specified with a params file in yaml format: ```bash -nextflow run IntGenomicsLab/lr_somatic -profile docker -params-file params.yaml +nextflow run IntGenomicsLab/lrsomatic -profile docker -params-file params.yaml ``` with: @@ -93,19 +97,72 @@ genome: 'GRCh37' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +### Pipeline options + +| Parameter | Description | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-input` | Full file path to input samplesheet, must be in `.csv` format and conform to specifications noted above | +| `--genome` | Specified genome assembly, support is given for `GRCh38` and `CHM13` | +| `--normal_fiber` | A boolean which skips fiber-seq processing on normal files (on those which have fiber-seq for the tumor). Default = `true` (_does not skip fiber-seq processing for normal_) | + +#### Skipping options: + +| Parameter | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------- | +| `--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` | +| `--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` | +| `--skip_cramino` | A boolean to skip `cramino`. Default = `false` | +| `--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` | +| `--skip_ascat` | A boolean to skip `ascat`. Default = `false` | +| `--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` | +| `--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` | +| `--skip_vep` | A boolean to skip `vep`. Default = `false` | + +#### VEP options: + +| Parameter | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `--vep_cache` | Full path to a vep cache. If left blank, this will default to pulling from this [Annotation Cache Storage](https://annotation-cache.github.io/). | +| `--vep_cache_version` | Integer specifying version of vep cache. Default = `113` | +| `--vep_args` | A string specifying arguments to vep. Default = `"--everything --filter_common --per_gene --total_length --offline --format vcf"` | +| `--vep_custom` | A full path to a vcf file containing custom variants for annotation. Must be bgzipped and have `.vcf.gz` format. Default = `null` | +| `--vep_custom_tbi` | A full path to a index file for cutom vcf for vep. Default = `null` | + +#### Minimap2 Options + +| Parameter | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------- | +| `--minimap2_ont_model` | specifies which model to use minimap2 with for ONT samples. Default = `null` | +| `--minimap2_pb_model` | specifies which model to use minimap2 with for PacBio samples. Default = `null` | +| `--save_secondary_alignments` | A boolean to specify if secondary alignmetns are kept in aligned bam file. Defualt = `true` | + +#### ASCAT Options + +| Parameter | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------------- | +| `--ascat_ploidy` | integer to enforce a given ploidy value. Default = `null` | +| `--ascat_purity` | integer to enforce a given purity value. Default = `null` | +| `--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` | +| `--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` | +| `--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` | +| `--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` | +| `--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` | +| `--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` | +| `--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` | + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: ```bash -nextflow pull IntGenomicsLab/lr_somatic +nextflow pull IntGenomicsLab/lrsomatic ``` ### Reproducibility It is a good idea to specify the pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [IntGenomicsLab/lr_somatic releases page](https://github.com/IntGenomicsLab/lr_somatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. +First, go to the [IntGenomicsLab/lrsomatic releases page](https://github.com/IntGenomicsLab/lrsomatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. diff --git a/lint_log.txt b/lint_log.txt new file mode 100644 index 00000000..366aea19 --- /dev/null +++ b/lint_log.txt @@ -0,0 +1,3596 @@ +[2025-11-27 15:47:39,242] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:39,244] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/lustre1/project/stg_00096/home/rforsyth/LRSomatic/lrsomatic, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:47:39,250] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:39,251] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:39,254] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:39,258] git.cmd [DEBUG ] Popen(['git', 'version'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:39,260] git.cmd [DEBUG ] Popen(['git', 'fetch', '-v', '--progress', '--', 'origin'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=True) +[2025-11-27 15:47:40,027] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:40,360] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:40,375] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:47:40,376] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:47:40,376] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:47:40,378] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:41,648] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: + +modules.json + + +[2025-11-27 15:47:41,651] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:41,651] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:41,652] nf_core.components.lint [DEBUG ] Registry set to quay.io +[2025-11-27 15:47:41,652] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:41,653] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:41,705] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:41,724] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:47:41,724] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:47:41,725] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:47:41,727] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:41,727] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:41,728] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,155] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: + +modules.json + + +[2025-11-27 15:47:42,157] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,157] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,158] nf_core.components.lint [DEBUG ] Registry set to quay.io +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,162] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,162] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,163] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,163] nf_core.pipelines.lint [INFO ] Testing pipeline: [magenta]. +[2025-11-27 15:47:42,165] nf_core.pipelines.lint [DEBUG ] Running lint test: files_exist +[2025-11-27 15:47:42,167] nf_core.pipelines.lint [DEBUG ] Running lint test: nextflow_config +[2025-11-27 15:47:42,169] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,169] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,170] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,171] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,171] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,171] nf_core.pipelines.schema [DEBUG ] Ignoring parameters from config: ['genomes'] +[2025-11-27 15:47:42,171] nf_core.pipelines.schema [DEBUG ] Ignoring parameters: ['help', 'help_full', 'show_hidden', 'trace_report_suffix', 'genomes'] +[2025-11-27 15:47:42,172] nf_core.pipelines.schema [DEBUG ] JSON file loaded: nextflow_schema.json +[2025-11-27 15:47:42,172] nf_core.pipelines.lint [DEBUG ] Running lint test: nf_test_content +[2025-11-27 15:47:42,173] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,174] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,174] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,175] nf_core.pipelines.lint [DEBUG ] Running lint test: files_unchanged +[2025-11-27 15:47:42,197] nf_core.utils [DEBUG ] Could not find a config file in the directory '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' +[2025-11-27 15:47:42,378] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Could not find git hash for pipeline: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic. /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,379] nf_core.utils [DEBUG ] No conda `environment.yml` file found. +[2025-11-27 15:47:42,382] urllib3.connectionpool [DEBUG ] Starting new HTTPS connection (1): nf-co.re:443 +[2025-11-27 15:47:42,674] urllib3.connectionpool [DEBUG ] https://nf-co.re:443 "GET /pipelines.json HTTP/1.1" 200 None +[2025-11-27 15:47:42,909] nf_core.pipelines.rocrate [DEBUG ] Adding topics: ['nf-core', 'nextflow'] +[2025-11-27 15:47:42,909] nf_core.pipelines.rocrate [DEBUG ] No git repository found. No git contributors will be added as authors. +[2025-11-27 15:47:42,910] nf_core.pipelines.rocrate [INFO ] Saving metadata file to '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Using config file: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic/.nf-core.yml +[2025-11-27 15:47:42,914] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,914] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,915] nf_core.utils [DEBUG ] Using config file: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic/.nf-core.yml +[2025-11-27 15:47:43,547] nf_core.pipelines.lint_utils [DEBUG ] prettier.................................................................Passed + +[2025-11-27 15:47:43,550] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_nf_test +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_awstest +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_awsfulltest +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: readme +[2025-11-27 15:47:43,557] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_todos +[2025-11-27 15:47:43,708] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_if_empty_null +[2025-11-27 15:50:35,955] nf_core.pipelines.lint [DEBUG ] Running lint test: plugin_includes +[2025-11-27 15:50:35,958] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_name_conventions +[2025-11-27 15:50:35,959] nf_core.pipelines.lint [DEBUG ] Running lint test: template_strings +[2025-11-27 15:50:36,008] nf_core.pipelines.lint [DEBUG ] Running lint test: schema_lint +[2025-11-27 15:50:36,008] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,009] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,042] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,042] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,043] nf_core.pipelines.lint [DEBUG ] Skipping lint test 'schema_params' +[2025-11-27 15:50:36,043] nf_core.pipelines.lint [DEBUG ] Running lint test: system_exit +[2025-11-27 15:50:36,093] nf_core.pipelines.lint [DEBUG ] Running lint test: schema_description +[2025-11-27 15:50:36,093] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,093] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,094] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,094] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,125] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_schema_validation +[2025-11-27 15:50:36,126] urllib3.connectionpool [DEBUG ] Starting new HTTPS connection (1): www.schemastore.org:443 +[2025-11-27 15:50:36,292] urllib3.connectionpool [DEBUG ] https://www.schemastore.org:443 "GET /github-workflow HTTP/1.1" 200 14042 +[2025-11-27 15:50:36,454] nf_core.pipelines.lint [DEBUG ] Running lint test: merge_markers +[2025-11-27 15:50:36,514] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_json +[2025-11-27 15:50:36,514] nf_core.pipelines.lint [DEBUG ] Running lint test: multiqc_config +[2025-11-27 15:50:36,516] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,516] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,517] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,517] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_structure +[2025-11-27 15:50:36,520] nf_core.pipelines.lint [DEBUG ] Running lint test: local_component_structure +[2025-11-27 15:50:36,520] nf_core.pipelines.lint [DEBUG ] Running lint test: base_config +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,522] nf_core.pipelines.lint.configs [DEBUG ] found sections: [] +[2025-11-27 15:50:36,539] nf_core.pipelines.lint.configs [DEBUG ] found nf_files: ['main.nf', 'workflows/lrsomatic.nf', 'subworkflows/local/tumor_normal_happhase.nf', 'subworkflows/local/tumor_only_happhase.nf', 'subworkflows/local/prepare_annotation.nf', 'subworkflows/local/prepare_reference_files.nf', 'subworkflows/nf-core/utils_nfschema_plugin/main.nf', 'subworkflows/nf-core/bam_stats_samtools/main.nf', 'subworkflows/nf-core/utils_nextflow_pipeline/main.nf', 'subworkflows/nf-core/utils_nfcore_pipeline/main.nf', 'subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf', 'modules/nf-core/ascat/main.nf', 'modules/nf-core/mosdepth/main.nf', 'modules/nf-core/multiqc/main.nf', 'modules/nf-core/wget/main.nf', 'modules/nf-core/unzip/main.nf', 'modules/nf-core/untar/main.nf', 'modules/nf-core/severus/main.nf', 'modules/nf-core/minimap2/align/main.nf', 'modules/nf-core/minimap2/index/main.nf', 'modules/nf-core/bcftools/merge/main.nf', 'modules/nf-core/bcftools/sort/main.nf', 'modules/nf-core/bcftools/concat/main.nf', 'modules/nf-core/modkit/pileup/main.nf', 'modules/nf-core/samtools/idxstats/main.nf', 'modules/nf-core/samtools/faidx/main.nf', 'modules/nf-core/samtools/cat/main.nf', 'modules/nf-core/samtools/index/main.nf', 'modules/nf-core/samtools/stats/main.nf', 'modules/nf-core/samtools/flagstat/main.nf', 'modules/nf-core/longphase/haplotag/main.nf', 'modules/nf-core/longphase/phase/main.nf', 'modules/nf-core/ensemblvep/vep/main.nf', 'modules/nf-core/ensemblvep/download/main.nf', 'modules/nf-core/pigz/uncompress/main.nf', 'modules/local/wakhan/main.nf', 'modules/local/clairs/main.nf', 'modules/local/cramino/main.nf', 'modules/local/metaextract/main.nf', 'modules/local/clairsto/main.nf', 'modules/local/vcfsplit/main.nf', 'modules/local/clair3/main.nf', 'modules/local/fibertoolsrs/fire/main.nf', 'modules/local/fibertoolsrs/predictm6a/main.nf', 'modules/local/fibertoolsrs/qc/main.nf', 'modules/local/fibertoolsrs/nucleosomes/main.nf'] +[2025-11-27 15:50:36,539] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_config +[2025-11-27 15:50:36,541] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,541] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,542] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,542] nf_core.pipelines.lint.configs [DEBUG ] found sections: ['ENSEMBLVEP_DOWNLOAD'] +[2025-11-27 15:50:36,558] nf_core.pipelines.lint.configs [DEBUG ] found nf_files: ['main.nf', 'workflows/lrsomatic.nf', 'subworkflows/local/tumor_normal_happhase.nf', 'subworkflows/local/tumor_only_happhase.nf', 'subworkflows/local/prepare_annotation.nf', 'subworkflows/local/prepare_reference_files.nf', 'subworkflows/nf-core/utils_nfschema_plugin/main.nf', 'subworkflows/nf-core/bam_stats_samtools/main.nf', 'subworkflows/nf-core/utils_nextflow_pipeline/main.nf', 'subworkflows/nf-core/utils_nfcore_pipeline/main.nf', 'subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf', 'modules/nf-core/ascat/main.nf', 'modules/nf-core/mosdepth/main.nf', 'modules/nf-core/multiqc/main.nf', 'modules/nf-core/wget/main.nf', 'modules/nf-core/unzip/main.nf', 'modules/nf-core/untar/main.nf', 'modules/nf-core/severus/main.nf', 'modules/nf-core/minimap2/align/main.nf', 'modules/nf-core/minimap2/index/main.nf', 'modules/nf-core/bcftools/merge/main.nf', 'modules/nf-core/bcftools/sort/main.nf', 'modules/nf-core/bcftools/concat/main.nf', 'modules/nf-core/modkit/pileup/main.nf', 'modules/nf-core/samtools/idxstats/main.nf', 'modules/nf-core/samtools/faidx/main.nf', 'modules/nf-core/samtools/cat/main.nf', 'modules/nf-core/samtools/index/main.nf', 'modules/nf-core/samtools/stats/main.nf', 'modules/nf-core/samtools/flagstat/main.nf', 'modules/nf-core/longphase/haplotag/main.nf', 'modules/nf-core/longphase/phase/main.nf', 'modules/nf-core/ensemblvep/vep/main.nf', 'modules/nf-core/ensemblvep/download/main.nf', 'modules/nf-core/pigz/uncompress/main.nf', 'modules/local/wakhan/main.nf', 'modules/local/clairs/main.nf', 'modules/local/cramino/main.nf', 'modules/local/metaextract/main.nf', 'modules/local/clairsto/main.nf', 'modules/local/vcfsplit/main.nf', 'modules/local/clair3/main.nf', 'modules/local/fibertoolsrs/fire/main.nf', 'modules/local/fibertoolsrs/predictm6a/main.nf', 'modules/local/fibertoolsrs/qc/main.nf', 'modules/local/fibertoolsrs/nucleosomes/main.nf'] +[2025-11-27 15:50:36,559] nf_core.pipelines.lint [DEBUG ] Running lint test: nfcore_yml +[2025-11-27 15:50:36,563] nf_core.pipelines.lint [DEBUG ] Running lint test: rocrate_readme_sync +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_input': {}}, {'tumor_index': {}}, {'normal_input': {}}, {'normal_index': {}}, {'vcf': {}}, {'breakpoints': {}}], [{'meta2': {}}, {'reference': {}}]] +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 24 outputs in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'genes_genome_html': [[{'meta': {}}, {'*/*_genes_genome.html': {}}]], 'genes_genome_pdf': [[{'meta': {}}, {'*/*_genes_genome.pdf': {}}]], 'breakpoints_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.html': {}}]], 'breakpoints_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.pdf': {}}]], 'breakpoints_subclonal_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.html': {}}]], 'breakpoints_subclonal_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.pdf': {}}]], 'copynumbers_details_html': [[{'meta': {}}, {'*/*_genome_copynumbers_details.html': {}}]], 'copynumbers_details_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_details.pdf': {}}]], 'bed_files': [[{'meta': {}}, {'*/bed_output/*.bed': {}}]], 'variation_plots': [[{'meta': {}}, {'*/variation_plots/*.html': {}}]], 'vcf_files': [[{'meta': {}}, {'*/vcf_output/*_wakhan_cna_*.vcf': {}}]], 'heatmap_html': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html': {}}]], 'heatmap_pdf': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html.pdf': {}}]], 'optimized_peak_html': [[{'meta': {}}, {'*_optimized_peak.html': {}}]], 'coverage_csv': [[{'meta': {}}, {'coverage_data/*.csv': {}}]], 'coverage_plots_html': [[{'meta': {}}, {'coverage_plots/*.html': {}}]], 'coverage_plots_pdf': [[{'meta': {}}, {'coverage_plots/*.pdf': {}}]], 'phasing_html': [[{'meta': {}}, {'phasing_output/*.html': {}}]], 'phasing_pdf': [[{'meta': {}}, {'phasing_output/*.pdf': {}}]], 'rephased_vcf': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz': {}}]], 'rephased_vcf_index': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz.csi': {}}]], 'snps_loh_plot': [[{'meta': {}}, {'snps_loh_plots/*_genome_snps_ratio_loh.html': {}}]], 'solutions_ranks': [[{'meta': {}}, {'solutions_ranks.tsv': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'normal_bam': {}}, {'normal_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcfs': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'meta_ext': [[{'meta': {}}, {'basecall_model': {}}, {'kinetics': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 7 inputs in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}], {'dbSNP': {}}, {'colors': {}}, {'onekgenomes': {}}, {'gnomad': {}}] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'indel_vcf': [[{'meta': {}}, {'indel.vcf.gz': {}}]], 'indel_tbi': [[{'meta': {}}, {'indel.vcf.gz.tbi': {}}]], 'snv_vcf': [[{'meta': {}}, {'snv.vcf.gz': {}}]], 'snv_tbi': [[{'meta': {}}, {'snv.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.txt"), emit: qc_txt + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'qc_txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.txt"), emit: qc_txt + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'snv_vcf': {}}, {'indel_vcf': {}}]] +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi + + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'somatic_vcf': [[{'meta': {}}, {'*somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'*somatic.vcf.gz.tbi': {}}]], 'germline_vcf': [[{'meta': {}}, {'*germline.vcf.gz': {}}]], 'germline_tbi': [[{'meta': {}}, {'*germline.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi + + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'model': {}}, {'platform': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*merge_output.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*merge_output.vcf.gz.tbi': {}}]], 'phased_vcf': [[{'meta': {}}, {'*phased_merge_output.vcf.gz': {}}]], 'phased_tbi': [[{'meta': {}}, {'*phased_merge_output.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 8 inputs in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_normal': {}}, {'index_normal': {}}, {'input_tumor': {}}, {'index_tumor': {}}], {'genomeVersion': {}}, {'allele_files': {}}, {'loci_files': {}}, {'bed_file': {}}, {'fasta': {}}, {'gc_file': {}}, {'rt_file': {}}] +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 11 outputs in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'allelefreqs': [[{'meta': {}}, {'*alleleFrequencies_chr*.txt': {}}]], 'bafs': [[{'meta': {}}, {'*BAF.txt': {}}]], 'cnvs': [[{'meta': {}}, {'*cnvs.txt': {}}]], 'logrs': [[{'meta': {}}, {'*LogR.txt': {}}]], 'metrics': [[{'meta': {}}, {'*metrics.txt': {}}]], 'png': [[{'meta': {}}, {'*png': {}}]], 'pdf': [[{'meta': {}}, {'*pdf': {}}]], 'purityploidy': [[{'meta': {}}, {'*purityploidy.txt': {}}]], 'segments': [[{'meta': {}}, {'*segments.txt': {}}]], 'segments_raw': [[{'meta': {}}, {'*segments_raw.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,574] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:36,575] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,839] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,851] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:36,851] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:36,852] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:36,852] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,884] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,887] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ascat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,888] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ascat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,986] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,056] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ascat/main.nf +[2025-11-27 15:50:37,056] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbi': {}}]] +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'${prefix}.${extension}': {}}]], 'tbi': [[{'meta': {}}, {'${prefix}.${extension}.tbi': {}}]], 'csi': [[{'meta': {}}, {'${prefix}.${extension}.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:37,057] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:37,058] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,092] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:37,104] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,135] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,138] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/concat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,139] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/concat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,225] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,309] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:37,310] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,343] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,353] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:37,354] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:37,354] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:37,354] git.cmd [DEBUG ] Popen(['git', 'checkout', 'e753770db613ce014b3c4bc94f6cba443427b726'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,018] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 4 inputs in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbis': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}], [{'meta4': {}}, {'bed': {}}]] +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{bcf,vcf}{,.gz}': {}}]], 'index': [[{'meta': {}}, {'*.{csi,tbi}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:38,213] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:38,213] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,275] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,286] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:38,287] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:38,287] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:38,288] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,346] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,350] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/merge'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,351] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/merge'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,436] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,518] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:38,518] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,566] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:38,579] git.cmd [DEBUG ] Popen(['git', 'checkout', 'f17049e03697726ace7499d2fe342f892594f6f3'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:42,382] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}]] +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{vcf,vcf.gz,bcf,bcf.gz}': {}}]], 'tbi': [[{'meta': {}}, {'*.tbi': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:45,573] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:45,574] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,713] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:45,728] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,865] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,868] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/sort'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,869] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/sort'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,959] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,043] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'assembly': {}}, {'species': {}}, {'cache_version': {}}]] +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Outputs: {'cache': [[{'meta': {}}, {'prefix': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:46,044] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:46,045] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,151] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:46,165] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,208] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,212] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ensemblvep/download'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,213] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ensemblvep/download'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,324] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,402] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:46,402] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,455] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:46,468] git.cmd [DEBUG ] Popen(['git', 'checkout', '2fcc53751152a999bfc9c24f75f494b9e5bb338f'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:49,974] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 9 inputs in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}, {'custom_extra_files': {}}], {'genome': {}}, {'species': {}}, {'cache_version': {}}, {'cache': {}}, [{'meta2': {}}, {'fasta': {}}], {'extra_files': {}}, {'custom_vep': {}}, {'custom_vep_tbi': {}}] +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 6 outputs in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'tab': [[{'meta': {}}, {'*.tab.gz': {}}]], 'json': [[{'meta': {}}, {'*.json.gz': {}}]], 'report': [{'*.html': {}}], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:53,302] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:53,303] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,408] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:53,421] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,518] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,522] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ensemblvep/vep'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,523] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ensemblvep/vep'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,631] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,709] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.{bam,cram}': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:53,710] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:53,711] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,792] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,804] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:53,805] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:53,806] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:53,806] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,874] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,878] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/longphase/haplotag'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,879] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/longphase/haplotag'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,991] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,094] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:54,095] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,185] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,199] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:54,199] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:54,200] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:54,200] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:58,312] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:02,039] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:02,040] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,408] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,419] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:02,419] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:02,420] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:02,421] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,475] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,478] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/longphase/phase'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,479] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/longphase/phase'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,590] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,695] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,695] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:02,696] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,749] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:02,762] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:05,703] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'reads': {}}], [{'meta2': {}}, {'reference': {}}], {'bam_format': {}}, {'bam_index_extension': {}}, {'cigar_paf_format': {}}, {'cigar_bam': {}}] +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Outputs: {'paf': [[{'meta': {}}, {'*.paf': {}}]], 'bam': [[{'meta': {}}, {'*.bam': {}}]], 'index': [[{'meta': {}}, {'*.bam.${bam_index_extension}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:09,496] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:09,497] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,655] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:09,668] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,808] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,812] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/minimap2/align'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,813] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/minimap2/align'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,901] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,040] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:10,041] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:10,041] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,141] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,153] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:10,153] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:10,154] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:10,154] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:13,177] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}]] +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Outputs: {'index': [[{'meta': {}}, {'*.mmi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:16,904] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:16,905] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,209] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,221] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:17,221] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:17,222] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:17,222] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,280] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,284] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/minimap2/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,285] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/minimap2/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,372] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,510] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:17,510] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,570] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,582] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:17,583] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:17,583] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:17,583] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:20,761] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,622] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}], [{'meta2': {}}, {'fasta': {}}, {'fai': {}}], [{'meta3': {}}, {'bed': {}}]] +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bed': [[{'meta': {}}, {'*.bed': {}}]], 'bedgraph': [[{'meta': {}}, {'*.bedgraph': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:24,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:24,624] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,815] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,826] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:24,827] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:24,827] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:24,828] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,997] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,000] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/modkit/pileup'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,002] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/modkit/pileup'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,119] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,234] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:25,235] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,374] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:25,387] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:28,381] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'bed': {}}], [{'meta2': {}}, {'fasta': {}}]] +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 13 outputs in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Outputs: {'global_txt': [[{'meta': {}}, {'*.global.dist.txt': {}}]], 'summary_txt': [[{'meta': {}}, {'*.summary.txt': {}}]], 'regions_txt': [[{'meta': {}}, {'*.region.dist.txt': {}}]], 'per_base_d4': [[{'meta': {}}, {'*.per-base.d4': {}}]], 'per_base_bed': [[{'meta': {}}, {'*.per-base.bed.gz': {}}]], 'per_base_csi': [[{'meta': {}}, {'*.per-base.bed.gz.csi': {}}]], 'regions_bed': [[{'meta': {}}, {'*.regions.bed.gz': {}}]], 'regions_csi': [[{'meta': {}}, {'*.regions.bed.gz.csi': {}}]], 'quantized_bed': [[{'meta': {}}, {'*.quantized.bed.gz': {}}]], 'quantized_csi': [[{'meta': {}}, {'*.quantized.bed.gz.csi': {}}]], 'thresholds_bed': [[{'meta': {}}, {'*.thresholds.bed.gz': {}}]], 'thresholds_csi': [[{'meta': {}}, {'*.thresholds.bed.gz.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:32,190] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:32,191] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,284] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,295] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:32,296] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:32,297] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:32,298] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,363] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,367] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/mosdepth'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,368] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/mosdepth'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,456] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,599] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:32,600] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,663] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,674] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:32,675] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:32,675] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:32,675] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:35,682] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Inputs: [{'multiqc_files': {}}, {'multiqc_config': {}}, {'extra_multiqc_config': {}}, {'multiqc_logo': {}}, {'replace_names': {}}, {'sample_names': {}}] +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found output_data: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Outputs: {'report': [{'*multiqc_report.html': {}}], 'data': [{'*_data': {}}], 'plots': [{'*_plots': {}}], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Output data: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:39,445] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:39,446] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,663] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,675] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:39,675] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:39,676] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:39,677] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,806] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,810] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/multiqc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,811] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/multiqc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,903] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,049] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:40,050] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,147] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,160] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:40,160] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:40,161] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:40,161] git.cmd [DEBUG ] Popen(['git', 'checkout', 'a4488d3d09244f29fb4606ba4eef85d59dcc6ad8'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:43,079] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,118] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'zip': {}}]] +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Outputs: {'file': [[{'meta': {}}, {'${uncompressed_filename}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:46,119] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:46,120] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,170] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,183] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:46,184] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:46,184] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:46,185] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,235] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,239] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/pigz/uncompress'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,240] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/pigz/uncompress'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,362] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,485] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:46,486] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,557] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:46,570] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:49,638] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_files': {}}]] +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'${prefix}.bam': {}}]], 'cram': [[{'meta': {}}, {'${prefix}.cram': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:53,446] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:53,447] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,665] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,676] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:53,676] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:53,677] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:53,678] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,816] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,820] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/cat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,821] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/cat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,937] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,075] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:54,076] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,183] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,194] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:54,195] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:54,195] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:54,195] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:57,097] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}], [{'meta2': {}}, {'fai': {}}], {'get_sizes': {}}] +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Outputs: {'fa': [[{'meta': {}}, {'*.{fa,fasta}': {}}]], 'sizes': [[{'meta': {}}, {'*.sizes': {}}]], 'fai': [[{'meta': {}}, {'*.fai': {}}]], 'gzi': [[{'meta': {}}, {'*.gzi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:00,645] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:00,646] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,838] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:00,852] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,041] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,045] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/faidx'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,046] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/faidx'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,137] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,305] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:01,306] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,372] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,385] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:01,385] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:01,386] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:01,386] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:04,805] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Outputs: {'flagstat': [[{'meta': {}}, {'*.flagstat': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:08,779] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:08,780] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,027] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,038] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:09,038] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:09,039] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:09,040] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,096] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,100] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/flagstat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,101] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/flagstat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,188] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,355] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:09,356] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,413] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:09,426] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:12,547] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'idxstats': [[{'meta': {}}, {'*.idxstats': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:16,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:16,623] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,766] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,778] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:16,778] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:16,779] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:16,779] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,892] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,896] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/idxstats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,897] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/idxstats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,985] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,153] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:17,154] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,256] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,268] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:17,268] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:17,269] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:17,269] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:20,320] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}]] +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bai': [[{'meta': {}}, {'*.bai': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'crai': [[{'meta': {}}, {'*.crai': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:23,974] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:23,974] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,244] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,256] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:24,256] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:24,257] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:24,257] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,308] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,312] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,313] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,401] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,568] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:24,569] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,620] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,631] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:24,632] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:24,632] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:24,632] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:27,563] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}, {'input_index': {}}], [{'meta2': {}}, {'fasta': {}}]] +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Outputs: {'stats': [[{'meta': {}}, {'*.stats': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:31,361] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:31,362] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,494] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,506] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:31,507] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:31,507] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:31,508] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,610] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,614] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/stats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,615] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/stats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,702] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,878] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,878] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:31,879] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,963] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,975] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:31,976] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:31,976] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:31,976] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:34,930] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'target_input': {}}, {'target_index': {}}, {'control_input': {}}, {'control_index': {}}, {'vcf': {}}, {'tbi': {}}], [{'meta2': {}}, {'bed': {}}, {'pon_path': {}}]] +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 18 outputs in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Outputs: {'log': [[{'meta': {}}, {'severus.log': {}}]], 'read_qual': [[{'meta': {}}, {'read_qual.txt': {}}]], 'breakpoints_double': [[{'meta': {}}, {'breakpoints_double.csv': {}}]], 'read_alignments': [[{'meta': {}}, {'read_alignments': {}}]], 'read_ids': [[{'meta': {}}, {'read_ids.csv': {}}]], 'collapsed_dup': [[{'meta': {}}, {'severus_collaped_dup.bed': {}}]], 'loh': [[{'meta': {}}, {'severus_LOH.bed': {}}]], 'all_vcf': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz': {}}]], 'all_tbi': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz.tbi': {}}]], 'all_breakpoints_clusters_list': [[{'meta': {}}, {'all_SVs/breakpoint_clusters_list.tsv': {}}]], 'all_breakpoints_clusters': [[{'meta': {}}, {'all_SVs/breakpoint_clusters.tsv': {}}]], 'all_plots': [[{'meta': {}}, {'all_SVs/plots/severus_*.html': {}}]], 'somatic_vcf': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz.tbi': {}}]], 'somatic_breakpoints_clusters_list': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters_list.tsv': {}}]], 'somatic_breakpoints_clusters': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters.tsv': {}}]], 'somatic_plots': [[{'meta': {}}, {'somatic_SVs/plots/severus_*.html': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:38,674] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:38,674] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,880] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,892] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:38,892] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:38,893] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:38,893] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,092] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,096] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/severus'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,097] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/severus'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,214] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,367] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/severus/main.nf +[2025-11-27 15:52:39,367] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:39,368] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,435] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,448] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:39,448] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:39,449] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:39,449] git.cmd [DEBUG ] Popen(['git', 'checkout', '81880787133db07d9b4c1febd152c090eb8325dc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:49,232] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Outputs: {'untar': [[{'meta': {}}, {'${prefix}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:57,845] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:57,845] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,185] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,197] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:58,198] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:58,198] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:58,199] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,243] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,246] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/untar'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,247] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/untar'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,344] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,548] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:58,549] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,620] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,633] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:58,633] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:58,634] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:58,634] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:01,667] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Outputs: {'unzipped_archive': [[{'meta': {}}, {'${prefix}/': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:53:05,410] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:05,411] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,637] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:05,650] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,794] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,798] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/unzip'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,799] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/unzip'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,893] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,081] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:06,082] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,193] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,205] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:06,205] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:06,206] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:06,206] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:09,447] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'url': {}}]] +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Outputs: {'outfile': [[{'meta': {}}, {'${prefix}.${suffix}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:53:13,328] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:13,328] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,447] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,458] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:13,459] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:13,459] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:13,460] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,563] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,567] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/wget'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,568] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/wget'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,684] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,841] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:13,842] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,932] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,943] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:13,944] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:13,944] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:13,944] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:16,975] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,106] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:21,107] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,393] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,417] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:21,418] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:21,418] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:21,420] git.cmd [DEBUG ] Popen(['git', 'checkout', '05954dab2ff481bcb999f24455da29a5828af08d'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:27,600] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,141] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:38,142] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,286] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:38,299] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,354] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,358] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/bam_stats_samtools'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,372] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,458] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:38,459] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,517] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,528] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:38,529] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:38,529] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:38,530] git.cmd [DEBUG ] Popen(['git', 'checkout', 'c2b22d85f30a706a3073387f30380704fcae013b'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:51,273] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:04,283] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:04,285] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,104] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,146] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:05,149] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:05,150] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:05,154] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,466] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,484] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nextflow_pipeline'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,611] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,766] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:05,768] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,968] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:06,009] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:06,011] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:06,012] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:06,013] git.cmd [DEBUG ] Popen(['git', 'checkout', '51ae5406a030d4da1e49e4dab49756844fdd6c7a'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:43,965] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,578] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:57,578] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,881] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,895] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:57,895] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:57,896] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:57,897] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,070] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,074] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nfcore_pipeline'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,084] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,172] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:58,173] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,226] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,240] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:58,241] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:58,241] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:58,241] git.cmd [DEBUG ] Popen(['git', 'checkout', '2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:06,742] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,344] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:55:16,344] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,558] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,572] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:55:16,573] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:55:16,573] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:55:16,574] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,711] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,716] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nfschema_plugin'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,727] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,820] nf_core.pipelines.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,821] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,947] nf_core.components.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,948] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,968] nf_core.components.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,969] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False diff --git a/main.nf b/main.nf index 502dad5c..a6011fff 100644 --- a/main.nf +++ b/main.nf @@ -1,9 +1,9 @@ #!/usr/bin/env nextflow /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic + IntGenomicsLab/lrsomatic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Github : https://github.com/IntGenomicsLab/lr_somatic + Github : https://github.com/IntGenomicsLab/lrsomatic ---------------------------------------------------------------------------------------- */ @@ -13,21 +13,9 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { LR_SOMATIC } from './workflows/lr_somatic' -include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// TODO nf-core: Remove this line if you don't need a FASTA file -// This is an example of how to use getGenomeAttribute() to fetch parameters -// from igenomes.config using `--genome` -params.fasta = getGenomeAttribute('fasta') +include { LRSOMATIC } from './workflows/lrsomatic' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,7 +26,7 @@ params.fasta = getGenomeAttribute('fasta') // // WORKFLOW: Run main analysis pipeline depending on type of input // -workflow INTGENOMICSLAB_LR_SOMATIC { +workflow INTGENOMICSLAB_LRSOMATIC { take: samplesheet // channel: samplesheet read in from --input @@ -48,11 +36,11 @@ workflow INTGENOMICSLAB_LR_SOMATIC { // // WORKFLOW: Run pipeline // - LR_SOMATIC ( + LRSOMATIC ( samplesheet ) emit: - multiqc_report = LR_SOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html + multiqc_report = LRSOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -72,13 +60,16 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // // WORKFLOW: Run main workflow // - INTGENOMICSLAB_LR_SOMATIC ( + INTGENOMICSLAB_LRSOMATIC ( PIPELINE_INITIALISATION.out.samplesheet ) // @@ -91,7 +82,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - INTGENOMICSLAB_LR_SOMATIC.out.multiqc_report + INTGENOMICSLAB_LRSOMATIC.out.multiqc_report ) } diff --git a/modules.json b/modules.json index 99f2f4e0..7bc71b09 100644 --- a/modules.json +++ b/modules.json @@ -1,13 +1,132 @@ { - "name": "IntGenomicsLab/lr_somatic", - "homePage": "https://github.com/IntGenomicsLab/lr_somatic", + "name": "IntGenomicsLab/lrsomatic", + "homePage": "https://github.com/IntGenomicsLab/lrsomatic", "repos": { "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "ascat": { + "branch": "master", + "git_sha": "98ffb090029d17a9fb8de75dadcfe6bc8b6377ec", + "installed_by": ["modules"] + }, + "bcftools/concat": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules", "vcf_gather_bcftools"] + }, + "bcftools/merge": { + "branch": "master", + "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "installed_by": ["modules"] + }, + "bcftools/sort": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["vcf_gather_bcftools"], + "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" + }, + "ensemblvep/download": { + "branch": "master", + "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", + "installed_by": ["modules"] + }, + "ensemblvep/vep": { + "branch": "master", + "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", + "installed_by": ["modules"], + "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" + }, + "longphase/haplotag": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "longphase/phase": { + "branch": "master", + "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", + "installed_by": ["modules"], + "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" + }, + "minimap2/align": { + "branch": "master", + "git_sha": "1a5a9e7b4009dcf34e6867dd1a5a1d9a718b027b", + "installed_by": ["modules"] + }, + "minimap2/index": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, + "modkit/pileup": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "mosdepth": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", - "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", + "installed_by": ["modules"] + }, + "pigz/uncompress": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, + "samtools/cat": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/flagstat": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/idxstats": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/index": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/stats": { + "branch": "master", + "git_sha": "f4eab7945952dc4934224309701a49913ea05ae6", + "installed_by": ["modules"] + }, + "severus": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"], + "patch": "modules/nf-core/severus/severus.diff" + }, + "untar": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "unzip": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "wget": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } @@ -16,17 +135,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/local/clair3/environment.yml b/modules/local/clair3/environment.yml new file mode 100644 index 00000000..e1a7b846 --- /dev/null +++ b/modules/local/clair3/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::clair3=1.0.10" diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf new file mode 100644 index 00000000..85d793fa --- /dev/null +++ b/modules/local/clair3/main.nf @@ -0,0 +1,59 @@ +process CLAIR3 { + tag "$meta.id" + label 'process_very_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/clair3:1.2.0--py310h779eee5_0': + 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0' }" + + input: + tuple val(meta), path(bam), path(bai), path(model), val(platform) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) + + output: + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + run_clair3.sh \\ + --bam_fn=$bam \\ + --ref_fn=$reference \\ + --threads=$task.cpus \\ + --output=. \\ + --platform=$platform \\ + --model=$model \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.phased_merge_output.vcf.gz + touch ${prefix}.phased_merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}.merge_output.vcf.gz + touch ${prefix}.merge_output.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') + END_VERSIONS + """ +} diff --git a/modules/local/clair3/meta.yml b/modules/local/clair3/meta.yml new file mode 100644 index 00000000..cecf7564 --- /dev/null +++ b/modules/local/clair3/meta.yml @@ -0,0 +1,123 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clair3" +description: Clair3 is a germline small variant caller for long-reads +keywords: + - germline + - variant + - Indel + - SNV +tools: + - "clair3": + description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER + (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≀30-fold of ONT data + (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally + four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment + as input for deep-learning based long-read small variant calling. Clair3 is + simple and modular for easy deployment and integration." + homepage: "https://github.com/HKU-BAL/Clair3" + documentation: "https://github.com/HKU-BAL/Clair3" + tool_dev_url: "https://github.com/HKU-BAL/Clair3" + doi: "10.1038/s43588-022-00387-x" + licence: ["BSD-3-clause"] + identifier: biotools:clair3 + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - bai: + type: file + description: BAM index file + pattern: "*.bai" + - packaged_model: + type: string + description: string containing the name of a prepackaged Clair3 model + full list of models and their descriptions is provided at https://github.com/HKU-BAL/Clair3?tab=readme-ov-file#pre-trained-models + - user_model: + type: directory + description: directory containing Clair3 model files + - platform: + type: string + description: val in ['hifi','ont', 'ilmn'] to indicate pacbio, ONT, or illumina + respectively + - - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - reference: + type: file + description: reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - index: + type: file + description: reference index file + pattern: "*.fai" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - "*merge_output.vcf.gz": + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + - phased_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz": + type: file + description: phased vcf + pattern: "*.{vcf,vcf.gz}" + - phased_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf new file mode 100644 index 00000000..29837fd9 --- /dev/null +++ b/modules/local/clairs/main.nf @@ -0,0 +1,64 @@ +process CLAIRS { + tag "$meta.id" + label 'process_very_high' + + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker.io/hkubal/clairs:v0.4.1': + 'docker.io/hkubal/clairs:v0.4.1' }" + + input: + tuple val(meta), path(tumor_bam), path(tumor_bai), path(normal_bam), path(normal_bai), val(model) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + /opt/bin/run_clairs \ + --tumor_bam_fn $tumor_bam \\ + --normal_bam_fn $normal_bam \\ + --ref_fn $reference \\ + --threads $task.cpus \\ + --platform $model \\ + --output_dir . \\ + --output_prefix snvs \\ + $args + + if [[ -f "snv.vcf.gz" ]]; then + rm snv.vcf.gz + rm snv.vcf.gz.tbi + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + echo "" | gzip > snvs.vcf.gz + touch snvs.vcf.gz.tbi + + echo "" | gzip > indel.vcf.gz + touch indel.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') + END_VERSIONS + """ +} diff --git a/modules/local/clairs/meta.yml b/modules/local/clairs/meta.yml new file mode 100644 index 00000000..46c5b6ce --- /dev/null +++ b/modules/local/clairs/meta.yml @@ -0,0 +1,93 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clairs" +description: write your description here +keywords: + - small + - variant + - SNV + - indel +tools: + - "clairs": + description: "" + homepage: "https://github.com/HKU-BAL/ClairS" + documentation: "https://github.com/HKU-BAL/ClairS" + tool_dev_url: "https://github.com/HKU-BAL/ClairS" + doi: "10.1101/2023.08.17.553778 " + licence: ["BSD-3-clause"] + identifier: biotools:clairs + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + - tumor_bam: + type: file + description: | + BAM file for tumor sample + pattern: "*.vcf.gz" + - tumor_bai: + type: file + description: | + index file for tumor BAM file + pattern: "*.bai" + - normal_bam: + type: file + description: | + BAM file for normal sample + pattern: "*.bam" + - normal_bai: + type: file + description: | + index file for normal BAM file + pattern: "*.bai" + - model: + type: string + description: | + Name for ClairS model + - - meta2: + type: map + description: | + Groovy Map containing sample information + - reference: + type: file + description: | + A reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + - index: + type: file + description: | + index file for the reference fasta file + pattern: "*.fai" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz": + type: file + description: VCF file containing small somatic variants + pattern: "*.vcf.gz" + - tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz.tbi": + type: file + description: VCF index file for small somatic variants + pattern: "*.vcf.gz.tbi" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf new file mode 100644 index 00000000..130baebd --- /dev/null +++ b/modules/local/clairsto/main.nf @@ -0,0 +1,75 @@ + +process CLAIRSTO { + tag "$meta.id" + label 'process_very_high' + + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker.io/hkubal/clairs-to:v0.4.0': + 'docker.io/hkubal/clairs-to:v0.4.0' }" + + input: + tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) + path(dbSNP) + path(colors) + path(onekgenomes) + path(gnomad) + + output: + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' + def gnomad = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' + def dbSNP = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' + def onekgenomes = onekgenomes ?: '1000g-pon.sites.vcf.gz' + def colors = colors ?: 'colors-pon.sites.vcf.gz' + + + """ + /opt/bin/run_clairs_to \ + --tumor_bam_fn $tumor_bam \\ + --ref_fn $reference \\ + --platform $model \\ + --threads $task.cpus \\ + --output_dir . \\ + --panel_of_normals "${gnomad},${dbSNP},${onekgenomes},${colors}" \\ + --panel_of_normals_require_allele_matching 'True,True,False,False' \\ + $conda_prefix \\ + $args \\ + + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + mkdir -p output + echo "" | gzip > snv.vcf.gz + touch snv.vcf.gz.tbi + echo "" | gzip > indel.vcf.gz + touch indel.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') + END_VERSIONS + """ +} diff --git a/modules/local/clairsto/meta.yml b/modules/local/clairsto/meta.yml new file mode 100644 index 00000000..f283f56a --- /dev/null +++ b/modules/local/clairsto/meta.yml @@ -0,0 +1,105 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clairsto" +description: write your description here +keywords: + - small + - variant + - SNV + - indel + - tumor-only +tools: + - "clairs": + description: "" + homepage: "https://github.com/HKU-BAL/ClairS-TO" + documentation: "https://github.com/HKU-BAL/ClairS-TO" + tool_dev_url: "https://github.com/HKU-BAL/ClairS-TO" + doi: "10.1101/2023.08.17.553778 " + licence: ["BSD-3-clause"] + identifier: biotools:clairsto + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + - tumor_bam: + type: file + description: | + BAM file for tumor sample + pattern: "*.vcf.gz" + - tumor_bai: + type: file + description: | + index file for tumor BAM file + pattern: "*.bai" + - model: + type: string + description: | + Name for ClairS model + - - meta2: + type: map + description: | + Groovy Map containing sample information + - reference: + type: file + description: | + A reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + - index: + type: file + description: | + index file for the reference fasta file + pattern: "*.fai" +output: + - indel_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - "*/indel.vcf.gz": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - indel_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - "*/indel.vcf.gz.tbi": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - snv_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - "*/snv.vcf.gz": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - snv_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - "*/snv.vcf.gz.tbi": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/cramino/environment.yml b/modules/local/cramino/environment.yml new file mode 100644 index 00000000..c8b4126f --- /dev/null +++ b/modules/local/cramino/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::cramino=1.0.0" diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf new file mode 100644 index 00000000..ce64c8e7 --- /dev/null +++ b/modules/local/cramino/main.nf @@ -0,0 +1,53 @@ +process CRAMINO { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cramino:1.0.0--h3dc2dae_0': + 'biocontainers/cramino:1.0.0--h3dc2dae_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + + + + + """ + cramino $args $bam > ${prefix}_cramino.txt + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cramino: \$(cramino --version |& sed '1!d ; s/cramino //') + END_VERSIONS + """ + + + + + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}_cramino.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cramino: \$(cramino --version |& sed '1!d ; s/cramino //') + END_VERSIONS + """ +} diff --git a/modules/local/cramino/meta.yml b/modules/local/cramino/meta.yml new file mode 100644 index 00000000..b63a18af --- /dev/null +++ b/modules/local/cramino/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "cramino" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "cramino": + ## TODO nf-core: Add a description and other details for the software below + description: "A tool for very fast quality assessment of long read cram/bam files." + homepage: "None" + documentation: "None" + tool_dev_url: "None" + doi: "" + licence: ["MIT"] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@alexanRNA" +maintainers: + - "@alexanRNA" diff --git a/modules/local/fibertoolsrs/fire/environment.yml b/modules/local/fibertoolsrs/fire/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/fire/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf new file mode 100644 index 00000000..08d2dbaf --- /dev/null +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -0,0 +1,91 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_FIRE { + tag "$meta.id" + label 'process_very_high' + label 'process_high_memory' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + fire \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}_fire.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_fire.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/fire/meta.yml b/modules/local/fibertoolsrs/fire/meta.yml new file mode 100644 index 00000000..63f0a8b0 --- /dev/null +++ b/modules/local/fibertoolsrs/fire/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_fire" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ["MIT"] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/nucleosomes/environment.yml b/modules/local/fibertoolsrs/nucleosomes/environment.yml new file mode 100644 index 00000000..649180bb --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - fibertools-rs=0.6.2 diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf new file mode 100644 index 00000000..6722aab2 --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -0,0 +1,91 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_NUCLEOSOMES { + tag "$meta.id" + label 'process_very_high' + label 'process_high_memory' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + add-nucleosomes \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}_nuc.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_nuc.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/nucleosomes/meta.yml b/modules/local/fibertoolsrs/nucleosomes/meta.yml new file mode 100644 index 00000000..1863d9f1 --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolssrs_nucleosomes" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolssrs": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/fibertoolsrs/predictm6a/environment.yml b/modules/local/fibertoolsrs/predictm6a/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf new file mode 100644 index 00000000..e91572b9 --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -0,0 +1,91 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_PREDICTM6A { + tag "$meta.id" + label 'process_very_high' + label 'process_high_memory' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + predict-m6a \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}_m6a.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_m6a.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/predictm6a/meta.yml b/modules/local/fibertoolsrs/predictm6a/meta.yml new file mode 100644 index 00000000..f9b25d64 --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_predictm6a" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ["MIT"] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/qc/environment.yml b/modules/local/fibertoolsrs/qc/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf new file mode 100644 index 00000000..b99424d6 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -0,0 +1,90 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_QC { + tag "$meta.id" + label 'process_very_high' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.txt"), emit: qc_txt + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + qc \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}_qc.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_qc.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/qc/meta.yml b/modules/local/fibertoolsrs/qc/meta.yml new file mode 100644 index 00000000..3a15bee4 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_qc" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ["MIT"] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/metaextract/environment.yml b/modules/local/metaextract/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/metaextract/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf new file mode 100644 index 00000000..7f032250 --- /dev/null +++ b/modules/local/metaextract/main.nf @@ -0,0 +1,49 @@ +process METAEXTRACT { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def ont = meta.platform == 'ont' + """ + basecall_model="" + kinetics="" + if [ $ont = 'true' ]; then + basecall_model=\$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print \$2; exit}' | awk '{print \$1}' | tr -d '[:space:]') + else + kinetics=\$(samtools view -H ${bam} | awk '/--keep-kinetics/ {found=1} END {print (found ? "true" : "false")}') + basecall_model="hifi_revio" + fi + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/metaextract/meta.yml b/modules/local/metaextract/meta.yml new file mode 100644 index 00000000..542861a6 --- /dev/null +++ b/modules/local/metaextract/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "metaextract" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "metaextract": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/vcfsplit/environment.yml b/modules/local/vcfsplit/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/vcfsplit/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf new file mode 100644 index 00000000..ec69277d --- /dev/null +++ b/modules/local/vcfsplit/main.nf @@ -0,0 +1,70 @@ +process VCFSPLIT { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" + + input: + tuple val(meta), path(snv_vcf), path(indel_vcf) + + output: + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi + + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + + bcftools view -i 'FILTER="PASS"' $indel_vcf | bgzip -c > indels_pass.vcf.gz + bcftools view -i 'FILTER="PASS"' $snv_vcf | bgzip -c > snv_pass.vcf.gz + tabix -p vcf indels_pass.vcf.gz + tabix -p vcf snv_pass.vcf.gz + bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz + tabix -p vcf somatic.vcf.gz + + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_filtered.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_filtered.vcf.gz + tabix -p vcf indels_filtered.vcf.gz + tabix -p vcf snv_filtered.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_filtered.vcf.gz snv_filtered.vcf.gz + tabix -p vcf germline_tmp.vcf.gz + + bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ + bgzip -c > germline.vcf.gz + tabix -p vcf germline.vcf.gz + + # Cleanup intermediate files + rm indels_pass.vcf.gz snv_pass.vcf.gz + rm indels_pass.vcf.gz.tbi snv_pass.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > somatic.vcf.gz + echo "" | gzip > germline.vcf.gz + echo "" | gzip > somatic.vcf.gz.tbi + echo "" | gzip > germline.vcf.gz.tbi + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') + END_VERSIONS + """ +} diff --git a/modules/local/vcfsplit/meta.yml b/modules/local/vcfsplit/meta.yml new file mode 100644 index 00000000..8f115005 --- /dev/null +++ b/modules/local/vcfsplit/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "vcfsplit" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "vcfsplit": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/wakhan/environment.yml b/modules/local/wakhan/environment.yml new file mode 100644 index 00000000..a1450d1b --- /dev/null +++ b/modules/local/wakhan/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::wakhan=0.1.1" diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf new file mode 100644 index 00000000..8bd5d5b9 --- /dev/null +++ b/modules/local/wakhan/main.nf @@ -0,0 +1,100 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process WAKHAN { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/wakhan:0.2.0--pyhdfd78af_1': + 'biocontainers/wakhan:0.2.0--pyhdfd78af_1' }" + + input: + tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) + tuple val(meta2), path(reference) + + output: + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-phased-vcf $vcf" + // WARN: Version information not provided by tool on CLI. Please update this string when upgrading BLAZE code + def VERSION = "0.2.0" + """ + wakhan \\ + --target-bam ${tumor_input} \\ + --breakpoints ${breakpoints} \\ + --reference ${reference} \\ + --genome-name ${prefix} \\ + --out-dir-plots . \\ + ${phased_vcf} \\ + ${args} \\ + --threads ${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wakhan: $VERSION + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "0.2.0" + + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wakhan: $VERSION + END_VERSIONS + """ +} diff --git a/modules/local/wakhan/meta.yml b/modules/local/wakhan/meta.yml new file mode 100644 index 00000000..6695af4a --- /dev/null +++ b/modules/local/wakhan/meta.yml @@ -0,0 +1,68 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "wakhan" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "wakhan": + ## TODO nf-core: Add a description and other details for the software below + description: "A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads" + homepage: "None" + documentation: "None" + tool_dev_url: "None" + doi: "" + licence: ["MIT"] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@ljwharbers" +maintainers: + - "@ljwharbers" diff --git a/modules/nf-core/ascat/environment.yml b/modules/nf-core/ascat/environment.yml new file mode 100644 index 00000000..c5cfc59e --- /dev/null +++ b/modules/nf-core/ascat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ascat=3.1.1 + - bioconda::cancerit-allelecount=4.3.0 diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf new file mode 100644 index 00000000..366a4ba4 --- /dev/null +++ b/modules/nf-core/ascat/main.nf @@ -0,0 +1,239 @@ +process ASCAT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': + 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" + + input: + tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) + val(genomeVersion) + path(allele_files) + path(loci_files) + path(bed_file) // optional + path(fasta) // optional + path(gc_file) // optional + path(rt_file) // optional + + output: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def gender = args.gender ? "$args.gender" : "NULL" + def purity = args.purity ? "$args.purity" : "NULL" + def ploidy = args.ploidy ? "$args.ploidy" : "NULL" + def penalty = args.penalty ? "$args.penalty" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" + + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" + def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" + def min_base_qual_arg = args.min_base_qual ? ",min_base_qual = $args.min_base_qual" : "" + def min_map_qual_arg = args.min_map_qual ? ",min_map_qual = $args.min_map_qual" : "" + def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + + def normal_exists = input_normal ? 'TRUE' : 'FALSE' + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" + def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + """ + #!/usr/bin/env Rscript + library(RColorBrewer) + library(ASCAT) + options(bitmapType='cairo') + + #build prefixes: + allele_path = normalizePath("$allele_files") + allele_prefix = paste0(allele_path, "/", "$allele_files", "_chr") + + loci_path = normalizePath("$loci_files") + loci_prefix = paste0(loci_path, "/", "$loci_files", "_chr") + + #prepare from BAM files + ascat.prepareHTS( + tumourseqfile = "$input_tumor", + tumourname = paste0("$prefix", ".tumour"), + allelecounter_exe = "alleleCounter", + alleles.prefix = allele_prefix, + loci.prefix = loci_prefix, + gender = "$gender", + genomeVersion = "$genomeVersion", + nthreads = $task.cpus + $normal_bam + $normal_name + $minCounts_arg + $bed_file_arg + $chrom_names_arg + $min_base_qual_arg + $min_map_qual_arg + $longread_bins + $fasta_arg + $allele_counter_flags + $skip_allele_counting_tumour_arg + $skip_allele_counting_normal_arg, + seed = 42 + ) + + + #Load the data + if($normal_exists) { + print("normal exists") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), + Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender" + ) + } else { + print("normal does not exist") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender") + gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") + + } + print("printing ascat.bc") + print(ascat.bc) + + #Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) + + # optional LogRCorrection + if("$gc_input" != "NULL") { + gc_input = paste0(normalizePath("$gc_input")) + + if("$rt_input" != "NULL"){ + rt_input = paste0(normalizePath("$rt_input")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) + } + else { + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) + } + } + + #Segment the data + if($normal_exists) { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) + } else { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) + } + + #Plot the segmented data + ascat.plotSegmentedData(ascat.bc) + + #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers + #If psi and rho are manually set: + if (!is.null($purity) && !is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) + } else if(!is.null($purity) && is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) + } else if(!is.null($ploidy) && is.null($purity)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) + } else { + ascat.output <- ascat.runAscat(ascat.bc, gamma=1) + } + + #Extract metrics from ASCAT profiles + QC = ascat.metrics(ascat.bc,ascat.output) + + #Write out segmented regions (including regions with one copy of each allele) + write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out raw segmented regions (including regions with one copy of each allele) + tryCatch({ # In case segments_raw is not selected + write.table( + ascat.output[["segments_raw"]], + file = paste0(prefix, ".segments_raw.txt"), + sep = "\t", quote = FALSE, row.names = FALSE + ) + }, error = function(e) { + message("Error in writing segments_raw: ", conditionMessage(e)) + }) + + #Write out CNVs in bed format + cnvs=ascat.output[["segments"]][2:6] + write.table(cnvs, file=paste0("$prefix",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) + + #Write out purity and ploidy info + summary <- tryCatch({ + matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { + # error handler picks up where error was generated + print(paste("Could not find optimal solution: ",err)) + return(matrix(c(0,0),nrow=1,ncol=2,byrow = TRUE)) + } + ) + colnames(summary) <- c("AberrantCellFraction","Ploidy") + write.table(summary, file=paste0("$prefix",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) + + write.table(QC, file=paste0("$prefix", ".metrics.txt"), sep="\t", quote=F, row.names=F) + + # version export + f <- file("versions.yml","w") + alleleCounter_version = system(paste("alleleCounter --version"), intern = T) + ascat_version = sessionInfo()\$otherPkgs\$ASCAT\$Version + writeLines(paste0('"', "$task.process", '"', ":"), f) + writeLines(paste(" alleleCounter:", alleleCounter_version), f) + writeLines(paste(" ascat:", ascat_version), f) + close(f) + + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.germline.png + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.tumour.png + echo stub > ${prefix}.before_correction.test.tumour.germline.png + echo stub > ${prefix}.before_correction.test.tumour.tumour.png + echo stub > ${prefix}.cnvs.txt + echo stub > ${prefix}.metrics.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr21.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt + echo stub > ${prefix}.purityploidy.txt + echo stub > ${prefix}.segments.txt + echo stub > ${prefix}.tumour.ASPCF.png + echo stub > ${prefix}.tumour.sunrise.png + echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt + echo stub > ${prefix}.tumour_alleleFrequencies_chr22.txt + echo stub > ${prefix}.tumour_normalBAF.txt + echo stub > ${prefix}.tumour_normalLogR.txt + echo stub > ${prefix}.tumour_tumourBAF.txt + echo stub > ${prefix}.tumour_tumourLogR.txt + + echo "${task.process}:" > versions.yml + echo ' alleleCounter: 4.3.0' >> versions.yml + echo ' ascat: 3.0.0' >> versions.yml + + """ + + +} \ No newline at end of file diff --git a/modules/nf-core/ascat/meta.yml b/modules/nf-core/ascat/meta.yml new file mode 100644 index 00000000..db7c9292 --- /dev/null +++ b/modules/nf-core/ascat/meta.yml @@ -0,0 +1,165 @@ +name: ascat +description: copy number profiles of tumour cells. +keywords: + - bam + - copy number + - cram +tools: + - ascat: + description: ASCAT is a method to derive copy number profiles of tumour cells, + accounting for normal cell admixture and tumour aneuploidy. ASCAT infers tumour + purity (the fraction of tumour cells) and ploidy (the amount of DNA per tumour + cell), expressed as multiples of haploid genomes from SNP array or massively + parallel sequencing data, and calculates whole-genome allele-specific copy number + profiles (the number of copies of both parental alleles for all SNP loci across + the genome). + documentation: https://github.com/VanLoo-lab/ascat/tree/master/man + tool_dev_url: https://github.com/VanLoo-lab/ascat + doi: "10.1093/bioinformatics/btaa538" + licence: ["GPL v3"] + identifier: biotools:ascat +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_normal: + type: file + description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation For + modifying chromosome notation in bam files please follow + https://josephcckuo.wordpress.com/2016/11/17/modify-chromosome-notation-in-bam-file/. + pattern: "*.{bam,cram}" + - index_normal: + type: file + description: index for normal_bam/cram + pattern: "*.{bai,crai}" + - input_tumor: + type: file + description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation + pattern: "*.{bam,cram}" + - index_tumor: + type: file + description: index for tumor_bam/cram + pattern: "*.{bai,crai}" + - - allele_files: + type: file + description: allele files for ASCAT WGS. Can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + - - loci_files: + type: file + description: loci files for ASCAT WGS. Loci files without chromosome notation + can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + Make sure the chromosome notation matches the bam/cram input files. To add + the chromosome notation to loci files (hg19/hg38) if necessary, you can run + this command `if [[ $(samtools view | head -n1 | cut -f3)\" + == *\"chr\"* ]]; then for i in {1..22} X; do sed -i 's/^/chr/' G1000_loci_hg19_chr_${i}.txt; + done; fi` + - - bed_file: + type: file + description: Bed file for ASCAT WES (optional, but recommended for WES) + - - fasta: + type: file + description: Reference fasta file (optional) + - - gc_file: + type: file + description: GC correction file (optional) - Used to do logR correction of the + tumour sample(s) with genomic GC content + - - rt_file: + type: file + description: replication timing correction file (optional, provide only in combination + with gc_file) +output: + - allelefreqs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*alleleFrequencies_chr*.txt": + type: file + description: Files containing allee frequencies per chromosome + pattern: "*{alleleFrequencies_chr*.txt}" + - bafs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*BAF.txt": + type: file + description: BAF file + - cnvs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*cnvs.txt": + type: file + description: CNV file + - logrs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*LogR.txt": + type: file + description: LogR file + - metrics: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*metrics.txt": + type: file + description: File containing quality metrics + pattern: "*.{metrics.txt}" + - png: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*png": + type: file + description: ASCAT plots + pattern: "*.{png}" + - purityploidy: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*purityploidy.txt": + type: file + description: File with purity and ploidy data + pattern: "*.{purityploidy.txt}" + - segments: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*segments.txt": + type: file + description: File with segments data + pattern: "*.{segments.txt}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@aasNGC" + - "@lassefolkersen" + - "@FriederikeHanssen" + - "@maxulysse" + - "@SusiJo" +maintainers: + - "@aasNGC" + - "@lassefolkersen" + - "@FriederikeHanssen" + - "@maxulysse" + - "@SusiJo" diff --git a/modules/nf-core/bcftools/concat/environment.yml b/modules/nf-core/bcftools/concat/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/concat/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf new file mode 100644 index 00000000..5415b069 --- /dev/null +++ b/modules/nf-core/bcftools/concat/main.nf @@ -0,0 +1,72 @@ +process BCFTOOLS_CONCAT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcfs), path(tbi) + + output: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def tbi_names = tbi.findAll { file -> !(file instanceof List) }.collect { file -> file.name } + def create_input_index = vcfs.collect { vcf -> tbi_names.contains(vcf.name + ".tbi") || tbi_names.contains(vcf.name + ".csi") ? "" : "tabix ${vcf}" }.join("\n ") + extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def input = vcfs.sort{it.toString()}.join(" ") + """ + ${create_input_index} + + bcftools concat \\ + --output ${prefix}.${extension} \\ + $args \\ + --threads $task.cpus \\ + ${input} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index_extension = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index_extension.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index_extension}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml new file mode 100644 index 00000000..5e14b5a3 --- /dev/null +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -0,0 +1,82 @@ +name: bcftools_concat +description: Concatenate VCF files +keywords: + - variant calling + - concat + - bcftools + - VCF +tools: + - concat: + description: | + Concatenate VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: list + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + - tbi: + type: list + description: | + List containing 2 or more index files (optional) + e.g. [ 'file1.tbi', 'file2.tbi' ] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}.tbi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.tbi" + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}.csi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.csi" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@abhi18av" + - "@nvnieuwk" +maintainers: + - "@abhi18av" + - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test new file mode 100644 index 00000000..442f4b4e --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -0,0 +1,315 @@ +nextflow_process { + + name "Test Process BCFTOOLS_CONCAT" + script "../main.nf" + process "BCFTOOLS_CONCAT" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/concat" + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + + test("homo_sapiens - [[vcf1, vcf2], []]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + +} diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap new file mode 100644 index 00000000..b82169c9 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -0,0 +1,395 @@ +{ + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:25.259752" + }, + "homo_sapiens - [[vcf1, vcf2], []]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T10:03:17.250013" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:52:50.140505" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:52:55.544079" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:31.742638" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T10:29:33.203302" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:17.482474" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:53:07.368971" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:53:01.405995" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/concat/tests/nextflow.config b/modules/nf-core/bcftools/concat/tests/nextflow.config new file mode 100644 index 00000000..c6a5142a --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = "--no-version" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config new file mode 100644 index 00000000..b6f9165c --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..afa03d74 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..1ca85231 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/merge/environment.yml b/modules/nf-core/bcftools/merge/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/merge/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf new file mode 100644 index 00000000..c560a902 --- /dev/null +++ b/modules/nf-core/bcftools/merge/main.nf @@ -0,0 +1,74 @@ +process BCFTOOLS_MERGE { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcfs), path(tbis) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(bed) + + output: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def input = (vcfs.collect().size() > 1) ? vcfs.sort{ it.name } : vcfs + def regions = bed ? "--regions-file $bed" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + + """ + bcftools merge \\ + $args \\ + $regions \\ + --threads $task.cpus \\ + --output ${prefix}.${extension} \\ + $input + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/merge/meta.yml b/modules/nf-core/bcftools/merge/meta.yml new file mode 100644 index 00000000..09af245a --- /dev/null +++ b/modules/nf-core/bcftools/merge/meta.yml @@ -0,0 +1,105 @@ +name: bcftools_merge +description: Merge VCF files +keywords: + - variant calling + - merge + - VCF +tools: + - merge: + description: | + Merge VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: file + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + ontologies: [] + - tbis: + type: file + description: | + List containing the tbi index files corresponding to the vcfs input files + e.g. [ 'file1.vcf.tbi', 'file2.vcf.tbi' ] + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: "(Optional) The fasta reference file (only necessary for the `--gvcf + FILE` parameter)" + pattern: "*.{fasta,fa}" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: "(Optional) The fasta reference file index (only necessary for + the `--gvcf FILE` parameter)" + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing bed information + e.g. [ id:'genome' ] + - bed: + type: file + description: "(Optional) The bed regions to merge on" + pattern: "*.bed" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{bcf,vcf}{,.gz}": + type: file + description: merged output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{csi,tbi}": + type: file + description: index of merged output + pattern: "*.{csi,tbi}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@joseespinosa" + - "@drpatelh" + - "@nvnieuwk" + - "@ramprasadn" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@nvnieuwk" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/merge/tests/bcf.config b/modules/nf-core/bcftools/merge/tests/bcf.config new file mode 100644 index 00000000..4467d07d --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/bcf.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type u --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/bcf_gz.config b/modules/nf-core/bcftools/merge/tests/bcf_gz.config new file mode 100644 index 00000000..280de8db --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/bcf_gz.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type b --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test b/modules/nf-core/bcftools/merge/tests/main.nf.test new file mode 100644 index 00000000..3995fc1a --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test @@ -0,0 +1,853 @@ +nextflow_process { + + name "Test Process BCFTOOLS_MERGE" + script "../main.nf" + process "BCFTOOLS_MERGE" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/merge" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf output") { + + config "./vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output") { + + config "./vcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf output") { + + config "./bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf") }, + { assert snapshot( + file(process.out.vcf.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output") { + + config "./bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf.gz") }, + { assert snapshot( + file(process.out.vcf.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index") { + + config "./vcf_gz_index_csi.config" + + when { + + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("tbi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], bed") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output") { + + config "./nextflow.gvcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ] + input[2] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + ] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - one sample") { + + config "./nextflow.config" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub") { + + options "-stub" + config "./vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub") { + + options "-stub" + config "./vcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub") { + + options "-stub" + config "./bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub") { + + options "-stub" + config "./bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub") { + + options "-stub" + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub") { + + options "-stub" + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub") { + + options "-stub" + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("tbi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], bed - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub") { + + options "-stub" + config "./nextflow.gvcf.config" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ] + input[2] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + ] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - one sample - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } +} diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test.snap b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap new file mode 100644 index 00000000..d340b7b4 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap @@ -0,0 +1,607 @@ +{ + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.tbi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:16.859885" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:43.269991" + }, + "sarscov2 - [vcf, tbi], [], [], bed": { + "content": [ + "febdcfb851dcfc83d8248520830aef10", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:21.848388" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:03.763345" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf output": { + "content": [ + "57bb84274f336465d0a0946b532093b0", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:47.331149" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:59.170567" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:13.022634" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:48.592261" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.csi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:11.953139" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:51.935426" + }, + "sarscov2 - [vcf, tbi], [], [], bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:18.319666" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf output": { + "content": [ + "test.bcf", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:56.742352" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:53.962449" + }, + "sarscov2 - [vcf, tbi], [], [], [] - one sample - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:29.155018" + }, + "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:23.944931" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.csi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:06.894016" + }, + "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output": { + "content": [ + "645b7f7f9131bfe350a9ec3cf82c17fe", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:28.149857" + }, + "sarscov2 - [vcf, tbi], [], [], [] - one sample": { + "content": [ + "2a374cf02f0c32cf607646167e7f153b", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:32.592911" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:37.830691" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:08.5748" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:41.986954" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output": { + "content": [ + "test.bcf.gz", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:01.801297" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.config b/modules/nf-core/bcftools/merge/tests/nextflow.config new file mode 100644 index 00000000..c3f0b715 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: BCFTOOLS_MERGE { + ext.args = '--force-samples --force-single --no-version' + } +} diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config b/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config new file mode 100644 index 00000000..8c457b71 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config @@ -0,0 +1,5 @@ +process { + withName: BCFTOOLS_MERGE { + ext.args = { "--force-samples --no-version --output-type z --gvcf $fasta" } + } +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf.config b/modules/nf-core/bcftools/merge/tests/vcf.config new file mode 100644 index 00000000..759222e5 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type v --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz.config b/modules/nf-core/bcftools/merge/tests/vcf_gz.config new file mode 100644 index 00000000..8b6ad8b4 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type z --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config new file mode 100644 index 00000000..9f1e9b1d --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..8308ee1a --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..9be4075b --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bcftools/sort/bcftools-sort.diff b/modules/nf-core/bcftools/sort/bcftools-sort.diff new file mode 100644 index 00000000..b1696f25 --- /dev/null +++ b/modules/nf-core/bcftools/sort/bcftools-sort.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/bcftools/sort' +'modules/nf-core/bcftools/sort/meta.yml' is unchanged +Changes in 'bcftools/sort/main.nf': +--- modules/nf-core/bcftools/sort/main.nf ++++ modules/nf-core/bcftools/sort/main.nf +@@ -67,4 +67,4 @@ + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +-} ++} +'modules/nf-core/bcftools/sort/environment.yml' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index.config' is unchanged +'modules/nf-core/bcftools/sort/tests/main.nf.test' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config' is unchanged +'modules/nf-core/bcftools/sort/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/bcftools/sort/environment.yml b/modules/nf-core/bcftools/sort/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/sort/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf new file mode 100644 index 00000000..302c7311 --- /dev/null +++ b/modules/nf-core/bcftools/sort/main.nf @@ -0,0 +1,70 @@ +process BCFTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + + """ + bcftools \\ + sort \\ + --output ${prefix}.sorted.${extension} \\ + --temp-dir . \\ + $args \\ + $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml new file mode 100644 index 00000000..c15487c7 --- /dev/null +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -0,0 +1,71 @@ +name: bcftools_sort +description: Sorts VCF files +keywords: + - sorting + - VCF + - variant calling +tools: + - sort: + description: Sort VCF files by coordinates. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + tool_dev_url: https://github.com/samtools/bcftools + doi: "10.1093/bioinformatics/btp352" + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: The VCF/BCF file to be sorted + pattern: "*.{vcf.gz,vcf,bcf}" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: Sorted VCF file + pattern: "*.{vcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@Gwennid" +maintainers: + - "@Gwennid" diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test new file mode 100644 index 00000000..7d580e4f --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -0,0 +1,222 @@ +nextflow_process { + + name "Test Process BCFTOOLS_SORT" + script "../main.nf" + process "BCFTOOLS_SORT" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/sort" + + test("sarscov2 - vcf") { + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("vcf") } + ) + } + + } + + test("sarscov2 - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + test("sarscov2 - vcf - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } +} diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap new file mode 100644 index 00000000..3cbca56c --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -0,0 +1,350 @@ +{ + "sarscov2 - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:49:07.959267" + }, + "vcf": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:35.236174" + }, + "sarscov2 - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:39.95133" + }, + "sarscov2 - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:44.50977" + }, + "sarscov2 - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:58.749279" + }, + "sarscov2 - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:49:03.283017" + }, + "sarscov2 - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:54.113947" + }, + "sarscov2 - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:48.979311" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config new file mode 100644 index 00000000..aacd1346 --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index" +} diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..640eb0ba --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi" +} diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..589a50c6 --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi" +} diff --git a/modules/nf-core/ensemblvep/download/environment.yml b/modules/nf-core/ensemblvep/download/environment.yml new file mode 100644 index 00000000..c73d7e1e --- /dev/null +++ b/modules/nf-core/ensemblvep/download/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ensembl-vep=115 diff --git a/modules/nf-core/ensemblvep/download/main.nf b/modules/nf-core/ensemblvep/download/main.nf new file mode 100644 index 00000000..714d7088 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/main.nf @@ -0,0 +1,47 @@ +process ENSEMBLVEP_DOWNLOAD { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f1/f1872dbae2edaae3b7591ac2769efb2de3969adb34752a3ce7cdc9a1409640bb/data' + : 'community.wave.seqera.io/library/ensembl-vep:115--3f10c53a4cdeedf2'}" + + input: + tuple val(meta), val(assembly), val(species), val(cache_version) + + output: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: 'vep_cache' + """ + vep_install \\ + --CACHEDIR ${prefix} \\ + --SPECIES ${species} \\ + --ASSEMBLY ${assembly} \\ + --CACHE_VERSION ${cache_version} \\ + ${args} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: 'vep_cache' + """ + mkdir ${prefix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/ensemblvep/download/meta.yml b/modules/nf-core/ensemblvep/download/meta.yml new file mode 100644 index 00000000..df7cf260 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/meta.yml @@ -0,0 +1,57 @@ +name: ensemblvep_download +description: Ensembl Variant Effect Predictor (VEP). The cache downloading options + are controlled through `task.ext.args`. +keywords: + - annotation + - cache + - download +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - assembly: + type: string + description: | + Genome assembly + - species: + type: string + description: | + Specie + - cache_version: + type: string + description: | + cache version +output: + cache: + - - meta: + type: file + description: cache + pattern: "*" + ontologies: [] + - prefix: + type: file + description: cache + pattern: "*" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@maxulysse" +maintainers: + - "@maxulysse" diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test b/modules/nf-core/ensemblvep/download/tests/main.nf.test new file mode 100644 index 00000000..496dbeca --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process ENSEMBLVEP_DOWNLOAD" + script "../main.nf" + process "ENSEMBLVEP_DOWNLOAD" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "ensemblvep" + tag "ensemblvep/download" + + test("celegans - download") { + + when { + process { + """ + input[0] = Channel.of([ + [id:"115_WBcel235"], + params.vep_genome, + params.vep_species, + params.vep_cache_version + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + } + + test("celegans - download - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [id:"115_WBcel235"], + params.vep_genome, + params.vep_species, + params.vep_cache_version + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap new file mode 100644 index 00000000..2f7c7aed --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap @@ -0,0 +1,322 @@ +{ + "celegans - download": { + "content": [ + { + "0": [ + [ + { + "id": "115_WBcel235" + }, + [ + [ + [ + [ + "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", + "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", + "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", + "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", + "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", + "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", + "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", + "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", + "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", + "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", + "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", + "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", + "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", + "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", + "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", + "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + ], + [ + "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", + "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", + "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", + "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", + "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", + "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", + "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", + "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", + "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", + "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", + "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", + "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", + "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", + "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", + "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", + "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + ], + [ + "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", + "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", + "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", + "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", + "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", + "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", + "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", + "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", + "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", + "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", + "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", + "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", + "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", + "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + ], + [ + "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", + "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", + "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", + "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", + "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", + "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", + "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", + "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", + "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", + "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", + "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", + "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", + "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", + "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", + "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", + "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", + "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", + "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + ], + [ + "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + ], + [ + "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", + "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", + "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", + "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", + "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", + "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", + "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", + "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", + "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", + "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", + "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", + "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", + "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", + "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", + "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", + "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", + "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", + "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", + "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", + "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", + "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + ], + [ + "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", + "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", + "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", + "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", + "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", + "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", + "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", + "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", + "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", + "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", + "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", + "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", + "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", + "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", + "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", + "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", + "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", + "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + ], + "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "info.txt:md5,33ccb74a030a9a345051628c337cb8af" + ] + ] + ] + ] + ], + "1": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ], + "cache": [ + [ + { + "id": "115_WBcel235" + }, + [ + [ + [ + [ + "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", + "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", + "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", + "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", + "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", + "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", + "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", + "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", + "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", + "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", + "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", + "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", + "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", + "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", + "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", + "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + ], + [ + "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", + "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", + "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", + "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", + "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", + "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", + "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", + "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", + "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", + "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", + "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", + "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", + "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", + "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", + "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", + "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + ], + [ + "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", + "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", + "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", + "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", + "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", + "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", + "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", + "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", + "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", + "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", + "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", + "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", + "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", + "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + ], + [ + "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", + "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", + "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", + "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", + "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", + "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", + "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", + "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", + "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", + "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", + "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", + "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", + "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", + "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", + "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", + "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", + "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", + "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + ], + [ + "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + ], + [ + "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", + "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", + "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", + "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", + "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", + "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", + "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", + "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", + "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", + "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", + "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", + "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", + "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", + "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", + "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", + "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", + "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", + "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", + "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", + "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", + "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + ], + [ + "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", + "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", + "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", + "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", + "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", + "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", + "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", + "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", + "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", + "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", + "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", + "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", + "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", + "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", + "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", + "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", + "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", + "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + ], + "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "info.txt:md5,33ccb74a030a9a345051628c337cb8af" + ] + ] + ] + ] + ], + "versions": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-04T10:00:46.010443" + }, + "celegans - download - stub": { + "content": [ + { + "0": [ + [ + { + "id": "115_WBcel235" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ], + "cache": [ + [ + { + "id": "115_WBcel235" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-04T10:00:57.964733" + } +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/download/tests/nextflow.config b/modules/nf-core/ensemblvep/download/tests/nextflow.config new file mode 100644 index 00000000..49485470 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/nextflow.config @@ -0,0 +1,12 @@ +params { + vep_cache_version = "114" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" +} + +process { + withName: ENSEMBLVEP_DOWNLOAD { + ext.args = '--AUTO c --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' + ext.prefix = { "${params.vep_cache_version}_${params.vep_genome}" } + } +} diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff new file mode 100644 index 00000000..659e2264 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -0,0 +1,131 @@ +Changes in component 'nf-core/ensemblvep/vep' +'modules/nf-core/ensemblvep/vep/meta.yml' is unchanged +Changes in 'ensemblvep/vep/main.nf': +--- modules/nf-core/ensemblvep/vep/main.nf ++++ modules/nf-core/ensemblvep/vep/main.nf +@@ -1,11 +1,11 @@ + process ENSEMBLVEP_VEP { + tag "${meta.id}" +- label 'process_medium' ++ label 'process_very_high' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container +- ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4b/4b5a8c173dc9beaa93effec76b99687fc926b1bd7be47df5d6ce19d7d6b4d6b7/data' +- : 'community.wave.seqera.io/library/ensembl-vep:115.2--90ec797ecb088e9a'}" ++ ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' ++ : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" + + input: + tuple val(meta), path(vcf), path(custom_extra_files) +@@ -15,6 +15,8 @@ + path cache + tuple val(meta2), path(fasta) + path extra_files ++ path custom_vep ++ path custom_vep_tbi + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true +@@ -36,6 +38,7 @@ + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta ${fasta}" : "" + def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" ++ args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") + """ + vep \\ + -i ${vcf} \\ + +Changes in 'ensemblvep/vep/environment.yml': +--- modules/nf-core/ensemblvep/vep/environment.yml ++++ modules/nf-core/ensemblvep/vep/environment.yml +@@ -4,5 +4,4 @@ + - conda-forge + - bioconda + dependencies: +- # renovate: datasource=conda depName=bioconda/ensembl-vep +- - bioconda::ensembl-vep=115.2=pl5321h2a3209d_1 ++ - bioconda::ensembl-vep=114.2 + +Changes in 'ensemblvep/vep/tests/main.nf.test': +--- modules/nf-core/ensemblvep/vep/tests/main.nf.test ++++ modules/nf-core/ensemblvep/vep/tests/main.nf.test +@@ -16,7 +16,7 @@ + when { + process { + """ +- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() ++ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map +@@ -55,7 +55,7 @@ + when { + process { + """ +- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() ++ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map +@@ -79,7 +79,7 @@ + assert process.success + assertAll( + { assert snapshot(process.out.versions).match() }, +- { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v115.2") } ++ { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } + ) + } + } + +'modules/nf-core/ensemblvep/vep/tests/vcf.config' is unchanged +'modules/nf-core/ensemblvep/vep/tests/tab.gz.config' is unchanged +Changes in 'ensemblvep/vep/tests/main.nf.test.snap': +--- modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap ++++ modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap +@@ -2,27 +2,27 @@ + "test_ensemblvep_vep_fasta_tab_gz": { + "content": [ + [ +- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" ++ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ] + ], + "meta": { + "nf-test": "0.9.2", +- "nextflow": "25.04.7" ++ "nextflow": "25.04.6" + }, +- "timestamp": "2025-09-29T10:00:37.755173" ++ "timestamp": "2025-08-21T13:16:46.760065318" + }, + "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { + "content": [ + [ +- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" ++ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ], + "d41d8cd98f00b204e9800998ecf8427e", + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.9.2", +- "nextflow": "25.04.7" ++ "nextflow": "25.04.6" + }, +- "timestamp": "2025-09-29T10:00:03.682447" ++ "timestamp": "2025-08-21T13:16:00.65871573" + } + } +Changes in 'ensemblvep/vep/tests/nextflow.config': +--- modules/nf-core/ensemblvep/vep/tests/nextflow.config ++++ modules/nf-core/ensemblvep/vep/tests/nextflow.config +@@ -1,5 +1,5 @@ + params { +- vep_cache_version = "115" ++ vep_cache_version = "113" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + } + +************************************************************ diff --git a/modules/nf-core/ensemblvep/vep/environment.yml b/modules/nf-core/ensemblvep/vep/environment.yml new file mode 100644 index 00000000..d8e22f70 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ensembl-vep=114.2 diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf new file mode 100644 index 00000000..9daaadab --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -0,0 +1,80 @@ +process ENSEMBLVEP_VEP { + tag "${meta.id}" + label 'process_very_high' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' + : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" + + input: + tuple val(meta), path(vcf), path(custom_extra_files) + val genome + val species + val cache_version + path cache + tuple val(meta2), path(fasta) + path extra_files + path custom_vep + path custom_vep_tbi + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' + def compress_cmd = args.contains("--compress_output") ? '' : '--compress_output bgzip' + def prefix = task.ext.prefix ?: "${meta.id}" + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta ${fasta}" : "" + def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" + args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") + """ + vep \\ + -i ${vcf} \\ + -o ${prefix}.${file_extension}.gz \\ + ${args} \\ + ${compress_cmd} \\ + ${reference} \\ + --assembly ${genome} \\ + --species ${species} \\ + --cache \\ + --cache_version ${cache_version} \\ + --dir_cache ${dir_cache} \\ + --fork ${task.cpus} + + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' + def create_index = file_extension == "vcf" ? "touch ${prefix}.${file_extension}.gz.tbi" : "" + """ + echo "" | gzip > ${prefix}.${file_extension}.gz + ${create_index} + touch ${prefix}_summary.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/ensemblvep/vep/meta.yml b/modules/nf-core/ensemblvep/vep/meta.yml new file mode 100644 index 00000000..7d91a7d0 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/meta.yml @@ -0,0 +1,136 @@ +name: ensemblvep_vep +description: Ensembl Variant Effect Predictor (VEP). The output-file-format is controlled + through `task.ext.args`. +keywords: + - annotation + - vcf + - json + - tab +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + vcf to annotate + ontologies: [] + - custom_extra_files: + type: file + description: | + extra sample-specific files to be used with the `--custom` flag to be configured with ext.args + (optional) + ontologies: [] + - genome: + type: string + description: | + which genome to annotate with + - species: + type: string + description: | + which species to annotate with + - cache_version: + type: integer + description: | + which version of the cache to annotate with + - cache: + type: file + description: | + path to VEP cache (optional) + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing fasta reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: | + reference FASTA file (optional) + pattern: "*.{fasta,fa}" + ontologies: [] + - extra_files: + type: file + description: | + path to file(s) needed for plugins (optional) + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Map with sample information + - "*.vcf.gz": + type: file + description: | + annotated vcf (optional) + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: + type: map + description: | + Map with sample information + - "*.vcf.gz.tbi": + type: file + description: | + annotated vcf index (optional) + pattern: "*.vcf.gz.tbi" + ontologies: [] + tab: + - - meta: + type: map + description: | + Map with sample information + - "*.tab.gz": + type: file + description: | + tab file with annotated variants (optional) + pattern: "*.ann.tab.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + json: + - - meta: + type: map + description: | + Map with sample information + - "*.json.gz": + type: file + description: | + json file with annotated variants (optional) + pattern: "*.ann.json.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + report: + - "*.html": + type: file + description: VEP report file + pattern: "*.html" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@maxulysse" + - "@matthdsm" + - "@nvnieuwk" +maintainers: + - "@maxulysse" + - "@matthdsm" + - "@nvnieuwk" diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test b/modules/nf-core/ensemblvep/vep/tests/main.nf.test new file mode 100644 index 00000000..4a62ffd5 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test @@ -0,0 +1,86 @@ +nextflow_process { + + name "Test Process ENSEMBLVEP_VEP" + script "../main.nf" + process "ENSEMBLVEP_VEP" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "ensemblvep" + tag "ensemblvep/vep" + + test("test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)") { + config "./vcf.config" + + when { + process { + """ + vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), + [] + ]) + input[1] = params.vep_genome + input[2] = params.vep_species + input[3] = params.vep_cache_version + input[4] = vep_cache + input[5] = Channel.value([ + [id:"fasta"], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[6] = [] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.versions, + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.tbi.get(0).get(1)).name + ).match() } + ) + } + + } + + test("test_ensemblvep_vep_fasta_tab_gz") { + config "./tab.gz.config" + + when { + process { + """ + vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), + [] + ]) + input[1] = params.vep_genome + input[2] = params.vep_species + input[3] = params.vep_cache_version + input[4] = vep_cache + input[5] = Channel.value([ + [id:"fasta"], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[6] = [] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out.versions).match() }, + { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } + ) + } + } +} diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap new file mode 100644 index 00000000..bd80e401 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap @@ -0,0 +1,28 @@ +{ + "test_ensemblvep_vep_fasta_tab_gz": { + "content": [ + [ + "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-21T13:16:46.760065318" + }, + "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { + "content": [ + [ + "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ], + "d41d8cd98f00b204e9800998ecf8427e", + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-21T13:16:00.65871573" + } +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/tests/nextflow.config b/modules/nf-core/ensemblvep/vep/tests/nextflow.config new file mode 100644 index 00000000..f1f66774 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/nextflow.config @@ -0,0 +1,5 @@ +params { + vep_cache_version = "113" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" +} diff --git a/modules/nf-core/ensemblvep/vep/tests/tab.gz.config b/modules/nf-core/ensemblvep/vep/tests/tab.gz.config new file mode 100644 index 00000000..40eb03e5 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/tab.gz.config @@ -0,0 +1,5 @@ +process { + withName: ENSEMBLVEP_VEP { + ext.args = '--tab --compress_output bgzip' + } +} diff --git a/modules/nf-core/ensemblvep/vep/tests/vcf.config b/modules/nf-core/ensemblvep/vep/tests/vcf.config new file mode 100644 index 00000000..ad8955a3 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/vcf.config @@ -0,0 +1,5 @@ +process { + withName: ENSEMBLVEP_VEP { + ext.args = '--vcf' + } +} diff --git a/modules/nf-core/longphase/haplotag/environment.yml b/modules/nf-core/longphase/haplotag/environment.yml new file mode 100644 index 00000000..65c58ba3 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::longphase=1.7.3 diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf new file mode 100644 index 00000000..86ba0592 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -0,0 +1,66 @@ +process LONGPHASE_HAPLOTAG { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/longphase:1.7.3--hf5e1c6e_0': + 'biocontainers/longphase:1.7.3--hf5e1c6e_0' }" + + input: + tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + + """ + longphase \\ + haplotag \\ + $args \\ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ + --snp-file ${snps} \\ + --bam ${bam} \\ + ${sv_file} \\ + ${mod_file} + + if [ -f "${prefix}.out" ]; then + mv ${prefix}.out ${prefix}.log + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = args.contains('--cram') ? "cram" : "bam" + def log = args.contains('--log') ? "touch ${prefix}.log" : '' + """ + touch ${prefix}.${suffix} + ${log} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/longphase/haplotag/meta.yml b/modules/nf-core/longphase/haplotag/meta.yml new file mode 100644 index 00000000..63368b31 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/meta.yml @@ -0,0 +1,105 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "longphase_haplotag" +description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, + small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +keywords: + - haplotag + - long-read + - genomics +tools: + - "longphase": + description: "LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms." + homepage: "https://github.com/twolinin/longphase" + documentation: "https://github.com/twolinin/longphase" + tool_dev_url: "https://github.com/twolinin/longphase" + doi: "10.1093/bioinformatics/btac058" + licence: ["GPL v3"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + ontologies: [] + - bai: + type: file + description: Index of sorted BAM/CRAM file + pattern: "*.{bai,crai,csi}" + ontologies: [] + - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - svs: + type: file + description: VCF file with SVs + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - mods: + type: file + description: modcall-generated VCF with modifications + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fai: + type: file + description: Reference fai index + pattern: "*.fai" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.{bam,cram}": + type: file + description: BAM file with haplotagged reads + pattern: "*.bam" + ontologies: [] + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.log": + type: file + description: Log file + pattern: "*.log" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test b/modules/nf-core/longphase/haplotag/tests/main.nf.test new file mode 100644 index 00000000..c80133c6 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test @@ -0,0 +1,202 @@ +nextflow_process { + + name "Test Process LONGPHASE_HAPLOTAG" + script "../main.nf" + process "LONGPHASE_HAPLOTAG" + + tag "modules" + tag "modules_nfcore" + tag "longphase" + tag "longphase/haplotag" + + test("[ bam, bai, snps, [], [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), + bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - log & cram") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + process.out.log, + bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getHeader()[2..5], + bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), + bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai -stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - log & cram -stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap new file mode 100644 index 00000000..3cf35dc3 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap @@ -0,0 +1,159 @@ +{ + "[ bam, bai, snps, [], [] ], fasta, fai - log & cram -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + "bam": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-08-09T09:40:30.738831707" + }, + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:chr22\tLN:40001", + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:12:34.848038423" + }, + "[ bam, bai, snps, [], [] ], fasta, fai -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-08-09T09:40:20.836809553" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:chr22\tLN:40001", + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:39:33.50395694" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - log & cram": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + [ + { + "id": "test" + }, + "test.log:md5,6203f10696f4b0909f0d327c021df773" + ] + ], + [ + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:45:54.254102844" + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/haplotag/tests/nextflow.config b/modules/nf-core/longphase/haplotag/tests/nextflow.config new file mode 100644 index 00000000..d50498b2 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'LONGPHASE_HAPLOTAG' { + ext.args = '--log --cram' + } +} diff --git a/modules/nf-core/longphase/phase/environment.yml b/modules/nf-core/longphase/phase/environment.yml new file mode 100644 index 00000000..068a22cd --- /dev/null +++ b/modules/nf-core/longphase/phase/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::htslib=1.20 + - bioconda::longphase=1.7.3 diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff new file mode 100644 index 00000000..1e9d2652 --- /dev/null +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -0,0 +1,492 @@ +Changes in component 'nf-core/longphase/phase' +Changes in 'longphase/phase/meta.yml': +--- modules/nf-core/longphase/phase/meta.yml ++++ modules/nf-core/longphase/phase/meta.yml +@@ -34,7 +34,7 @@ + description: Index of sorted BAM/CRAM file(s) + pattern: "*.{bai,crai,csi}" + ontologies: [] +- - snvs: ++ - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" +@@ -70,39 +70,15 @@ + pattern: "*.fai" + ontologies: [] + output: +- snv_vcf: ++ vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}.vcf.gz": ++ - "*.vcf.gz": + type: file +- description: Compressed VCF file with phased SNVs and indels +- pattern: "*.vcf.gz" +- ontologies: +- - edam: http://edamontology.org/format_3989 # GZIP format +- sv_vcf: +- - - meta: +- type: map +- description: | +- Groovy Map containing sample information +- e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}_SV.vcf.gz": +- type: file +- description: Compressed VCF file with phased SVs +- pattern: "*_SV.vcf.gz" +- ontologies: +- - edam: http://edamontology.org/format_3989 # GZIP format +- mod_vcf: +- - - meta: +- type: map +- description: | +- Groovy Map containing sample information +- e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}_mod.vcf.gz": +- type: file +- description: Compressed VCF file with phased modifications ++ description: Compressed VCF file with phased variants + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + +Changes in 'longphase/phase/main.nf': +--- modules/nf-core/longphase/phase/main.nf ++++ modules/nf-core/longphase/phase/main.nf +@@ -4,20 +4,19 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': +- 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': ++ 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" + + input: +- tuple val(meta), path(bam), path(bai), path(snvs), path(svs), path(mods) ++ tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: +- tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf +- tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true +- tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true +- path "versions.yml" , emit: versions ++ tuple val(meta), path("*.vcf.gz") , emit: vcf ++ tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi ++ path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when +@@ -25,7 +24,7 @@ + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' +- prefix = task.ext.prefix ?: "${meta.id}" ++ def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + def bams = bam.collectMany { file -> ["-b", file] }.join(" ") +@@ -36,7 +35,7 @@ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ +- --snp-file ${snvs} \\ ++ --snp-file ${snps} \\ + ${bams} \\ + ${sv_file} \\ + ${mod_file} \\ +@@ -44,7 +43,9 @@ + bgzip \\ + --threads $task.cpus \\ + $args2 \\ +- ${prefix}*.vcf ++ ${prefix}.vcf ++ ++ tabix -p vcf ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +@@ -54,15 +55,10 @@ + + stub: + def args = task.ext.args ?: '' +- prefix = task.ext.prefix ?: "${meta.id}" +- def sv_command = svs ? "echo '' | bgzip -c > ${prefix}_SV.vcf.gz" : "" +- def mod_command = mods ? "echo '' | bgzip -c > ${prefix}_mod.vcf.gz" : "" ++ def prefix = task.ext.prefix ?: "${meta.id}" + """ +- echo $args + echo "" | bgzip -c > ${prefix}.vcf.gz +- +- $sv_command +- $mod_command ++ echo "" > ${prefix}.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + +Changes in 'longphase/phase/environment.yml': +--- modules/nf-core/longphase/phase/environment.yml ++++ modules/nf-core/longphase/phase/environment.yml +@@ -5,5 +5,5 @@ + - bioconda + + dependencies: +- - bioconda::htslib=1.22.1 +- - bioconda::longphase=2.0 ++ - bioconda::htslib=1.20 ++ - bioconda::longphase=1.7.3 + +Changes in 'longphase/phase/tests/main.nf.test': +--- modules/nf-core/longphase/phase/tests/main.nf.test ++++ modules/nf-core/longphase/phase/tests/main.nf.test +@@ -44,7 +44,7 @@ + + } + +- test("[ bam, bai, snps, svs, [] ], fasta, fai") { ++test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { +@@ -78,7 +78,7 @@ + + } + +- test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { ++test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { + + when { + process { +@@ -154,38 +154,4 @@ + + } + +- test("[ bam, bai, snps, svs, [] ], fasta, fai - stub") { +- options "-stub" +- +- when { +- process { +- """ +- input[0] = [ +- [ id:'test' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), +- [] +- ] +- input[1] = [ +- [ id:'reference' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) +- ] +- input[2] = [ +- [ id:'reference' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) +- ] +- """ +- } +- } +- +- then { +- assertAll( +- { assert process.success }, +- { assert snapshot(process.out).match() } +- ) +- } +- +- } + } + +Changes in 'longphase/phase/tests/main.nf.test.snap': +--- modules/nf-core/longphase/phase/tests/main.nf.test.snap ++++ modules/nf-core/longphase/phase/tests/main.nf.test.snap +@@ -1,59 +1,4 @@ + { +- "[ bam, bai, snps, svs, [] ], fasta, fai - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" +- }, +- "timestamp": "2025-11-06T16:06:24.025191062" +- }, + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + { +@@ -62,42 +7,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ++ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "1": [ +- ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ ++ "vcf": [ + [ + { + "id": "test" + }, +- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ++ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], +- "sv_vcf": [ +- +- ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.8.4", ++ "nextflow": "24.04.2" + }, +- "timestamp": "2025-11-06T16:05:57.029934447" ++ "timestamp": "2024-07-22T12:14:04.269956432" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ +@@ -107,52 +40,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" ++ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "1": [ ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" ++ ], ++ "vcf": [ + [ + { + "id": "test" + }, +- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" ++ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.9.0", ++ "nextflow": "24.04.4" + }, +- "timestamp": "2025-11-06T16:06:03.319855838" ++ "timestamp": "2024-10-04T13:37:16.921910004" + }, + "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { + "content": [ +@@ -162,52 +73,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" ++ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "1": [ ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" ++ ], ++ "vcf": [ + [ + { + "id": "test" + }, +- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" ++ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.9.0", ++ "nextflow": "24.04.4" + }, +- "timestamp": "2025-11-06T16:06:10.867281359" ++ "timestamp": "2024-10-04T13:37:23.41768963" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - stub": { + "content": [ +@@ -221,18 +110,9 @@ + ] + ], + "1": [ +- ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ ++ "vcf": [ + [ + { + "id": "test" +@@ -240,18 +120,15 @@ + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], +- "sv_vcf": [ +- +- ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.8.4", ++ "nextflow": "24.04.2" + }, +- "timestamp": "2025-11-06T16:06:17.992733472" ++ "timestamp": "2024-07-22T12:15:40.296227382" + } + } +'modules/nf-core/longphase/phase/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf new file mode 100644 index 00000000..f8351afd --- /dev/null +++ b/modules/nf-core/longphase/phase/main.nf @@ -0,0 +1,68 @@ +process LONGPHASE_PHASE { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': + 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" + + input: + tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + def bams = bam.collectMany { file -> ["-b", file] }.join(" ") + """ + longphase \\ + phase \\ + $args \\ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ + --snp-file ${snps} \\ + ${bams} \\ + ${sv_file} \\ + ${mod_file} \\ + + bgzip \\ + --threads $task.cpus \\ + $args2 \\ + ${prefix}.vcf + + tabix -p vcf ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | bgzip -c > ${prefix}.vcf.gz + echo "" > ${prefix}.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/longphase/phase/meta.yml b/modules/nf-core/longphase/phase/meta.yml new file mode 100644 index 00000000..93963d58 --- /dev/null +++ b/modules/nf-core/longphase/phase/meta.yml @@ -0,0 +1,95 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "longphase_phase" +description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, + small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +keywords: + - phase + - long-read + - genomics +tools: + - "longphase": + description: "LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms." + homepage: "https://github.com/twolinin/longphase" + documentation: "https://github.com/twolinin/longphase" + tool_dev_url: "https://github.com/twolinin/longphase" + doi: "10.1093/bioinformatics/btac058" + licence: ["GPL v3"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file(s) + pattern: "*.{bam,cram}" + ontologies: [] + - bai: + type: file + description: Index of sorted BAM/CRAM file(s) + pattern: "*.{bai,crai,csi}" + ontologies: [] + - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - svs: + type: file + description: VCF file with SVs + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - mods: + type: file + description: modcall-generated VCF with modifications + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fai: + type: file + description: Reference fai index + pattern: "*.fai" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.vcf.gz": + type: file + description: Compressed VCF file with phased variants + pattern: "*.vcf.gz" + 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: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test b/modules/nf-core/longphase/phase/tests/main.nf.test new file mode 100644 index 00000000..3e303312 --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/main.nf.test @@ -0,0 +1,157 @@ +nextflow_process { + + name "Test Process LONGPHASE_PHASE" + script "../main.nf" + process "LONGPHASE_PHASE" + + tag "modules" + tag "modules_nfcore" + tag "longphase" + tag "longphase/phase" + config "./nextflow.config" + + test("[ bam, bai, snps, [], [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true) + ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test.snap b/modules/nf-core/longphase/phase/tests/main.nf.test.snap new file mode 100644 index 00000000..8a38c1ca --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/main.nf.test.snap @@ -0,0 +1,134 @@ +{ + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T12:14:04.269956432" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:37:16.921910004" + }, + "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:37:23.41768963" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T12:15:40.296227382" + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/tests/nextflow.config b/modules/nf-core/longphase/phase/tests/nextflow.config new file mode 100644 index 00000000..317f040a --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'LONGPHASE_PHASE' { + ext.args = '--ont' + } +} diff --git a/modules/nf-core/minimap2/align/environment.yml b/modules/nf-core/minimap2/align/environment.yml new file mode 100644 index 00000000..17886061 --- /dev/null +++ b/modules/nf-core/minimap2/align/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::minimap2=2.29 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf new file mode 100644 index 00000000..453d4566 --- /dev/null +++ b/modules/nf-core/minimap2/align/main.nf @@ -0,0 +1,78 @@ +process MINIMAP2_ALIGN { + tag "$meta.id" + label 'process_very_high' + + // Note: the versions here need to match the versions used in the mulled container below and minimap2/index + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/66/66dc96eff11ab80dfd5c044e9b3425f52d818847b9c074794cf0c02bfa781661/data' : + 'community.wave.seqera.io/library/minimap2_samtools:33bb43c18d22e29c' }" + + input: + tuple val(meta), path(reads) + tuple val(meta2), path(reference) + val bam_format + val bam_index_extension + val cigar_paf_format + val cigar_bam + + output: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def args4 = task.ext.args4 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def bam_index = bam_index_extension ? "${prefix}.bam##idx##${prefix}.bam.${bam_index_extension} --write-index" : "${prefix}.bam" + def bam_output = bam_format ? "-a | samtools sort -@ ${task.cpus-1} -o ${bam_index} ${args2}" : "-o ${prefix}.paf" + def cigar_paf = cigar_paf_format && !bam_format ? "-c" : '' + def set_cigar_bam = cigar_bam && bam_format ? "-L" : '' + def bam_input = "${reads.extension}".matches('sam|bam|cram') + def samtools_reset_fastq = bam_input ? "samtools reset --threads ${task.cpus-1} $args3 $reads | samtools fastq --threads ${task.cpus-1} $args4 |" : '' + def query = bam_input ? "-" : reads + def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) + + """ + $samtools_reset_fastq \\ + minimap2 \\ + $args \\ + -t $task.cpus \\ + $target \\ + $query \\ + $cigar_paf \\ + $set_cigar_bam \\ + $bam_output + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def output_file = bam_format ? "${prefix}.bam" : "${prefix}.paf" + def bam_index = bam_index_extension ? "touch ${prefix}.bam.${bam_index_extension}" : "" + def bam_input = "${reads.extension}".matches('sam|bam|cram') + def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) + + """ + touch $output_file + ${bam_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ +} diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml new file mode 100644 index 00000000..b501526e --- /dev/null +++ b/modules/nf-core/minimap2/align/meta.yml @@ -0,0 +1,106 @@ +name: minimap2_align +description: A versatile pairwise aligner for genomic and spliced nucleotide sequences +keywords: + - align + - fasta + - fastq + - genome + - paf + - reference +tools: + - minimap2: + description: | + A versatile pairwise aligner for genomic and spliced nucleotide sequences. + homepage: https://github.com/lh3/minimap2 + documentation: https://github.com/lh3/minimap2#uguide + licence: ["MIT"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FASTA or FASTQ files of size 1 and 2 for single-end + and paired-end data, respectively. + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test_ref'] + - reference: + type: file + description: | + Reference database in FASTA format. + ontologies: [] + - bam_format: + type: boolean + description: Specify that output should be in BAM format + - bam_index_extension: + type: string + description: BAM alignment index extension (e.g. "bai") + - cigar_paf_format: + type: boolean + description: Specify that output CIGAR should be in PAF format + - cigar_bam: + type: boolean + description: | + Write CIGAR with >65535 ops at the CG tag. This is recommended when + doing XYZ (https://github.com/lh3/minimap2#working-with-65535-cigar-operations) +output: + paf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.paf": + type: file + description: Alignment in PAF format + pattern: "*.paf" + ontologies: [] + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: Alignment in BAM format + pattern: "*.bam" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam.${bam_index_extension}": + type: file + description: BAM alignment index + pattern: "*.bam.*" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@heuermh" + - "@sofstam" + - "@sateeshperi" + - "@jfy133" + - "@fellen31" +maintainers: + - "@heuermh" + - "@sofstam" + - "@sateeshperi" + - "@jfy133" + - "@fellen31" diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test b/modules/nf-core/minimap2/align/tests/main.nf.test new file mode 100644 index 00000000..4072c171 --- /dev/null +++ b/modules/nf-core/minimap2/align/tests/main.nf.test @@ -0,0 +1,441 @@ +nextflow_process { + + name "Test Process MINIMAP2_ALIGN" + script "../main.nf" + process "MINIMAP2_ALIGN" + + tag "modules" + tag "modules_nfcore" + tag "minimap2" + tag "minimap2/align" + + test("sarscov2 - fastq, fasta, true, [], false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, 'bai', false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + file(process.out.index[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], fasta, true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, [], true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, [], false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, 'bai', false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + file(process.out.index[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, [], true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, 'bai', false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, false, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = false + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, 'bai', false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, [], true, false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test.snap b/modules/nf-core/minimap2/align/tests/main.nf.test.snap new file mode 100644 index 00000000..89f20336 --- /dev/null +++ b/modules/nf-core/minimap2/align/tests/main.nf.test.snap @@ -0,0 +1,476 @@ +{ + "sarscov2 - bam, fasta, true, 'bai', false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + ], + "5d426b9a5f5b2c54f1d7f1e4c238ae94", + "test.bam.bai", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:23.829797899" + }, + "sarscov2 - bam, fasta, true, 'bai', false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:54.665655242" + }, + "sarscov2 - fastq, fasta, true, 'bai', false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:38.492212433" + }, + "sarscov2 - fastq, fasta, false, [], false, false - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.paf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ], + "bam": [ + + ], + "index": [ + + ], + "paf": [ + [ + { + "id": "test", + "single_end": true + }, + "test.paf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:43.879647142" + }, + "sarscov2 - fastq, fasta, true, [], false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:33.262333471" + }, + "sarscov2 - [fastq1, fastq2], fasta, true, false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz test_2.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" + ], + "1bc392244f228bf52cf0b5a8f6a654c9", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:07.571731983" + }, + "sarscov2 - fastq, fasta, true, [], false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" + ], + "f194745c0ccfcb2a9c0aee094a08750", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:47:56.497792473" + }, + "sarscov2 - fastq, fasta, true, 'bai', false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + ], + "f194745c0ccfcb2a9c0aee094a08750", + "test.bam.bai", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:01.888544427" + }, + "sarscov2 - bam, fasta, true, [], false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" + ], + "5d426b9a5f5b2c54f1d7f1e4c238ae94", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:18.376062313" + }, + "sarscov2 - bam, fasta, true, [], false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:49.268693724" + }, + "sarscov2 - fastq, [], true, false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:ERR5069949.2151832\tLN:150", + "@SQ\tSN:ERR5069949.576388\tLN:77", + "@SQ\tSN:ERR5069949.501486\tLN:146", + "@SQ\tSN:ERR5069949.1331889\tLN:132", + "@SQ\tSN:ERR5069949.2161340\tLN:80", + "@SQ\tSN:ERR5069949.973930\tLN:79", + "@SQ\tSN:ERR5069949.2417063\tLN:150", + "@SQ\tSN:ERR5069949.376959\tLN:151", + "@SQ\tSN:ERR5069949.1088785\tLN:149", + "@SQ\tSN:ERR5069949.1066259\tLN:147", + "@SQ\tSN:ERR5069949.2832676\tLN:139", + "@SQ\tSN:ERR5069949.2953930\tLN:151", + "@SQ\tSN:ERR5069949.324865\tLN:151", + "@SQ\tSN:ERR5069949.2185111\tLN:150", + "@SQ\tSN:ERR5069949.937422\tLN:151", + "@SQ\tSN:ERR5069949.2431709\tLN:150", + "@SQ\tSN:ERR5069949.1246538\tLN:148", + "@SQ\tSN:ERR5069949.1189252\tLN:98", + "@SQ\tSN:ERR5069949.2216307\tLN:147", + "@SQ\tSN:ERR5069949.3273002\tLN:148", + "@SQ\tSN:ERR5069949.3277445\tLN:151", + "@SQ\tSN:ERR5069949.3022231\tLN:147", + "@SQ\tSN:ERR5069949.184542\tLN:151", + "@SQ\tSN:ERR5069949.540529\tLN:149", + "@SQ\tSN:ERR5069949.686090\tLN:150", + "@SQ\tSN:ERR5069949.2787556\tLN:106", + "@SQ\tSN:ERR5069949.2650879\tLN:150", + "@SQ\tSN:ERR5069949.2064910\tLN:149", + "@SQ\tSN:ERR5069949.2328704\tLN:150", + "@SQ\tSN:ERR5069949.1067032\tLN:150", + "@SQ\tSN:ERR5069949.3338256\tLN:151", + "@SQ\tSN:ERR5069949.1412839\tLN:147", + "@SQ\tSN:ERR5069949.1538968\tLN:150", + "@SQ\tSN:ERR5069949.147998\tLN:94", + "@SQ\tSN:ERR5069949.366975\tLN:106", + "@SQ\tSN:ERR5069949.1372331\tLN:151", + "@SQ\tSN:ERR5069949.1709367\tLN:129", + "@SQ\tSN:ERR5069949.2388984\tLN:150", + "@SQ\tSN:ERR5069949.1132353\tLN:150", + "@SQ\tSN:ERR5069949.1151736\tLN:151", + "@SQ\tSN:ERR5069949.479807\tLN:150", + "@SQ\tSN:ERR5069949.2176303\tLN:151", + "@SQ\tSN:ERR5069949.2772897\tLN:151", + "@SQ\tSN:ERR5069949.1020777\tLN:122", + "@SQ\tSN:ERR5069949.465452\tLN:151", + "@SQ\tSN:ERR5069949.1704586\tLN:149", + "@SQ\tSN:ERR5069949.1258508\tLN:151", + "@SQ\tSN:ERR5069949.986441\tLN:119", + "@SQ\tSN:ERR5069949.2674295\tLN:148", + "@SQ\tSN:ERR5069949.885966\tLN:79", + "@SQ\tSN:ERR5069949.2342766\tLN:151", + "@SQ\tSN:ERR5069949.3122970\tLN:127", + "@SQ\tSN:ERR5069949.3279513\tLN:72", + "@SQ\tSN:ERR5069949.309410\tLN:151", + "@SQ\tSN:ERR5069949.532979\tLN:149", + "@SQ\tSN:ERR5069949.2888794\tLN:151", + "@SQ\tSN:ERR5069949.2205229\tLN:150", + "@SQ\tSN:ERR5069949.786562\tLN:151", + "@SQ\tSN:ERR5069949.919671\tLN:151", + "@SQ\tSN:ERR5069949.1328186\tLN:151", + "@SQ\tSN:ERR5069949.870926\tLN:149", + "@SQ\tSN:ERR5069949.2257580\tLN:151", + "@SQ\tSN:ERR5069949.3249622\tLN:77", + "@SQ\tSN:ERR5069949.611123\tLN:125", + "@SQ\tSN:ERR5069949.651338\tLN:142", + "@SQ\tSN:ERR5069949.169513\tLN:92", + "@SQ\tSN:ERR5069949.155944\tLN:150", + "@SQ\tSN:ERR5069949.2033605\tLN:150", + "@SQ\tSN:ERR5069949.2730382\tLN:142", + "@SQ\tSN:ERR5069949.2125592\tLN:150", + "@SQ\tSN:ERR5069949.1062611\tLN:151", + "@SQ\tSN:ERR5069949.1778133\tLN:151", + "@SQ\tSN:ERR5069949.3057020\tLN:95", + "@SQ\tSN:ERR5069949.2972968\tLN:141", + "@SQ\tSN:ERR5069949.2734474\tLN:149", + "@SQ\tSN:ERR5069949.856527\tLN:151", + "@SQ\tSN:ERR5069949.2098070\tLN:151", + "@SQ\tSN:ERR5069949.1552198\tLN:150", + "@SQ\tSN:ERR5069949.2385514\tLN:150", + "@SQ\tSN:ERR5069949.2270078\tLN:151", + "@SQ\tSN:ERR5069949.114870\tLN:150", + "@SQ\tSN:ERR5069949.2668880\tLN:147", + "@SQ\tSN:ERR5069949.257821\tLN:139", + "@SQ\tSN:ERR5069949.2243023\tLN:150", + "@SQ\tSN:ERR5069949.2605155\tLN:146", + "@SQ\tSN:ERR5069949.1340552\tLN:151", + "@SQ\tSN:ERR5069949.1561137\tLN:150", + "@SQ\tSN:ERR5069949.2361683\tLN:149", + "@SQ\tSN:ERR5069949.2521353\tLN:150", + "@SQ\tSN:ERR5069949.1261808\tLN:149", + "@SQ\tSN:ERR5069949.2734873\tLN:98", + "@SQ\tSN:ERR5069949.3017828\tLN:107", + "@SQ\tSN:ERR5069949.573706\tLN:150", + "@SQ\tSN:ERR5069949.1980512\tLN:151", + "@SQ\tSN:ERR5069949.1014693\tLN:150", + "@SQ\tSN:ERR5069949.3184655\tLN:150", + "@SQ\tSN:ERR5069949.29668\tLN:89", + "@SQ\tSN:ERR5069949.3258358\tLN:151", + "@SQ\tSN:ERR5069949.1476386\tLN:151", + "@SQ\tSN:ERR5069949.2415814\tLN:150", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a test_1.fastq.gz test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" + ], + "16c1c651f8ec67383bcdee3c55aed94f", + [ + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:48:12.942360555" + } +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/environment.yml b/modules/nf-core/minimap2/index/environment.yml new file mode 100644 index 00000000..2f3ba0eb --- /dev/null +++ b/modules/nf-core/minimap2/index/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::minimap2=2.29 diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf new file mode 100644 index 00000000..56cb0efd --- /dev/null +++ b/modules/nf-core/minimap2/index/main.nf @@ -0,0 +1,44 @@ +process MINIMAP2_INDEX { + label 'process_low' + + // Note: the versions here need to match the versions used in minimap2/align + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/minimap2:2.29--h577a1d6_0' : + 'biocontainers/minimap2:2.29--h577a1d6_0' }" + + input: + tuple val(meta), path(fasta) + + output: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + minimap2 \\ + -t $task.cpus \\ + -d ${fasta.baseName}.mmi \\ + $args \\ + $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ + + stub: + """ + touch ${fasta.baseName}.mmi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ +} diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml new file mode 100644 index 00000000..0d6a2d86 --- /dev/null +++ b/modules/nf-core/minimap2/index/meta.yml @@ -0,0 +1,50 @@ +name: minimap2_index +description: Provides fasta index required by minimap2 alignment. +keywords: + - index + - fasta + - reference +tools: + - minimap2: + description: | + A versatile pairwise aligner for genomic and spliced nucleotide sequences. + homepage: https://github.com/lh3/minimap2 + documentation: https://github.com/lh3/minimap2#uguide + licence: ["MIT"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: | + Reference database in FASTA format. + ontologies: [] +output: + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.mmi": + type: file + description: Minimap2 fasta index. + pattern: "*.mmi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@yuukiiwa" + - "@drpatelh" +maintainers: + - "@yuukiiwa" + - "@drpatelh" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test b/modules/nf-core/minimap2/index/tests/main.nf.test new file mode 100644 index 00000000..97840ff7 --- /dev/null +++ b/modules/nf-core/minimap2/index/tests/main.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test Process MINIMAP2_INDEX" + script "../main.nf" + process "MINIMAP2_INDEX" + + tag "modules" + tag "modules_nfcore" + tag "minimap2" + tag "minimap2/index" + + test("minimap2 index") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test.snap b/modules/nf-core/minimap2/index/tests/main.nf.test.snap new file mode 100644 index 00000000..dbb32049 --- /dev/null +++ b/modules/nf-core/minimap2/index/tests/main.nf.test.snap @@ -0,0 +1,35 @@ +{ + "minimap2 index": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "1": [ + "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" + ], + "index": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "versions": [ + "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-22T14:50:37.213379742" + } +} \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/environment.yml b/modules/nf-core/modkit/pileup/environment.yml new file mode 100644 index 00000000..7b7a0ca3 --- /dev/null +++ b/modules/nf-core/modkit/pileup/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - ont-modkit=0.4.4 diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf new file mode 100644 index 00000000..df6ff59d --- /dev/null +++ b/modules/nf-core/modkit/pileup/main.nf @@ -0,0 +1,70 @@ +process MODKIT_PILEUP { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ont-modkit:0.4.4--hcdda2d0_0': + 'biocontainers/ont-modkit:0.4.4--hcdda2d0_0' }" + + input: + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta), path(fai) + tuple val(meta3), path(bed) + + output: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--ref ${fasta}" : "" + def include_bed = bed ? "--include-bed ${bed}" : '' + + """ + modkit \\ + pileup \\ + $args \\ + --threads ${task.cpus} \\ + --prefix ${prefix} \\ + $reference \\ + $include_bed \\ + $bam \\ + ${prefix}.tmp + + if test -d ${prefix}.tmp; then + for file in ${prefix}.tmp/*; do + if test -f \$file; then + mv \$file \$(basename \$file) + fi + done + else + mv ${prefix}.tmp ${prefix}.bed + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + modkit: \$( modkit --version | sed 's/mod_kit //' ) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bed + touch ${prefix}.bedgraph + touch ${prefix}.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + modkit: \$( modkit --version | sed 's/mod_kit //' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modkit/pileup/meta.yml b/modules/nf-core/modkit/pileup/meta.yml new file mode 100644 index 00000000..32aba6ad --- /dev/null +++ b/modules/nf-core/modkit/pileup/meta.yml @@ -0,0 +1,104 @@ +name: modkit_pileup +description: A bioinformatics tool for working with modified bases +keywords: + - methylation + - ont + - long-read +tools: + - "modkit": + description: A bioinformatics tool for working with modified bases in Oxford Nanopore + sequencing data + homepage: https://github.com/nanoporetech/modkit + documentation: https://github.com/nanoporetech/modkit + tool_dev_url: https://github.com/nanoporetech/modkit + licence: ["Oxford Nanopore Technologies PLC. Public License Version 1.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + ontologies: [] + - bai: + type: file + description: Associated index file for BAM + pattern: "*.bai" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference sequence in FASTA format. Required for motif (e.g. CpG) + filtering + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Associated index file for FASTA + pattern: "*.fai" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing BED file information + e.g. `[ id:'regions' ]` + - bed: + type: file + description: BED file that will restrict threshold estimation and pileup results + to positions overlapping intervals in the file + pattern: "*.bed" + ontologies: [] +output: + bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.bed": + type: file + description: bedMethyl output file(s) + pattern: "*.bed" + ontologies: [] + bedgraph: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.bedgraph": + type: file + description: bedgraph output files + pattern: "*.bedgraph" + ontologies: [] + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.log": + type: file + description: File for debug logs to be written to + pattern: "*.log" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@Michal-Babins" + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test b/modules/nf-core/modkit/pileup/tests/main.nf.test new file mode 100644 index 00000000..6ce8dfe2 --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test @@ -0,0 +1,388 @@ +nextflow_process { + + name "Test Process MODKIT_PILEUP" + script "../main.nf" + tag "modules" + tag "modules_nfcore" + tag "modkit" + tag "modkit/pileup" + process "MODKIT_PILEUP" + + test("[bam, bai], [], []") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [[],[],[]] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], []") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional") { + + config "./nextflow.traditional.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional, HP") { + + config "./nextflow.traditional_hp.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph") { + + config "./nextflow.traditional_hp_bedgraph.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [], [] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [[],[],[]] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], [] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional - stub") { + + config "./nextflow.traditional.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional, HP - stub") { + + config "./nextflow.traditional_hp.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub") { + + config "./nextflow.traditional_hp_bedgraph.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap new file mode 100644 index 00000000..af80c6ec --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -0,0 +1,674 @@ +{ + "[bam, bai], [fasta, fai], bed": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:47.27240322" + }, + "[bam, bai], [fasta, fai], [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:14.786526107" + }, + "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + + ], + "bedgraph": [ + [ + { + "id": "test" + }, + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] + ] + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:04.393035124" + }, + "[bam, bai], [fasta, fai], bed - traditional, HP": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:58.76489375" + }, + "[bam, bai], [fasta, fai], []": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:41.559902964" + }, + "[bam, bai], [fasta, fai], bed - traditional, HP - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:31.123304033" + }, + "[bam, bai], [], []": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:35.512266692" + }, + "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:37.027692372" + }, + "[bam, bai], [], [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:09.515064105" + }, + "[bam, bai], [fasta, fai], bed - traditional - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:25.6273826" + }, + "[bam, bai], [fasta, fai], bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:02:20.328195604" + }, + "[bam, bai], [fasta, fai], bed - traditional": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:52.925069493" + } +} \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config new file mode 100644 index 00000000..672598d5 --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional' + } +} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config new file mode 100644 index 00000000..c0e0d79a --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional --partition-tag HP' + } +} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config new file mode 100644 index 00000000..4f456dcd --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional --partition-tag HP --bedgraph' + } +} diff --git a/modules/nf-core/mosdepth/environment.yml b/modules/nf-core/mosdepth/environment.yml new file mode 100644 index 00000000..f871e054 --- /dev/null +++ b/modules/nf-core/mosdepth/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/mosdepth + - mosdepth=0.3.10 diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf new file mode 100644 index 00000000..3bf945f9 --- /dev/null +++ b/modules/nf-core/mosdepth/main.nf @@ -0,0 +1,80 @@ +process MOSDEPTH { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mosdepth:0.3.10--h4e814b3_1' : + 'biocontainers/mosdepth:0.3.10--h4e814b3_1'}" + + input: + tuple val(meta), path(bam), path(bai), path(bed) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--fasta ${fasta}" : "" + def interval = bed ? "--by ${bed}" : "" + if (bed && args.contains("--by")) { + error "'--by' can only be specified once when running mosdepth! Either remove input BED file definition or remove '--by' from 'ext.args' definition" + } + if (!bed && args.contains("--thresholds")) { + error "'--thresholds' can only be specified in conjunction with '--by'" + } + + """ + mosdepth \\ + --threads $task.cpus \\ + $interval \\ + $reference \\ + $args \\ + $prefix \\ + $bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.global.dist.txt + touch ${prefix}.region.dist.txt + touch ${prefix}.summary.txt + touch ${prefix}.per-base.d4 + echo "" | gzip > ${prefix}.per-base.bed.gz + touch ${prefix}.per-base.bed.gz.csi + echo "" | gzip > ${prefix}.regions.bed.gz + touch ${prefix}.regions.bed.gz.csi + echo "" | gzip > ${prefix}.quantized.bed.gz + touch ${prefix}.quantized.bed.gz.csi + echo "" | gzip > ${prefix}.thresholds.bed.gz + touch ${prefix}.thresholds.bed.gz.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml new file mode 100644 index 00000000..af1ea44a --- /dev/null +++ b/modules/nf-core/mosdepth/meta.yml @@ -0,0 +1,197 @@ +name: mosdepth +description: Calculates genome-wide sequencing coverage. +keywords: + - mosdepth + - bam + - cram + - coverage +tools: + - mosdepth: + description: | + Fast BAM/CRAM depth calculation for WGS, exome, or targeted sequencing. + documentation: https://github.com/brentp/mosdepth + doi: 10.1093/bioinformatics/btx699 + licence: ["MIT"] + identifier: biotools:mosdepth +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Input BAM/CRAM file + pattern: "*.{bam,cram}" + ontologies: [] + - bai: + type: file + description: Index for BAM/CRAM file + pattern: "*.{bai,crai}" + ontologies: [] + - bed: + type: file + description: BED file with intersected intervals + pattern: "*.{bed}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing bed information + e.g. [ id:'test' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta}" + ontologies: [] +output: + global_txt: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.global.dist.txt": + type: file + description: Text file with global cumulative coverage distribution + pattern: "*.{global.dist.txt}" + ontologies: [] + summary_txt: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.summary.txt": + type: file + description: Text file with summary mean depths per chromosome and regions + pattern: "*.{summary.txt}" + ontologies: [] + regions_txt: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.region.dist.txt": + type: file + description: Text file with region cumulative coverage distribution + pattern: "*.{region.dist.txt}" + ontologies: [] + per_base_d4: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.d4": + type: file + description: D4 file with per-base coverage + pattern: "*.{per-base.d4}" + ontologies: [] + per_base_bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.bed.gz": + type: file + description: BED file with per-base coverage + pattern: "*.{per-base.bed.gz}" + ontologies: [] + per_base_csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.bed.gz.csi": + type: file + description: Index file for BED file with per-base coverage + pattern: "*.{per-base.bed.gz.csi}" + ontologies: [] + regions_bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.regions.bed.gz": + type: file + description: BED file with per-region coverage + pattern: "*.{regions.bed.gz}" + ontologies: [] + regions_csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.regions.bed.gz.csi": + type: file + description: Index file for BED file with per-region coverage + pattern: "*.{regions.bed.gz.csi}" + ontologies: [] + quantized_bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.quantized.bed.gz": + type: file + description: BED file with binned coverage + pattern: "*.{quantized.bed.gz}" + ontologies: [] + quantized_csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.quantized.bed.gz.csi": + type: file + description: Index file for BED file with binned coverage + pattern: "*.{quantized.bed.gz.csi}" + ontologies: [] + thresholds_bed: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.thresholds.bed.gz": + type: file + description: BED file with the number of bases in each region that are covered + at or above each threshold + pattern: "*.{thresholds.bed.gz}" + ontologies: [] + thresholds_csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.thresholds.bed.gz.csi": + type: file + description: Index file for BED file with threshold coverage + pattern: "*.{thresholds.bed.gz.csi}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" + - "@matthdsm" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/mosdepth/tests/main.nf.test b/modules/nf-core/mosdepth/tests/main.nf.test new file mode 100644 index 00000000..0b3c860d --- /dev/null +++ b/modules/nf-core/mosdepth/tests/main.nf.test @@ -0,0 +1,246 @@ +nextflow_process { + + name "Test Process MOSDEPTH" + script "../main.nf" + process "MOSDEPTH" + + tag "modules" + tag "modules_nfcore" + tag "mosdepth" + + test("homo_sapiens - bam, bai, []") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - cram, crai, []") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - cram, crai, bed") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - window") { + + config "./window.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - quantized") { + + config "./quantized.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed - thresholds") { + + config "./threshold.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed - fail") { + + config "./window.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - stub") { + + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/mosdepth/tests/main.nf.test.snap b/modules/nf-core/mosdepth/tests/main.nf.test.snap new file mode 100644 index 00000000..67e16562 --- /dev/null +++ b/modules/nf-core/mosdepth/tests/main.nf.test.snap @@ -0,0 +1,1386 @@ +{ + "homo_sapiens - bam, bai, [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_base_d4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "quantized_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "quantized_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "thresholds_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "thresholds_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:57:12.350279421" + }, + "homo_sapiens - cram, crai, bed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:12.528228123" + }, + "homo_sapiens - bam, bai, [] - quantized": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,f037c215449d361112efc10108fcc17c" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + ] + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,f037c215449d361112efc10108fcc17c" + ] + ], + "quantized_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + ] + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:38.422491251" + }, + "homo_sapiens - bam, bai, bed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:43.01015749" + }, + "homo_sapiens - bam, bai, [] - window": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,0b6ea9f0da1228252d9aef2d3b6f7f76" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,34f48d16fcdd61e44d812e29e02c77b8" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,34f48d16fcdd61e44d812e29e02c77b8" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,0b6ea9f0da1228252d9aef2d3b6f7f76" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:27.10647246" + }, + "homo_sapiens - bam, bai, []": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:30.449110281" + }, + "homo_sapiens - cram, crai, []": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:55.244274402" + }, + "homo_sapiens - bam, bai, bed - thresholds": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,fe70ae728cd10726c42a2bcd44adfc9d" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + ] + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,fe70ae728cd10726c42a2bcd44adfc9d" + ] + ], + "thresholds_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + ] + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:49.888375978" + } +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/quantized.config b/modules/nf-core/mosdepth/tests/quantized.config new file mode 100644 index 00000000..63c55350 --- /dev/null +++ b/modules/nf-core/mosdepth/tests/quantized.config @@ -0,0 +1,3 @@ +process { + ext.args = "--quantize 0:1:4:100:200" +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/threshold.config b/modules/nf-core/mosdepth/tests/threshold.config new file mode 100644 index 00000000..9b014ddf --- /dev/null +++ b/modules/nf-core/mosdepth/tests/threshold.config @@ -0,0 +1,3 @@ +process { + ext.args = "--thresholds 1,10,20,30" +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/window.config b/modules/nf-core/mosdepth/tests/window.config new file mode 100644 index 00000000..7a0f755c --- /dev/null +++ b/modules/nf-core/mosdepth/tests/window.config @@ -0,0 +1,3 @@ +process { + ext.args = "--by 100" +} \ No newline at end of file diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 6f5b867b..d02016a0 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.25.1 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index cc0643e1..c1158fb0 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.25.1--pyhdfd78af_0' : - 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 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 2fcbb5ff..a88bafd6 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,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:51:46.317523" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:52:20.680978" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:52:09.185842" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/modules/nf-core/pigz/uncompress/main.nf b/modules/nf-core/pigz/uncompress/main.nf new file mode 100644 index 00000000..db712811 --- /dev/null +++ b/modules/nf-core/pigz/uncompress/main.nf @@ -0,0 +1,49 @@ +process PIGZ_UNCOMPRESS { + tag "$meta.id" + label 'process_low' + //stageInMode 'copy' // this directive can be set in case the original input should be kept + + conda "conda-forge::pigz" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pigz:2.8': + 'biocontainers/pigz:2.8' }" + + input: + tuple val(meta), path(zip) + + output: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + uncompressed_filename = zip.toString() - '.gz' + // calling pigz -f to make it follow symlinks + """ + unpigz \\ + -p $task.cpus \\ + -fk \\ + $args \\ + ${zip} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + uncompressed_filename = zip.toString() - '.gz' + """ + touch $uncompressed_filename + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/pigz/uncompress/meta.yml b/modules/nf-core/pigz/uncompress/meta.yml new file mode 100644 index 00000000..cddd0a3b --- /dev/null +++ b/modules/nf-core/pigz/uncompress/meta.yml @@ -0,0 +1,47 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +name: "pigz_uncompress" +description: write your description here +keywords: + - uncompress + - gzip + - parallelized +tools: + - "pigz": + description: "Parallel implementation of the gzip algorithm." + homepage: "https://zlib.net/pigz/" + documentation: "https://zlib.net/pigz/pigz.pdf" + + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - zip: + type: file + description: Gzipped file + pattern: "*.{gzip}" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format +output: + file: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - ${uncompressed_filename}: + type: file + description: File to compress + pattern: "*" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@lrauschning" diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test b/modules/nf-core/pigz/uncompress/tests/main.nf.test new file mode 100644 index 00000000..9c3289bc --- /dev/null +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test @@ -0,0 +1,58 @@ +nextflow_process { + + name "Test Process PIGZ_UNCOMPRESS" + script "modules/nf-core/pigz/uncompress/main.nf" + process "PIGZ_UNCOMPRESS" + tag "modules" + tag "modules_nfcore" + tag "pigz" + tag "pigz/uncompress" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + + test("Should run without failures - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap new file mode 100644 index 00000000..384a574f --- /dev/null +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ], + "file": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T11:24:38.144787334" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ], + "file": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T11:23:17.620127425" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/cat/environment.yml b/modules/nf-core/samtools/cat/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/cat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/cat/main.nf b/modules/nf-core/samtools/cat/main.nf new file mode 100644 index 00000000..0490b81d --- /dev/null +++ b/modules/nf-core/samtools/cat/main.nf @@ -0,0 +1,50 @@ +process SAMTOOLS_CAT { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input_files, stageAs: "?/*") + + output: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + """ + samtools \\ + cat \\ + $args \\ + -o ${prefix}.${file_type} \\ + $input_files + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + """ + touch ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/cat/meta.yml b/modules/nf-core/samtools/cat/meta.yml new file mode 100644 index 00000000..a2ac0e21 --- /dev/null +++ b/modules/nf-core/samtools/cat/meta.yml @@ -0,0 +1,64 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +name: samtools_cat +description: Concatenate BAM or CRAM file +keywords: + - merge + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_files: + type: file + description: BAM/CRAM files + pattern: "*.{bam,cram}" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.bam: + type: file + description: Concatenated BAM file + pattern: "*.{bam}" + ontologies: [] + cram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.cram: + type: file + description: Concatenated CRAM file + pattern: "*.{cram}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@matthdsm" +maintainers: + - "@matthdsm" diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test b/modules/nf-core/samtools/cat/tests/main.nf.test new file mode 100644 index 00000000..dad80b83 --- /dev/null +++ b/modules/nf-core/samtools/cat/tests/main.nf.test @@ -0,0 +1,61 @@ +nextflow_process { + + name "Test Process SAMTOOLS_CAT" + script "../main.nf" + process "SAMTOOLS_CAT" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/cat" + + test("bams") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bams_bam") }, + { assert snapshot(process.out.cram).match("bams_cram") }, + { assert snapshot(process.out.versions).match("bams_versions") } + ) + } + } + + test("bams_stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bams_stub_bam") }, + { assert snapshot(process.out.cram).match("bams_stub_cram") }, + { assert snapshot(process.out.versions).match("bams_stub_versions") } + ) + } + } +} diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test.snap b/modules/nf-core/samtools/cat/tests/main.nf.test.snap new file mode 100644 index 00000000..9af1b19f --- /dev/null +++ b/modules/nf-core/samtools/cat/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "bams_stub_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:42.587418" + }, + "bams_stub_versions": { + "content": [ + [ + "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:47:51.511914861" + }, + "bams_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:37.965199" + }, + "bams_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:37.96805" + }, + "bams_stub_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:42.583881" + }, + "bams_versions": { + "content": [ + [ + "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:47:50.783194958" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf new file mode 100644 index 00000000..6de0095d --- /dev/null +++ b/modules/nf-core/samtools/faidx/main.nf @@ -0,0 +1,61 @@ +process SAMTOOLS_FAIDX { + tag "$fasta" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(fasta) + tuple val(meta2), path(fai) + val get_sizes + + output: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def get_sizes_command = get_sizes ? "cut -f 1,2 ${fasta}.fai > ${fasta}.sizes" : '' + """ + samtools \\ + faidx \\ + $fasta \\ + $args + + ${get_sizes_command} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() + def fastacmd = match[0] ? "touch ${match[0][1]}" : '' + def get_sizes_command = get_sizes ? "touch ${fasta}.sizes" : '' + """ + ${fastacmd} + touch ${fasta}.fai + if [[ "${fasta.extension}" == "gz" ]]; then + touch ${fasta}.gzi + fi + + ${get_sizes_command} + + cat <<-END_VERSIONS > versions.yml + + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml new file mode 100644 index 00000000..b7a2e0c1 --- /dev/null +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -0,0 +1,102 @@ +name: samtools_faidx +description: Index FASTA file, and optionally generate a file of chromosome sizes +keywords: + - index + - fasta + - faidx + - chromosome +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + ontologies: [] + - get_sizes: + type: boolean + description: use cut to get the sizes of the index (true) or not (false) + +output: + fa: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{fa,fasta}": + type: file + description: FASTA file + pattern: "*.{fa}" + ontologies: [] + sizes: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.sizes": + type: file + 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 ] + - "*.fai": + type: file + description: FASTA index file + pattern: "*.{fai}" + ontologies: [] + gzi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.gzi": + type: file + description: Optional gzip index file for compressed inputs + pattern: "*.gzi" + 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" + - "@phue" +maintainers: + - "@maxulysse" + - "@phue" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test new file mode 100644 index 00000000..64219b7d --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -0,0 +1,219 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FAIDX" + script "../main.nf" + process "SAMTOOLS_FAIDX" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/faidx" + + test("test_samtools_faidx") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + input[1] = [[],[]] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_bgzip") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true)] + input[1] = [[],[]] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fasta") { + + config "./nextflow2.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fai") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + input[1] = [[],[]] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap new file mode 100644 index 00000000..73722414 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -0,0 +1,543 @@ +{ + "test_samtools_faidx": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:31:48.258623157" + }, + "test_samtools_faidx_get_sizes_bgzip - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:41.122428188" + }, + "test_samtools_faidx_get_sizes": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:34:02.353546697" + }, + "test_samtools_faidx_bgzip": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:31:55.157487176" + }, + "test_samtools_faidx_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:02.149455586" + }, + "test_samtools_faidx_get_sizes - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:34.29376776" + }, + "test_samtools_faidx_stub_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:09.125065185" + }, + "test_samtools_faidx_stub_fai": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:16.274287863" + }, + "test_samtools_faidx_get_sizes_bgzip": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:28.117654855" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config new file mode 100644 index 00000000..f76a3ba0 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = 'MT192765.1 -o extract.fa' + } + +} diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config new file mode 100644 index 00000000..33ebbd5d --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow2.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = '-o extract.fa' + } +} diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf new file mode 100644 index 00000000..c23f3a5c --- /dev/null +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -0,0 +1,45 @@ +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + samtools \\ + flagstat \\ + --threads ${task.cpus} \\ + $bam \\ + > ${prefix}.flagstat + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.flagstat + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml new file mode 100644 index 00000000..ebbc15f2 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -0,0 +1,60 @@ +name: samtools_flagstat +description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG + type +keywords: + - stats + - mapping + - counts + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + ontologies: [] +output: + flagstat: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.flagstat": + type: file + description: File containing samtools flagstat output + pattern: "*.{flagstat}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test b/modules/nf-core/samtools/flagstat/tests/main.nf.test new file mode 100644 index 00000000..3b648a37 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FLAGSTAT" + script "../main.nf" + process "SAMTOOLS_FLAGSTAT" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/flagstat" + + test("BAM") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("BAM - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap new file mode 100644 index 00000000..04c3852b --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "BAM - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:02:58.866491759" + }, + "BAM": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "1": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "versions": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:02:47.383332837" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf new file mode 100644 index 00000000..3d5bf4bd --- /dev/null +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -0,0 +1,48 @@ +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). + samtools \\ + idxstats \\ + --threads ${task.cpus-1} \\ + $bam \\ + > ${prefix}.idxstats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + touch ${prefix}.idxstats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml new file mode 100644 index 00000000..96d42746 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -0,0 +1,60 @@ +name: samtools_idxstats +description: Reports alignment summary statistics for a BAM/CRAM/SAM file +keywords: + - stats + - mapping + - counts + - chromosome + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: [] + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" + ontologies: [] +output: + idxstats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.idxstats": + type: file + description: File containing samtools idxstats output + pattern: "*.{idxstats}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test b/modules/nf-core/samtools/idxstats/tests/main.nf.test new file mode 100644 index 00000000..5fd1fc78 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_process { + + name "Test Process SAMTOOLS_IDXSTATS" + script "../main.nf" + process "SAMTOOLS_IDXSTATS" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/idxstats" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("bam - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + }} diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap new file mode 100644 index 00000000..2cc89a3b --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:11:56.466856235" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "1": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "versions": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:11:46.311550359" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/index/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf new file mode 100644 index 00000000..7019a72e --- /dev/null +++ b/modules/nf-core/samtools/index/main.nf @@ -0,0 +1,49 @@ +process SAMTOOLS_INDEX { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + samtools \\ + index \\ + -@ ${task.cpus} \\ + $args \\ + $input + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def extension = file(input).getExtension() == 'cram' ? + "crai" : args.contains("-c") ? "csi" : "bai" + """ + touch ${input}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml new file mode 100644 index 00000000..1bed6bca --- /dev/null +++ b/modules/nf-core/samtools/index/meta.yml @@ -0,0 +1,77 @@ +name: samtools_index +description: Index SAM/BAM/CRAM file +keywords: + - index + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: input file + ontologies: [] +output: + bai: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bai": + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: CSI index file + pattern: "*.{csi}" + ontologies: [] + crai: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.crai": + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + 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" + - "@maxulysse" +maintainers: + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/samtools/index/tests/csi.nextflow.config b/modules/nf-core/samtools/index/tests/csi.nextflow.config new file mode 100644 index 00000000..0ed260ef --- /dev/null +++ b/modules/nf-core/samtools/index/tests/csi.nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_INDEX { + ext.args = '-c' + } + +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test b/modules/nf-core/samtools/index/tests/main.nf.test new file mode 100644 index 00000000..ca34fb5c --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,140 @@ +nextflow_process { + + name "Test Process SAMTOOLS_INDEX" + script "../main.nf" + process "SAMTOOLS_INDEX" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/index" + + test("bai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi") { + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.csi[0][1]).name, + process.out.versions + ).match() } + ) + } + } + + test("bai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi - stub") { + options "-stub" + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap new file mode 100644 index 00000000..72d65e81 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,250 @@ +{ + "csi - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:25.261127166" + }, + "crai - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:12.653194876" + }, + "bai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:01.854932651" + }, + "csi": { + "content": [ + "test.paired_end.sorted.bam.csi", + [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:51.485364222" + }, + "crai": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:40.518873972" + }, + "bai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:21.184050361" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/stats/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf new file mode 100644 index 00000000..eac01eeb --- /dev/null +++ b/modules/nf-core/samtools/stats/main.nf @@ -0,0 +1,48 @@ +process SAMTOOLS_STATS { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input), path(input_index) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--reference ${fasta}" : "" + """ + samtools \\ + stats \\ + --threads ${task.cpus} \\ + ${reference} \\ + ${input} \\ + > ${prefix}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml new file mode 100644 index 00000000..6dc51885 --- /dev/null +++ b/modules/nf-core/samtools/stats/meta.yml @@ -0,0 +1,72 @@ +name: samtools_stats +description: Produces comprehensive statistics from SAM/BAM/CRAM file +keywords: + - statistics + - counts + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + ontologies: [] + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference file the CRAM was created with (optional) + pattern: "*.{fasta,fa}" + ontologies: [] +output: + stats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.stats": + type: file + description: File containing samtools stats output + pattern: "*.{stats}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" +maintainers: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test b/modules/nf-core/samtools/stats/tests/main.nf.test new file mode 100644 index 00000000..5bc89309 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test @@ -0,0 +1,113 @@ +nextflow_process { + + name "Test Process SAMTOOLS_STATS" + script "../main.nf" + process "SAMTOOLS_STATS" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/stats" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } +} diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap new file mode 100644 index 00000000..df507be7 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -0,0 +1,142 @@ +{ + "cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:16.767396182" + }, + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:29.721580274" + }, + "cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:53.567964304" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d53a2584376d78942839e9933a34d11b" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d53a2584376d78942839e9933a34d11b" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:28:50.73610604" + } +} \ No newline at end of file diff --git a/modules/nf-core/severus/environment.yml b/modules/nf-core/severus/environment.yml new file mode 100644 index 00000000..6081c124 --- /dev/null +++ b/modules/nf-core/severus/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::severus=1.3 diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf new file mode 100644 index 00000000..7df7c4e5 --- /dev/null +++ b/modules/nf-core/severus/main.nf @@ -0,0 +1,101 @@ +process SEVERUS { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/severus:1.6--pyhdfd78af_0': + 'biocontainers/severus:1.6--pyhdfd78af_0' }" + + input: + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) + tuple val(meta2), path(bed), path(pon_path) + + output: + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def control = control_input ? "--control-bam ${control_input}" : "" + def vntr_bed = bed ? "--vntr-bed ${bed}" : "" + def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" + def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" + """ + severus \\ + $args \\ + --threads $task.cpus \\ + --target-bam $target_input \\ + $vntr_bed \\ + $pon \\ + $control \\ + $phasing_vcf \\ + --out-dir . + + bgzip somatic_SVs/severus_somatic.vcf + tabix -p vcf somatic_SVs/severus_somatic.vcf.gz + bgzip all_SVs/severus_all.vcf + tabix -p vcf all_SVs/severus_all.vcf.gz + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + severus: \$(severus --version) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + """ + mkdir -p all_SVs/plots + mkdir -p somatic_SVs/plots + + touch severus_collaped_dup.bed + touch severus.log + touch severus_LOH.bed + touch read_alignments + touch read_ids.csv + touch read_qual.txt + touch breakpoints_double.csv + touch all_SVs/severus_all.vcf.gz + touch all_SVs/severus_all.vcf.gz.tbi + touch all_SVs/breakpoints_clusters_list.tsv + touch all_SVs/breakpoints_clusters.tsv + touch all_SVs/plots/severus_0.html + touch all_SVs/plots/severus_1.html + touch somatic_SVs/severus_somatic.vcf.gz + touch somatic_SVs/severus_somatic.vcf.gz.tbi + touch somatic_SVs/breakpoints_clusters_list.tsv + touch somatic_SVs/breakpoints_clusters.tsv + touch somatic_SVs/plots/severus_0.html + touch somatic_SVs/plots/severus_1.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + severus: \$(severus --version) + END_VERSIONS + """ +} diff --git a/modules/nf-core/severus/meta.yml b/modules/nf-core/severus/meta.yml new file mode 100644 index 00000000..8ada3548 --- /dev/null +++ b/modules/nf-core/severus/meta.yml @@ -0,0 +1,217 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "severus" +description: Severus is a somatic structural variation (SV) caller for long reads + (both PacBio and ONT) +keywords: + - structural + - variation + - somatic + - germline + - long-read +tools: + - "severus": + description: "A tool for somatic structural variant calling using long reads" + homepage: "https://github.com/KolmogorovLab/Severus" + documentation: "https://github.com/KolmogorovLab/Severus" + tool_dev_url: "https://github.com/KolmogorovLab/Severus" + doi: "10.1101/2024.03.22.24304756" + licence: ["BSD-3-clause"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - target_input: + type: file + description: path to one or multiple target BAM/CRAM files (e.g. tumor, must + be indexed) + pattern: "*.{bam,cram}" + - target_index: + type: file + description: path to one or multiple target BAM/CRAM index files + pattern: "*.{bai,crai,csi}" + - control_input: + type: file + description: path to the control BAM/CRAM file (e.g. normal, must be indexed) + pattern: "*.{bam,cram}" + - control_index: + type: file + description: path to the control BAM/CRAM file index + pattern: "*.{bai,crai,csi}" + - vcf: + type: file + description: path to vcf file used for phasing (if using haplotype specific + SV calling + pattern: "*.{vcf,vcf.gz}" + - - meta2: + type: map + description: | + Groovy Map containing tandem repeat regions information + e.g. `[ id:'hg38']` + - bed: + type: file + description: path to bed file for tandem repeat regions (must be ordered) + pattern: "*.bed" +output: + - log: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus.log: + type: file + description: Severus log file + pattern: "${prefix}/severus.log" + - read_qual: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_qual.txt: + type: file + description: Severus read_qual file + pattern: "${prefix}/read_qual.txt" + - breakpoints_double: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/breakpoints_double.csv: + type: file + description: Severus breakpoints_double file + pattern: "${prefix}/breakpoints_double.csv" + - read_alignments: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_alignments: + type: file + description: read alignments file + pattern: "${prefix}/read_alignments" + - read_ids: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_ids.csv: + type: file + description: read IDs for support reads + pattern: "${prefix}/read_ids" + - collapsed_dup: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus_collaped_dup.bed: + type: file + description: a bed file with identified collapsed duplication regions + pattern: "${prefix}/severus_collaped_dup" + - loh: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus_LOH.bed: + type: file + description: a bed file with predicted LOH regions + pattern: "${prefix}/severus_LOH.bed" + - all_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/severus_all.vcf: + type: file + description: VCF file with all SVs (somatic + germline) + pattern: "${prefix}/all_SVs/severus_all.vcf" + - all_breakpoints_clusters_list: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/breakpoints_clusters_list.tsv: + type: file + description: Severus breakpoints clusters list file + pattern: "${prefix}/all_SVs/breakpoints_clusters_list.tsv" + - all_breakpoints_clusters: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/breakpoints_clusters.tsv: + type: file + description: Severus breakpoints clusters file + pattern: "${prefix}/all_SVs/breakpoints_clusters.tsv" + - all_plots: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/plots/severus_*.html: + type: file + description: Severus plots + pattern: "${prefix}/all_SVs/plots/*.html" + - somatic_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/severus_all.vcf: + type: file + description: VCF file with somatic SVs + pattern: "${prefix}/somatic_SVs/severus_all.vcf" + - somatic_breakpoints_clusters_list: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv: + type: file + description: Severus somatic breakpoints clusters list file + pattern: "${prefix}/somatic_SVs/breakpoints_clusters_list.tsv" + - somatic_breakpoints_clusters: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/breakpoints_clusters.tsv: + type: file + description: Severus somatic breakpoints clusters file + pattern: "${prefix}/somatic_SVs/breakpoints_clusters.tsv" + - somatic_plots: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/plots/severus_*.html: + type: file + description: Severus somatic plots + pattern: "${prefix}/somatic_SVs/plots/*.html" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff new file mode 100644 index 00000000..d5e967c7 --- /dev/null +++ b/modules/nf-core/severus/severus.diff @@ -0,0 +1,138 @@ +Changes in component 'nf-core/severus' +'modules/nf-core/severus/meta.yml' is unchanged +Changes in 'severus/main.nf': +--- modules/nf-core/severus/main.nf ++++ modules/nf-core/severus/main.nf +@@ -4,30 +4,32 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/severus:1.3--pyhdfd78af_0': +- 'biocontainers/severus:1.3--pyhdfd78af_0' }" ++ 'https://depot.galaxyproject.org/singularity/severus:1.6--pyhdfd78af_0': ++ 'biocontainers/severus:1.6--pyhdfd78af_0' }" + + input: +- tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) +- tuple val(meta2), path(bed) ++ tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) ++ tuple val(meta2), path(bed), path(pon_path) + + output: +- tuple val(meta), path("${prefix}/severus.log") , emit: log +- tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual +- tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double +- tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true +- tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true +- tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true +- tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true +- tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true +- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true +- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true +- tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true +- path "versions.yml" , emit: versions ++ tuple val(meta), path("severus.log") , emit: log ++ tuple val(meta), path("read_qual.txt") , emit: read_qual ++ tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double ++ tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true ++ tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true ++ tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true ++ tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true ++ tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true ++ tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true ++ tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true ++ tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true ++ tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true ++ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true ++ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true ++ tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true ++ tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true ++ tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true ++ path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when +@@ -39,15 +41,23 @@ + def control = control_input ? "--control-bam ${control_input}" : "" + def vntr_bed = bed ? "--vntr-bed ${bed}" : "" + def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" ++ def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" + """ + severus \\ + $args \\ + --threads $task.cpus \\ + --target-bam $target_input \\ + $vntr_bed \\ ++ $pon \\ + $control \\ + $phasing_vcf \\ +- --out-dir ${prefix} ++ --out-dir . ++ ++ bgzip somatic_SVs/severus_somatic.vcf ++ tabix -p vcf somatic_SVs/severus_somatic.vcf.gz ++ bgzip all_SVs/severus_all.vcf ++ tabix -p vcf all_SVs/severus_all.vcf.gz ++ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +@@ -60,26 +70,28 @@ + prefix = task.ext.prefix ?: "${meta.id}" + + """ +- mkdir -p ${prefix}/all_SVs/plots +- mkdir -p ${prefix}/somatic_SVs/plots ++ mkdir -p all_SVs/plots ++ mkdir -p somatic_SVs/plots + +- touch ${prefix}/severus_collaped_dup.bed +- touch ${prefix}/severus.log +- touch ${prefix}/severus_LOH.bed +- touch ${prefix}/read_alignments +- touch ${prefix}/read_ids.csv +- touch ${prefix}/read_qual.txt +- touch ${prefix}/breakpoints_double.csv +- touch ${prefix}/all_SVs/severus_all.vcf +- touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv +- touch ${prefix}/all_SVs/breakpoints_clusters.tsv +- touch ${prefix}/all_SVs/plots/severus_0.html +- touch ${prefix}/all_SVs/plots/severus_1.html +- touch ${prefix}/somatic_SVs/severus_somatic.vcf +- touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv +- touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv +- touch ${prefix}/somatic_SVs/plots/severus_0.html +- touch ${prefix}/somatic_SVs/plots/severus_1.html ++ touch severus_collaped_dup.bed ++ touch severus.log ++ touch severus_LOH.bed ++ touch read_alignments ++ touch read_ids.csv ++ touch read_qual.txt ++ touch breakpoints_double.csv ++ touch all_SVs/severus_all.vcf.gz ++ touch all_SVs/severus_all.vcf.gz.tbi ++ touch all_SVs/breakpoints_clusters_list.tsv ++ touch all_SVs/breakpoints_clusters.tsv ++ touch all_SVs/plots/severus_0.html ++ touch all_SVs/plots/severus_1.html ++ touch somatic_SVs/severus_somatic.vcf.gz ++ touch somatic_SVs/severus_somatic.vcf.gz.tbi ++ touch somatic_SVs/breakpoints_clusters_list.tsv ++ touch somatic_SVs/breakpoints_clusters.tsv ++ touch somatic_SVs/plots/severus_0.html ++ touch somatic_SVs/plots/severus_1.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + +'modules/nf-core/severus/environment.yml' is unchanged +'modules/nf-core/severus/tests/tags.yml' is unchanged +'modules/nf-core/severus/tests/main.nf.test' is unchanged +'modules/nf-core/severus/tests/main.nf.test.snap' is unchanged +'modules/nf-core/severus/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/severus/tests/main.nf.test b/modules/nf-core/severus/tests/main.nf.test new file mode 100644 index 00000000..2ec25e89 --- /dev/null +++ b/modules/nf-core/severus/tests/main.nf.test @@ -0,0 +1,208 @@ +nextflow_process { + + name "Test Process SEVERUS" + script "../main.nf" + process "SEVERUS" + + tag "modules" + tag "modules_nfcore" + tag "severus" + + test("homo_sapiens - [ bam, bai, [], [], [] ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + [], + [], + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + //path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, - lint fails because of emtpy md5sum + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, [] ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, vcf ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf', checkIfExists: true), + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf', checkIfExists: true), + ] + input[1] = [ + [ id:'bed'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.blacklist_intervals.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + [], + [], + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/severus/tests/main.nf.test.snap b/modules/nf-core/severus/tests/main.nf.test.snap new file mode 100644 index 00000000..28754a33 --- /dev/null +++ b/modules/nf-core/severus/tests/main.nf.test.snap @@ -0,0 +1,435 @@ +{ + "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d0428d5dc149f2b40e46e480809d7417" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,a0fdb9d522587e7b088b3a61fce99843" + ] + ], + "VcfFile [chromosomes=[], sampleCount=1, variantCount=0, phased=true, phasedAutodetect=true]", + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:18:01.020231375" + }, + "homo_sapiens - [ bam, bai, bam, bai, vcf ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:13.354543848" + }, + "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "severus.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "11": [ + + ], + "12": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "15": [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ], + "2": [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "read_alignments:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test" + }, + "read_ids.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test" + }, + "severus_collaped_dup.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test" + }, + "severus_LOH.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test" + }, + "severus_all.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_breakpoints_clusters": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_breakpoints_clusters_list": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_plots": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "all_vcf": [ + [ + { + "id": "test" + }, + "severus_all.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "breakpoints_double": [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "collapsed_dup": [ + [ + { + "id": "test" + }, + "severus_collaped_dup.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "severus.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "loh": [ + [ + { + "id": "test" + }, + "severus_LOH.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_alignments": [ + [ + { + "id": "test" + }, + "read_alignments:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_ids": [ + [ + { + "id": "test" + }, + "read_ids.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_qual": [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_breakpoints_clusters": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_breakpoints_clusters_list": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_plots": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "somatic_vcf": [ + + ], + "versions": [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:03:53.176564181" + }, + "homo_sapiens - [ bam, bai, bam, bai, [] ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,e2b55013bcb77a0b738cdba485520f68" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:01.967892199" + }, + "homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,8ef1a36618e7f2cad39c79c9aed3cd64" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:25.517633729" + } +} \ No newline at end of file diff --git a/modules/nf-core/severus/tests/nextflow.config b/modules/nf-core/severus/tests/nextflow.config new file mode 100644 index 00000000..1dae7a59 --- /dev/null +++ b/modules/nf-core/severus/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'SEVERUS' { + ext.args = '--min-sv-size 1 --min-mapq 0 --min-support 1 --TIN-ratio 1 --low-quality' + } +} diff --git a/modules/nf-core/severus/tests/tags.yml b/modules/nf-core/severus/tests/tags.yml new file mode 100644 index 00000000..d7e36658 --- /dev/null +++ b/modules/nf-core/severus/tests/tags.yml @@ -0,0 +1,2 @@ +severus: + - "modules/nf-core/severus/**" diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml new file mode 100644 index 00000000..9b926b1f --- /dev/null +++ b/modules/nf-core/untar/environment.yml @@ -0,0 +1,12 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf new file mode 100644 index 00000000..e712ebe6 --- /dev/null +++ b/modules/nf-core/untar/main.nf @@ -0,0 +1,84 @@ +process UNTAR { + tag "${archive}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) + + """ + mkdir ${prefix} + + ## Ensures --strip-components only applied when top level of tar contents is a directory + ## If just files or multiple directories, place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + tar \\ + -C ${prefix} --strip-components 1 \\ + -xavf \\ + ${args} \\ + ${archive} \\ + ${args2} + else + tar \\ + -C ${prefix} \\ + -xavf \\ + ${args} \\ + ${archive} \\ + ${args2} + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) + """ + mkdir ${prefix} + ## Dry-run untaring the archive to get the files and place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch \${i} + else + mkdir -p \${i} + fi + done + else + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch ${prefix}/\${i} + else + mkdir -p ${prefix}/\${i} + fi + done + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml new file mode 100644 index 00000000..1b6bf491 --- /dev/null +++ b/modules/nf-core/untar/meta.yml @@ -0,0 +1,57 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress + - extract +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" + ontologies: + - edam: http://edamontology.org/format_3981 # TAR format + - edam: http://edamontology.org/format_3989 # GZIP format +output: + untar: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + - ${prefix}: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test new file mode 100644 index 00000000..c957517a --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test @@ -0,0 +1,85 @@ +nextflow_process { + + name "Test Process UNTAR" + script "../main.nf" + process "UNTAR" + tag "modules" + tag "modules_nfcore" + tag "untar" + + test("test_untar") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap new file mode 100644 index 00000000..ceb91b79 --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -0,0 +1,158 @@ +{ + "test_untar_onlyfiles": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:28.231047" + }, + "test_untar_onlyfiles - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:45.773103" + }, + "test_untar - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:36.777441" + }, + "test_untar": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:19.377674" + } +} \ No newline at end of file diff --git a/modules/nf-core/unzip/environment.yml b/modules/nf-core/unzip/environment.yml new file mode 100644 index 00000000..24615895 --- /dev/null +++ b/modules/nf-core/unzip/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::p7zip=16.02 diff --git a/modules/nf-core/unzip/main.nf b/modules/nf-core/unzip/main.nf new file mode 100644 index 00000000..a0c02109 --- /dev/null +++ b/modules/nf-core/unzip/main.nf @@ -0,0 +1,49 @@ +process UNZIP { + tag "$archive" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/p7zip:16.02' : + 'biocontainers/p7zip:16.02' }" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + 7za \\ + x \\ + -o"${prefix}"/ \\ + $args \\ + $archive + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + mkdir "${prefix}" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/unzip/meta.yml b/modules/nf-core/unzip/meta.yml new file mode 100644 index 00000000..ba1eb912 --- /dev/null +++ b/modules/nf-core/unzip/meta.yml @@ -0,0 +1,50 @@ +name: unzip +description: Unzip ZIP archive files +keywords: + - unzip + - decompression + - zip + - archiving +tools: + - unzip: + description: p7zip is a quick port of 7z.exe and 7za.exe (command line version + of 7zip, see www.7-zip.org) for Unix. + homepage: https://sourceforge.net/projects/p7zip/ + documentation: https://sourceforge.net/projects/p7zip/ + tool_dev_url: https://sourceforge.net/projects/p7zip" + licence: ["LGPL-2.1-or-later"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: ZIP file + pattern: "*.zip" + ontologies: + - edam: http://edamontology.org/format_3987 # ZIP format +output: + unzipped_archive: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}/: + type: directory + description: Directory contents of the unzipped archive + pattern: "${archive.baseName}/" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@jfy133" +maintainers: + - "@jfy133" diff --git a/modules/nf-core/unzip/tests/main.nf.test b/modules/nf-core/unzip/tests/main.nf.test new file mode 100644 index 00000000..238b68d8 --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process UNZIP" + script "../main.nf" + process "UNZIP" + + tag "modules" + tag "modules_nfcore" + tag "unzip" + + test("generic [tar] [tar_gz]") { + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("generic [tar] [tar_gz] stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/unzip/tests/main.nf.test.snap b/modules/nf-core/unzip/tests/main.nf.test.snap new file mode 100644 index 00000000..cdd2ab16 --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test.snap @@ -0,0 +1,76 @@ +{ + "generic [tar] [tar_gz] stub": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:37.11550986" + }, + "generic [tar] [tar_gz]": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:25.120242571" + } +} \ No newline at end of file diff --git a/modules/nf-core/wget/environment.yml b/modules/nf-core/wget/environment.yml new file mode 100644 index 00000000..9eb304e5 --- /dev/null +++ b/modules/nf-core/wget/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::wget=1.21.4 diff --git a/modules/nf-core/wget/main.nf b/modules/nf-core/wget/main.nf new file mode 100644 index 00000000..9bc6f151 --- /dev/null +++ b/modules/nf-core/wget/main.nf @@ -0,0 +1,48 @@ +process WGET { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/3b/3b54fa9135194c72a18d00db6b399c03248103f87e43ca75e4b50d61179994b3/data': + 'community.wave.seqera.io/library/wget:1.21.4--8b0fcde81c17be5e' }" + + input: + tuple val(meta), val(url) + + output: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: 'html' + """ + wget \\ + -O - \\ + $args \\ + $url \\ + > ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wget: \$(wget --version | head -1 | cut -d ' ' -f 3) + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: 'html' + """ + touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wget: \$(wget --version | head -1 | cut -d ' ' -f 3) + END_VERSIONS + """ +} diff --git a/modules/nf-core/wget/meta.yml b/modules/nf-core/wget/meta.yml new file mode 100644 index 00000000..56df0af1 --- /dev/null +++ b/modules/nf-core/wget/meta.yml @@ -0,0 +1,52 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "wget" +description: The non-interactive network downloader +keywords: + - "wget" + - "download" + - "network" +tools: + - "wget": + description: "wget is a free utility for non-interactive download of files from + the Web." + homepage: "https://www.gnu.org/software/wget/" + documentation: "https://www.gnu.org/software/wget/manual/wget.html" + licence: ["GPL"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - url: + type: string + description: URL to download + pattern: "^https?://*.*" + +output: + outfile: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - ${prefix}.${suffix}: + type: file + description: Downloaded file + pattern: "*.*" + + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@itrujnara" +maintainers: + - "@itrujnara" diff --git a/modules/nf-core/wget/tests/main.nf.test b/modules/nf-core/wget/tests/main.nf.test new file mode 100644 index 00000000..e0942885 --- /dev/null +++ b/modules/nf-core/wget/tests/main.nf.test @@ -0,0 +1,62 @@ +// nf-core modules test wget +nextflow_process { + + name "Test Process WGET" + script "../main.nf" + process "WGET" + + tag "modules" + tag "modules_nfcore" + tag "wget" + + test("sarscov2 - gff") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + "https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/modules/data/genomics/sarscov2/genome/genome.gff3", + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - gff - stub") { + + options "-stub" + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + "https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/modules/data/genomics/sarscov2/genome/genome.gff3", + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/wget/tests/main.nf.test.snap b/modules/nf-core/wget/tests/main.nf.test.snap new file mode 100644 index 00000000..6c051601 --- /dev/null +++ b/modules/nf-core/wget/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "sarscov2 - gff": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gff3:md5,357435a81a9981a0128e840ebe11051e" + ] + ], + "1": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ], + "outfile": [ + [ + { + "id": "test" + }, + "test.gff3:md5,357435a81a9981a0128e840ebe11051e" + ] + ], + "versions": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.4" + }, + "timestamp": "2025-03-26T12:27:32.67617" + }, + "sarscov2 - gff - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ], + "outfile": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.4" + }, + "timestamp": "2025-03-26T12:21:06.414955" + } +} \ No newline at end of file diff --git a/modules/nf-core/wget/tests/nextflow.config b/modules/nf-core/wget/tests/nextflow.config new file mode 100644 index 00000000..236f4e17 --- /dev/null +++ b/modules/nf-core/wget/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: "WGET" { + ext.prefix = "test" + ext.suffix = "gff3" + } +} diff --git a/nextflow.config b/nextflow.config index bcf75c6f..8b7c724c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow config file + IntGenomicsLab/lrsomatic Nextflow config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- @@ -11,44 +11,94 @@ params { // TODO nf-core: Specify your pipeline's command line flags // Input options - input = null + input = null // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false + genome = null + igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_ignore = false + + // Annotation + vep_cache = 's3://annotation-cache/vep_cache/' + vep_cache_version = 113 + download_vep_cache = false + vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" + vep_custom = null + vep_custom_tbi = null + + + normal_fiber = true + + // Skip options + skip_qc = false + skip_cramino = false + skip_mosdepth = false + skip_bamstats = false + skip_ascat = false + skip_wakhan = false + skip_fiber = false + skip_vep = false + + // minimap2 options + minimap2_ont_model = null + minimap2_pb_model = null + save_secondary_alignment = true + + // Fibertools options + params.autocorrelation = null + + // ASCAT options + ascat_ploidy = null + ascat_min_base_qual = 20 + ascat_min_counts = 10 + ascat_min_map_qual = 10 + ascat_penalty = 150 + ascat_purity = null + ascat_longread_bins = 2000 + ascat_allelecounter_flags = "-f 0" + ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) + + // Wakhan options + wakhan_chroms = null + + //TODO: + // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version + // and allele/loci(/gc/rt) files. For now they need to be specified for anything else but GRCh38 and CHM13 + ascat_gc_files = null + ascat_rt_files = null + // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' + multiqc_config = null + multiqc_title = null + multiqc_logo = null + max_multiqc_email_size = '25.MB' multiqc_methods_description = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - help_full = false - show_hidden = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + help_full = false + show_hidden = false + version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options - config_profile_name = null - config_profile_description = null + config_profile_name = null + config_profile_description = null - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Schema validation default options - validate_params = true + validate_params = true } // Load base.config by default for all pipelines @@ -160,16 +210,20 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } 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 -// Load IntGenomicsLab/lr_somatic custom profiles from different institutions. -// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/lr_somatic.config" : "/dev/null" +// 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 IntGenomicsLab/lrsomatic 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" // 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 @@ -195,14 +249,14 @@ env { } // Set bash options -process.shell = """\ -bash - -set -e # Exit if a tool returns a non-zero status/exit code -set -u # Treat unset variables and parameters as an error -set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute -set -C # No clobber - prevent output redirection from overwriting files. -""" +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o", // Returns the status of the last command to exit.. + "pipefail" // ..with a non-zero status or zero if all successfully execute +] // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false @@ -225,31 +279,78 @@ dag { } manifest { - name = 'IntGenomicsLab/lr_somatic' - author = """Jonas Demeulemeester""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead + name = 'IntGenomicsLab/lrsomatic' contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 + [ + name: 'Luuk Harbers', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium', + email: 'luuk.harbers@kuleuven.be', + github: 'https://github.com/ljwharbers', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0003-3910-6497' + ], + [ + name: 'Robert Forsyth', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'robertalexander.forsyth@kuleuven.be', + github: 'https://github.com/robert-a-forsyth', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-6202-8477' + ], + [ + name: 'Alexandra PančíkovΓ‘', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory for Computational Biology, Department of Human Genetics, KU Leuven, Leuven, Belgium; VIB-KU Leuven Center for Brain & Disease Research, Leuven, Belgium', + email: 'alexandra.pancikova@kuleuven.be', + github: 'https://github.com/AlexanRNA', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-0693-132X' + ], + [ + name: 'Ruben Cools', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'ruben.cools@kuleuven.be', + github: 'https://github.com/rcools', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0009-0004-7484-5564' + ], + [ + name: 'Marios Eftychiou', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', + email: 'marios.eftychiou@kuleuven.be', + github: 'https://github.com/MariosEft97', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-5929-6956' + ], + [ + name: 'Laurens Lambrechts', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', + email: 'laurens.lambrechts@kuleuven.be', + github: 'https://github.com/MariosEft97', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-1415-4591' + ], [ name: 'Jonas Demeulemeester', - affiliation: '', - email: '', - github: '', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'jonas.demeulemeester@kuleuven.be', + github: 'https://github.com/jdemeul', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '' + orcid: 'https://orcid.org/0000-0002-2660-2478' ], ] - homePage = 'https://github.com/IntGenomicsLab/lr_somatic' + homePage = 'https://github.com/IntGenomicsLab/lrsomatic' description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'main' - nextflowVersion = '!>=24.04.2' - version = '1.0.0dev' + nextflowVersion = '!>=25.04.0' + version = '1.0.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.1.1' // 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 { @@ -257,7 +358,7 @@ validation { monochromeLogs = params.monochrome_logs help { enabled = true - command = "nextflow run IntGenomicsLab/lr_somatic -profile --input samplesheet.csv --outdir " + command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " fullParameter = "help_full" showHiddenParameter = "show_hidden" } diff --git a/nextflow_schema.json b/nextflow_schema.json index a33030c5..12dabb38 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/nextflow_schema.json", - "title": "IntGenomicsLab/lr_somatic pipeline parameters", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/nextflow_schema.json", + "title": "IntGenomicsLab/lrsomatic pipeline parameters", "description": "Workflow for somatic variant calling of long read data", "type": "object", "$defs": { @@ -53,17 +53,8 @@ "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." - }, - "fasta": { - "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/plain", - "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", - "fa_icon": "far fa-file-code" + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details.", + "enum": ["GRCh38", "CHM13"] }, "igenomes_ignore": { "type": "boolean", @@ -79,6 +70,138 @@ "fa_icon": "fas fa-ban", "hidden": true, "default": "s3://ngi-igenomes/igenomes/" + }, + "vep_cache": { + "type": "string", + "description": "Path to VEP cache directory.", + "fa_icon": "fas fa-database", + "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." + }, + "vep_cache_version": { + "type": "integer", + "description": "Version of the VEP cache to use.", + "fa_icon": "fas fa-hashtag", + "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." + }, + "vep_args": { + "type": "string", + "description": "Additional command line arguments to pass to VEP.", + "fa_icon": "fas fa-terminal" + } + } + }, + "minimap2_options": { + "title": "minimap2 options", + "type": "object", + "description": "", + "default": "", + "properties": { + "minimap2_ont_model": { + "type": "string", + "description": "Minimap ont model to use" + }, + "minimap2_pb_model": { + "type": "string", + "description": "Minimap Pacbio model to use" + }, + "save_secondary_alignment": { + "type": "boolean", + "default": true, + "description": "Whether to save secondary alignments" + } + } + }, + "ascat_parameters": { + "title": "ASCAT parameters", + "type": "object", + "description": "ASCAT specific parameters", + "default": "", + "properties": { + "ascat_ploidy": { + "type": "string", + "description": "Enforce a ploidy" + }, + "ascat_purity": { + "type": "string", + "description": "Enforce a purity" + }, + "ascat_penalty": { + "type": "integer", + "default": 150, + "description": "Penalty value" + }, + "ascat_min_base_qual": { + "type": "integer", + "default": 20, + "description": "Minimum base quality for allelecounter" + }, + "ascat_min_counts": { + "type": "integer", + "default": 10, + "description": "Minimum counts for allelecounter" + }, + "ascat_min_map_qual": { + "type": "integer", + "default": 10, + "description": "Minimum mapping quality for allelecounter" + }, + "ascat_longread_bins": { + "type": "integer", + "default": 2000, + "description": "Binsize for long-read" + }, + "ascat_allelecounter_flags": { + "type": "string", + "default": "-f 0", + "description": "Additional allelecounter flags to use" + }, + "ascat_chroms": { + "type": "string", + "description": "Chromosomes to process (automatically inferred, only use if you want to run on a subset)" + }, + "ascat_gc_files": { + "type": "string", + "description": "Path to (zip) of GC files" + }, + "ascat_rt_files": { + "type": "string", + "description": "path to (zip) of RT files" + } + } + }, + "skip_options": { + "title": "Skip options", + "type": "object", + "description": "Define whether to skip certain steps", + "default": "", + "properties": { + "skip_qc": { + "type": "boolean", + "description": "Skips all QC steps" + }, + "skip_cramino": { + "type": "boolean", + "description": "Skips Cramino" + }, + "skip_mosdepth": { + "type": "boolean", + "description": "Skips Mosdepth" + }, + "skip_bamstats": { + "type": "boolean", + "description": "Skips samtools flagstat, stats, and idxstats" + }, + "skip_wakhan": { + "type": "boolean", + "description": "Skips wakhan" + }, + "skip_fiber": { + "type": "boolean", + "description": "Skip Fibertools steps" + }, + "skip_ascat": { + "type": "boolean", + "description": "Skip ASCAT" } } }, @@ -224,6 +347,13 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "normal_fiber": { + "type": "boolean", + "default": true, + "description": "do fiber-seq on normal samples", + "fa_icon": "fas fa-fiber", + "hidden": true } } } @@ -235,6 +365,15 @@ { "$ref": "#/$defs/reference_genome_options" }, + { + "$ref": "#/$defs/minimap2_options" + }, + { + "$ref": "#/$defs/ascat_parameters" + }, + { + "$ref": "#/$defs/skip_options" + }, { "$ref": "#/$defs/institutional_config_options" }, diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..3a1fff59 --- /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 792a7686..67aa24f4 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,9 +21,9 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-02-04T09:18:13+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "creativeWorkStatus": "Stable", + "datePublished": "2025-11-28T12:51:54+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\n\n```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -40,6 +40,9 @@ { "@id": "modules/" }, + { + "@id": "modules/local/" + }, { "@id": "modules/nf-core/" }, @@ -86,17 +89,17 @@ "@id": ".prettierignore" } ], - "isBasedOn": "https://github.com/IntGenomicsLab/lr_somatic", + "isBasedOn": "https://github.com/IntGenomicsLab/lrsomatic", "license": "MIT", "mainEntity": { "@id": "main.nf" }, "mentions": [ { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4" + "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d" } ], - "name": "IntGenomicsLab/lr_somatic" + "name": "IntGenomicsLab/lrsomatic" }, { "@id": "ro-crate-metadata.json", @@ -121,7 +124,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-02-04T10:18:13Z", + "dateModified": "2025-11-28T13:51:54Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -131,7 +134,7 @@ "MIT" ], "name": [ - "IntGenomicsLab/lr_somatic" + "IntGenomicsLab/lrsomatic" ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" @@ -140,11 +143,11 @@ "@id": "https://nf-co.re/" }, "url": [ - "https://github.com/IntGenomicsLab/lr_somatic", - "https://nf-co.re/IntGenomicsLab/lr_somatic/dev/" + "https://github.com/IntGenomicsLab/lrsomatic", + "https://nf-co.re/IntGenomicsLab/lrsomatic/1.0.0/" ], "version": [ - "0.0.1dev" + "1.0.0" ] }, { @@ -157,26 +160,26 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=25.04.0" }, { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4", + "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d", "@type": "TestSuite", "instance": [ { - "@id": "#50633232-76d9-47a1-a630-a13639384949" + "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6" } ], "mainEntity": { "@id": "main.nf" }, - "name": "Test suite for IntGenomicsLab/lr_somatic" + "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#50633232-76d9-47a1-a630-a13639384949", + "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6", "@type": "TestInstance", - "name": "GitHub Actions workflow for testing IntGenomicsLab/lr_somatic", - "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml", + "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", + "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, @@ -210,6 +213,11 @@ "@type": "Dataset", "description": "Modules used by the pipeline" }, + { + "@id": "modules/local/", + "@type": "Dataset", + "description": "Pipeline-specific modules" + }, { "@id": "modules/nf-core/", "@type": "Dataset", diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf new file mode 100644 index 00000000..76b5fdf5 --- /dev/null +++ b/subworkflows/local/prepare_annotation.nf @@ -0,0 +1,52 @@ +include {ENSEMBLVEP_DOWNLOAD } from '../../modules/nf-core/ensemblvep/download/main.nf' + +workflow PREPARE_ANNOTATION { + + take: + vep_cache + vep_cache_version + vep_genome + vep_args + vep_species + download_vep_cache + + main: + + ch_versions = Channel.empty() + ensemblvep_cache = Channel.empty() + + if (download_vep_cache) { + vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) + ENSEMBLVEP_DOWNLOAD(vep_download_info) + ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache + ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) + + } + else { + def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" + def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') + def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" + def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') + if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { + if (vep_cache == "s3://annotation-cache/vep_cache/") { + error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") + } else { + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") + } + } + + ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() + } + + + + // + // MODULE: ENSEMBLVEP_DOWNLOAD + // + + + emit: + vep_cache = ensemblvep_cache + versions = ch_versions + +} diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf new file mode 100644 index 00000000..5df2b891 --- /dev/null +++ b/subworkflows/local/prepare_reference_files.nf @@ -0,0 +1,134 @@ +// +// Prepare reference files (unzipping and adding index) +// + +include { PIGZ_UNCOMPRESS as UNZIP_FASTA } from '../../modules/nf-core/pigz/uncompress/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { UNZIP as UNZIP_ALLELES } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_GC } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_LOCI } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_RT } from '../../modules/nf-core/unzip/main' +include { UNTAR } from '../../modules/nf-core/untar/main' +include { WGET } from '../../modules/nf-core/wget/main' + +workflow PREPARE_REFERENCE_FILES { + take: + fasta + ascat_alleles + ascat_loci + ascat_loci_gc + ascat_loci_rt + basecall_meta + clair3_modelMap + + main: + ch_versions = Channel.empty() + ch_prepared_fasta = Channel.empty() + allele_files = Channel.empty() + loci_files = Channel.empty() + gc_file = Channel.empty() + rt_file = Channel.empty() + + // Check if fasta and gtf are zipped + if (fasta.endsWith('.gz')){ + UNZIP_FASTA( [ [:], fasta ]) + + ch_prepared_fasta = UNZIP_FASTA.out.file + ch_versions = ch_versions.mix(UNZIP_FASTA.out.versions) + } else { + ch_prepared_fasta = [ [:], fasta ] + } + + + basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> + def id_new = basecall_model_meta ?: meta.clair3_model + def meta_new = [id: id_new] + def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model + def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + def url = "${download_prefix}/${model}.tar.gz" + return [ meta_new, url ] + } + .unique() + .set{ model_urls } + + // + // MODULE: Download model + // + + WGET ( model_urls ) + + ch_versions = ch_versions.mix(WGET.out.versions) + + // + // MODULE: Untar model + // + + UNTAR ( + WGET.out.outfile + ) + + ch_versions = ch_versions.mix(UNTAR.out.versions) + + UNTAR.out.untar.set { downloaded_model_files } + + // + // MODULE: Index the fasta + // + + SAMTOOLS_FAIDX ( + ch_prepared_fasta, + [ [:], [] ], + false + ) + + ch_prepared_fai = SAMTOOLS_FAIDX.out.fai + + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + + // + // Prepare ASCAT files + // + + // prepare ascat and controlfreec reference files + if ( !params.skip_ascat ) { + if (!ascat_alleles) allele_files = Channel.empty() + else if (ascat_alleles.endsWith(".zip")) { + UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) + } else allele_files = Channel.fromPath(ascat_alleles).collect() + + if (!ascat_loci) loci_files = Channel.empty() + else if (ascat_loci.endsWith(".zip")) { + UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) + } else loci_files = Channel.fromPath(ascat_loci).collect() + + if (!ascat_loci_gc) gc_file = Channel.value([]) + else if ( ascat_loci_gc.endsWith(".zip") ) { + UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_GC.out.versions) + } else gc_file = Channel.fromPath(ascat_loci_gc).collect() + + if (!ascat_loci_rt) rt_file = Channel.value([]) + else if (ascat_loci_rt.endsWith(".zip")) { + UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_RT.out.versions) + } else rt_file = Channel.fromPath(ascat_loci_rt).collect() + } + + emit: + prepped_fasta = ch_prepared_fasta + prepped_fai = ch_prepared_fai + + allele_files + loci_files + gc_file + rt_file + downloaded_model_files + + versions = ch_versions +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf new file mode 100644 index 00000000..91c7014c --- /dev/null +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -0,0 +1,314 @@ +include { CLAIR3 } from '../../modules/local/clair3/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { CLAIRS } from '../../modules/local/clairs/main.nf' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' +include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' + +workflow TUMOR_NORMAL_HAPPHASE { + take: + mixed_bams + fasta + fai + clair3_modelMap + clairs_modelMap + downloaded_model_files + + main: + + ch_versions = Channel.empty() + tumor_only_severus = Channel.empty() + somatic_vep = Channel.empty() + germline_vep = Channel.empty() + + // Branch input bams in normal and tumour + mixed_bams + .branch{ meta, bam, bai -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set{ mixed_bams } + + // Get normal bams and add platform/model info for Clair3 usage + // remove type from so that information can be merged easier later + + downloaded_model_files + .map{ meta, file -> + def basecall_model = meta.id + return [basecall_model, meta, file] + } + .set{downloaded_model_files} + + mixed_bams.normal + .map{ meta, bam, bai -> + def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] + return [ basecall_model, new_meta, bam, bai ] + } + .set { normal_bams_model } + + normal_bams_model + .combine(downloaded_model_files,by:0) + .map{ basecall_model, meta, bam, bai, meta2, model -> + def platform = (meta.platform == "pb") ? "hifi" : "ont" + return [meta, bam, bai, model, platform] + } + .set{ normal_bams } + + // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // clair3_model: clair3 model name + // platform: name of sequencing platform + + + // Get tumour bams + // remove type from so that information can be merged easier later + mixed_bams.tumor + .map{ meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] + return[new_meta, bam, bai] + } + .set{ tumor_bams } + + // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + + // + // MODULE: CLAIR3 + // + // small germline variant calling + CLAIR3 ( + normal_bams, + fasta, + fai + ) + + ch_versions = ch_versions.mix(CLAIR3.out.versions) + + // Add germline vcf to normal bams + // remove clair3 model information + + normal_bams + .join(CLAIR3.out.vcf) + .map { meta, bam, bai, clair3_model, platform, vcf -> + def svs = [] + def mods = [] + return [meta, bam, bai, vcf, svs, mods] + } + .set{ normal_bams_germlinevcf } + + // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + CLAIR3.out.vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { germline_vep } + + // + // MODULE: LONGPHASE_PHASE + // + // Phase normals + + LONGPHASE_PHASE ( + normal_bams_germlinevcf, + fasta, + fai + ) + + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + + // Add phased vcf to normal bams + // Add type information back + // both are needed for mixing with the tumor bams + + normal_bams + .join(LONGPHASE_PHASE.out.vcf) + .map { meta, bam, bai, clair3_model, platform, vcf -> + def new_meta = meta + [type: "normal"] + def snvs = [] + def mods = [] + return[new_meta, bam, bai, vcf, snvs, mods] + } + .set{ normal_bams } + + // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + + // Add phased vcf to tumour bams and type information + // mix with the normal bams + tumor_bams + .join(LONGPHASE_PHASE.out.vcf) + .map { meta, bam, bai, vcf -> + def new_meta = meta + [type: "tumor"] + def snvs = [] + def mods = [] + return [new_meta, bam, bai, vcf, snvs, mods] + } + .mix(normal_bams) + .set{ mixed_bams_vcf } + + // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // + // MODULE: LONGPHASE_HAPLOTAG + // + // haplotag tumor and normal bams with normal vcf files for both + LONGPHASE_HAPLOTAG ( + mixed_bams_vcf, + fasta, + fai + ) + + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) + + // Get final tagged bams + LONGPHASE_HAPLOTAG.out.bam + .set{ mixed_hapbams } + + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bams: haplotagged aligned bams + + + // + // MODULE: SAMTOOLS_INDEX + // + // index the haplotaged bams + + SAMTOOLS_INDEX ( + mixed_hapbams + ) + + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + + // Add index to channel + mixed_bams_vcf + .join(mixed_hapbams) + .join(SAMTOOLS_INDEX.out.bai) + .set{ mixed_hapbams } + + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bams: haplotagged aligned bams + // bais: indexes for bam files + + // Group everything back together in one channel + mixed_hapbams + .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] + return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] + } + .groupTuple(size: 2) + .map{ meta, bam, bai -> + def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] + def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] + def normal_bai = bai[0][0].type == "normal" ? bai[0][1] : bai[1][1] + def tumor_bai = bai[0][0].type == "tumor" ? bai[0][1] : bai[1][1] + // Return channel + return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] + } + .join(LONGPHASE_PHASE.out.vcf) + .join(LONGPHASE_PHASE.out.tbi) + .set{tumor_normal_severus} + + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // tumor_bam: haplotagged aligned bam for tumor + // tumor_bai: indexes for tumor bam files + // normal_bam: haplotagged aligned bam files for normal + // normal_bai: indexes for normal bam files + // phased_vcf: phased small variant vcf for normal + + // Get ClairS input channel + tumor_normal_severus + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] + } + .set { clairs_input } + + // + // MODULE: CLAIRS + // + + CLAIRS ( + clairs_input, + fasta, + fai + ) + + CLAIRS.out.vcfs + .join(CLAIRS.out.tbi) + .set{clairs_out} + + // + // MODULE: BCFTOOLS_CONCAT + // + + BCFTOOLS_CONCAT( + clairs_out + ) + + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + + // + // MODULE: BCFTOOLS_SORT + // + + BCFTOOLS_SORT( + BCFTOOLS_CONCAT.out.vcf + ) + + ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions) + + BCFTOOLS_SORT.out.vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { somatic_vep } + + ch_versions = ch_versions.mix(CLAIRS.out.versions) + + emit: + tumor_normal_severus + somatic_vep + germline_vep + versions = ch_versions + +} diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf new file mode 100644 index 00000000..220a8710 --- /dev/null +++ b/subworkflows/local/tumor_only_happhase.nf @@ -0,0 +1,199 @@ +include { CLAIRSTO } from '../../modules/local/clairsto/main.nf' +include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' + +workflow TUMOR_ONLY_HAPPHASE { + + take: + tumor_bams + fasta + fai + clairSTO_modelMap + dbsnp + colors + onekgenomes + gnomad + + main: + + ch_versions = Channel.empty() + tumor_only_severus = Channel.empty() + somatic_vep = Channel.empty() + germline_vep = Channel.empty() + + tumor_bams + .map{ meta, bam, bai -> + def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model + return [meta, bam, bai, clairSTO_model] + } + .set{ tumor_bams } + + // + // MODULE: CLAIRSTO + // + // call somatic/non-somatic variants + // (* not called as germline * just non-somatic) + + CLAIRSTO ( + tumor_bams, + fasta, + fai, + dbsnp, + colors, + onekgenomes, + gnomad + ) + + ch_versions = ch_versions.mix(CLAIRSTO.out.versions) + + CLAIRSTO.out.indel_vcf + .join(CLAIRSTO.out.snv_vcf) + .set{ clairsto_vcf } + + ch_versions = ch_versions.mix(CLAIRSTO.out.versions) + // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // indel_vcf: vcf for indels + // snv_vcf: vcf for snvs + + // + // MODULE: VCFSPLIT + // + // ClairSTO gives outputs in snv.vcf and indel.vcf + // reformats them to be in somatic.vcf and nonsomatic.vcf + + VCFSPLIT ( + clairsto_vcf + ) + ch_versions = ch_versions.mix(VCFSPLIT.out.versions) + + ch_versions = ch_versions.mix(VCFSPLIT.out.versions) + + // Add the nonsomatic vcf info + // remove model info + tumor_bams + .join(VCFSPLIT.out.germline_vcf) + .map{ meta, bam, bai, model, snps -> + def svs = [] + def mods = [] + return[meta, bam, bai, snps, svs, mods] + } + .set{ tumor_bams_germlinevcf } + + + VCFSPLIT.out.somatic_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { somatic_vep } + + VCFSPLIT.out.germline_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { germline_vep } + + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: tumor small nonsomatic variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // + // MODULES: LONGPHASE_PHASE + // + // Phase tumor bams on nonsomatic vcf + + LONGPHASE_PHASE ( + tumor_bams_germlinevcf, + fasta, + fai + ) + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + + // Add phased nonsomatic vcf info + // remove model info + tumor_bams + .join(LONGPHASE_PHASE.out.vcf) + .map{ meta, bam, bai, model, snps -> + def svs = [] + def mods = [] + return [meta, bam, bai, snps, svs, mods] + } + .set{ tumor_bams_phasedvcf } + + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: phased tumor small nonsomatic variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // + // MODULES: LONGPHASE_HAPLOTAG + // + // Haplotag the tumor bams + + LONGPHASE_HAPLOTAG ( + tumor_bams_phasedvcf, + fasta, + fai + ) + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) + + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) + + // grab phased bams + LONGPHASE_HAPLOTAG.out.bam + .set{ haplotagged_bams } + + // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bams: list of concatenated aligned bams + + // + // MODULES: SAMTOOLS_INDEX + // + // index the haplotagged bams + SAMTOOLS_INDEX ( + haplotagged_bams + ) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + + // join information and the phased VCF file + haplotagged_bams + .join(SAMTOOLS_INDEX.out.bai) + .join(LONGPHASE_PHASE.out.vcf) + .join(LONGPHASE_PHASE.out.tbi) + .map{ meta, hap_bam, hap_bai, vcf, tbi -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model] + return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] + } + .set{ tumor_only_severus } + + // tumor_only_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // hap_bam: haplotagged aligned bam for tumor + // hap_bai: indexes for tumor bam files + // normal_bam: haplotagged aligned bam files for normal (empty) + // normal_bai: indexes for normal bam files (empty) + // phased_vcf: phased small variant vcf + + emit: + tumor_only_severus + somatic_vep + germline_vep + versions = ch_versions + +} diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf similarity index 75% rename from subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf rename to subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index d366b8f6..d7d151a1 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -1,5 +1,5 @@ // -// Subworkflow with functionality specific to the IntGenomicsLab/lr_somatic pipeline +// Subworkflow with functionality specific to the IntGenomicsLab/lrsomatic pipeline // /* @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,10 +33,13 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -50,10 +54,18 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + "", + "", + command ) // @@ -72,26 +84,37 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] - } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] - } + .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> + def real_clair3_model = (clair3_model == null ) ? null : clair3_model + def real_clairS_model = (clairS_model == null ) ? null : clairS_model + def real_clairSTO_model = (clairSTO_model == null ) ? null : clairSTO_model + def paired_data = bam_normal ? true : false + def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] + return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } - .groupTuple() - .map { samplesheet -> - validateInputSamplesheet(samplesheet) + .map { meta, bam_tumor, bam_normal -> + [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } - .map { - meta, fastqs -> - return [ meta, fastqs.flatten() ] + .flatMap { meta, tumor_bam, normal_bam -> + def meta_tumor = meta.clone() + meta_tumor.type = 'tumor' + def result = [[meta_tumor, tumor_bam]] + + if (normal_bam) { + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam] + } + + return result } .set { ch_samplesheet } + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] + // bam: unaligned bams + emit: samplesheet = ch_samplesheet versions = ch_versions @@ -161,7 +184,7 @@ def validateInputParameters() { // Validate channels from input samplesheet // def validateInputSamplesheet(input) { - def (metas, fastqs) = input[1..2] + def (metas, bams) = input[1..2] // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end def endedness_ok = metas.collect{ meta -> meta.single_end }.unique().size == 1 @@ -169,7 +192,7 @@ def validateInputSamplesheet(input) { error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") } - return [ metas[0], fastqs ] + return [ metas[0], bams ] } // // Get attribute from genome config file e.g. fasta @@ -200,24 +223,25 @@ def genomeExistsError() { // Generate methods description for MultiQC // def toolCitationText() { - // TODO nf-core: Optionally add in-text citation tools to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", - "MultiQC (Ewels et al. 2016)", - "." + "MultiQC (Ewels et al. 2016),", + "Samtools (Li et al. 2009),", + "Mosdepth (Pedersen and Quinlan 2018)." ].join(' ').trim() return citation_text } def toolBibliographyText() { - // TODO nf-core: Optionally add bibliographic entries to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - "
  • Ewels, P., Magnusson, M., Lundin, S., & KΓ€ller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + "
  • Ewels, P., Magnusson, M., Lundin, S., & KΓ€ller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • ", + "
  • Li, H., Handsaker, B., Wysoker, A., Fennell, T., Ruan, J., Homer, N., ... & Durbin, R. (2009). The Sequence Alignment/Map format and SAMtools. Bioinformatics, 25(16), 2078-2079. doi: 10.1093/bioinformatics/btp352
  • ", + "
  • Pedersen, B. S., & Quinlan, A. R. (2018). Mosdepth: quick coverage calculation for genomes and exomes. Bioinformatics, 34(5), 867-868. doi: 10.1093/bioinformatics/btx699
  • " ].join(' ').trim() return reference_text @@ -247,9 +271,8 @@ def methodsDescriptionText(mqc_methods_yaml) { meta["tool_citations"] = "" meta["tool_bibliography"] = "" - // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - // meta["tool_bibliography"] = toolBibliographyText() + meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + meta["tool_bibliography"] = toolBibliographyText() def methods_text = mqc_methods_yaml.text @@ -259,4 +282,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf new file mode 100644 index 00000000..44d4c010 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -0,0 +1,32 @@ +// +// Run SAMtools stats, flagstat and idxstats +// + +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' + +workflow BAM_STATS_SAMTOOLS { + take: + ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [ val(meta), path(fasta) ] + + main: + ch_versions = Channel.empty() + + SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) + + SAMTOOLS_FLAGSTAT ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) + + SAMTOOLS_IDXSTATS ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) + + emit: + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] + + versions = ch_versions // channel: [ path(versions.yml) ] +} diff --git a/subworkflows/nf-core/bam_stats_samtools/meta.yml b/subworkflows/nf-core/bam_stats_samtools/meta.yml new file mode 100644 index 00000000..809bf736 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/meta.yml @@ -0,0 +1,43 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: bam_stats_samtools +description: Produces comprehensive statistics from SAM/BAM/CRAM file +keywords: + - statistics + - counts + - bam + - sam + - cram +components: + - samtools/stats + - samtools/idxstats + - samtools/flagstat +input: + - ch_bam_bai: + description: | + The input channel containing the BAM/CRAM and it's index + Structure: [ val(meta), path(bam), path(bai) ] + - ch_fasta: + description: | + Reference genome fasta file + Structure: [ path(fasta) ] +output: + - stats: + description: | + File containing samtools stats output + Structure: [ val(meta), path(stats) ] + - flagstat: + description: | + File containing samtools flagstat output + Structure: [ val(meta), path(flagstat) ] + - idxstats: + description: | + File containing samtools idxstats output + Structure: [ val(meta), path(idxstats)] + - versions: + description: | + Files containing software versions + Structure: [ path(versions.yml) ] +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test new file mode 100644 index 00000000..76e7a40a --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -0,0 +1,188 @@ +nextflow_workflow { + + name "Test Workflow BAM_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_STATS_SAMTOOLS" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "bam_stats_samtools" + tag "subworkflows/bam_stats_samtools" + tag "samtools" + tag "samtools/flagstat" + tag "samtools/idxstats" + tag "samtools/stats" + + test("test_bam_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test ("test_bam_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 00000000..8ca22526 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,350 @@ +{ + "test_bam_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:35.660286921" + }, + "test_bam_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:24.220305512" + }, + "test_bam_stats_samtools_paired_end_cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:54.206770141" + }, + "test_bam_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,291bb2393ec947140d12d42c2795b222" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:07:49.731645858" + }, + "test_bam_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,8140d69cdedd77570ca1d7618a744e16" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:01.421996172" + }, + "test_bam_stats_samtools_paired_end_cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,a53f3d26e2e9851f7d528442bbfe9781" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,1622856127bafd6cdbadee9cd64ec9b7" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:12.640915756" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303e..ee4738c8 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb30164..c977917a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..8d8c7371 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..9651e78a --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,20 @@ +.DS_Store +multiqc/multiqc_data/multiqc.parquet +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +multiqc/multiqc_data/*.txt +multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} +pipeline_info/*.{html,json,txt,yml} +*/vep/{SVs,germline,somatic}/*.{vcf.gz,html,vcf.gz.tbi} +*/variants/clair3/merge_output.{vcf.gz,vcf.gz.tbi} +*/variants/clairs/*.{vcf.gz,vcf.gz.tbi} +*/variants/clairsto/*.{vcf.gz,vcf.gz.tbi} +*/variants/severus/read_ids.csv +*/variants/severus/severus.log +*/variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} +*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..d4daad19 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,33 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_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 00000000..e8071e7c --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,374 @@ +{ + "-profile test": { + "content": [ + { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.1" + }, + "CLAIRSTO": { + "clairsto": "0.4.0" + }, + "CRAMINO_POST": { + "cramino": "1.0.0" + }, + "CRAMINO_PRE": { + "cramino": "1.0.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "1.7.3" + }, + "LONGPHASE_PHASE": { + "longphase": "1.7.3" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283", + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_FAIDX": { + "samtools": 1.21 + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.21 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.21 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.21 + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "vcfsplit": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.0.0" + } + }, + [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam", + "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam", + "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam", + "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam", + "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam", + "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + ], + [ + "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", + "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", + "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", + "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", + "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", + "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", + "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", + "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", + "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", + "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", + "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", + "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", + "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", + "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", + "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", + "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", + "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", + "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", + "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", + "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", + "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", + "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", + "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", + "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.0" + }, + "timestamp": "2025-11-28T14:26:44.508445086" + } +} \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..59f352c4 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,14 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/lrsomatic' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf deleted file mode 100644 index 922fbf25..00000000 --- a/workflows/lr_somatic.nf +++ /dev/null @@ -1,88 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN MAIN WORKFLOW -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -workflow LR_SOMATIC { - - take: - ch_samplesheet // channel: samplesheet read in from --input - main: - - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() - - // - // Collate and save software versions - // - softwareVersionsToYAML(ch_versions) - .collectFile( - storeDir: "${params.outdir}/pipeline_info", - name: 'lr_somatic_software_' + 'mqc_' + 'versions.yml', - sort: true, - newLine: true - ).set { ch_collated_versions } - - - // - // MODULE: MultiQC - // - ch_multiqc_config = Channel.fromPath( - "$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() - ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() - - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? - file(params.multiqc_methods_description, checkIfExists: true) : - file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( - methodsDescriptionText(ch_multiqc_custom_methods_description)) - - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix( - ch_methods_description.collectFile( - name: 'methods_description_mqc.yaml', - sort: true - ) - ) - - MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList(), - [], - [] - ) - - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html - versions = ch_versions // channel: [ path(versions.yml) ] - -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf new file mode 100644 index 00000000..2b84c973 --- /dev/null +++ b/workflows/lrsomatic.nf @@ -0,0 +1,665 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' + +// +// IMPORT MODULES +// +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +// +// IMPORT SUBWORKFLOWS +// +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' + + + + + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RUN MAIN WORKFLOW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +workflow LRSOMATIC { + + take: + ch_samplesheet // channel: samplesheet read in from --input + // Channel format is [[meta], [bam]]. + // Where [meta] is [id, paired_data, method, specs, type] + + main: + + def clair3_modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'r1041_e82_400bps_sup_v520', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + 'hifi_revio' : 'hifi_revio' + ] + + def clairs_modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + + // Load in igenomes + params.fasta = getGenomeAttribute('fasta') + params.genome_name = getGenomeAttribute('genome_name') + params.ascat_allele_files = getGenomeAttribute('ascat_alleles') + params.ascat_loci_files = getGenomeAttribute('ascat_loci') + params.centromere_bed = getGenomeAttribute('centromere_bed') + params.pon_file = getGenomeAttribute('pon_file') + params.bed_file = getGenomeAttribute('bed_file') + params.vep_genome = getGenomeAttribute('vep_genome') + params.vep_species = getGenomeAttribute('vep_species') + params.dbsnp = getGenomeAttribute('dbsnp') + params.colors = getGenomeAttribute('colors') + params.onekgenomes = getGenomeAttribute('onekgenomes') + params.gnomad = getGenomeAttribute('gnomad') + + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() + + // + // MODULE: METAEXTRACT + // + // extracts the base calling model from the bam files + + METAEXTRACT( ch_samplesheet ) + + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) + basecall_meta = METAEXTRACT.out.meta_ext + // Adds the base calling model to meta.basecall_model + + ch_samplesheet + .join(basecall_meta) + .map { meta, bam, basecall_model_meta, kinetics_meta -> + def meta_new = meta + [ basecall_model: basecall_model_meta, kinetics: kinetics_meta] + return[ meta_new, bam ] + } + .groupTuple() + .map { meta, bam -> + [ meta, bam.flatten()] + } + .set{ch_samplesheet} + + + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of unaligned bams + + ch_split = ch_samplesheet + .branch { meta, bam -> + single: bam.size() == 1 + multiple: bam.size() > 1 + } + + // + // MODULE: SAMTOOLS_CAT + // + // concatenates bam files from single sample + + SAMTOOLS_CAT ( ch_split.multiple ) + .bam + .mix ( ch_split.single ) + .set { ch_cat_ubams } + + + // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated unaligned bams + + ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) + + // + // MODULE: CRAMINO + // + // QC the unaligned bams + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_PRE ( ch_cat_ubams ) + + ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) + } + + + // + // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // + + PREPARE_REFERENCE_FILES ( + params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_files, + params.ascat_rt_files, + basecall_meta, + clair3_modelMap + ) + + vep_cache = Channel.empty() + + if (!params.skip_vep) { + + Channel + .of([ + vep_cache: params.vep_cache, + vep_cache_version: params.vep_cache_version, + vep_genome: params.vep_genome, + vep_args: params.vep_args, + vep_species: params.vep_species, + download_vep_cache: params.download_vep_cache + ]) + + PREPARE_ANNOTATION ( + params.vep_cache, + params.vep_cache_version, + params.vep_genome, + params.vep_args, + params.vep_species, + params.download_vep_cache + ) + ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) + vep_cache = PREPARE_ANNOTATION.out.vep_cache + + } + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) + ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta + ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + + downloaded_model_files = PREPARE_REFERENCE_FILES.out.downloaded_model_files + + // ASCAT files + allele_files = PREPARE_REFERENCE_FILES.out.allele_files + loci_files = PREPARE_REFERENCE_FILES.out.loci_files + gc_file = PREPARE_REFERENCE_FILES.out.gc_file + rt_file = PREPARE_REFERENCE_FILES.out.rt_file + + // + // MODULE: FIBERTOOLSRS_PREDICTM6A + // + // predict m6a in unaligned bam + + if (!params.skip_fiber) { + if(!params.normal_fiber){ + ch_cat_ubams + .branch { meta, bams -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set { ch_cat_ubams_normal_branching } + + normal_bams = ch_cat_ubams_normal_branching.normal + ubams = ch_cat_ubams_normal_branching.tumor + } + else { + ubams = ch_cat_ubams + } + ubams + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams_pacbio_ont_branching} + + pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} + + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} + + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + + ch_cat_ubams_pacbio_ont_branching.ont + .mix(predicted_bams) + .set{fiber_branch} + + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + + // + // MODULE: FIBERTOOLSRS_FIRE + // + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + + if(!params.normal_fiber){ + fiber_branch.nonFiber + .mix(normal_bams) + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + + } + else { + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + + } + + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + } + + } + // + // MODULE: MINIMAP2_ALIGN + // + // Aligns ubams + + MINIMAP2_ALIGN ( + ch_cat_ubams, + ch_fasta, + true, + 'bai', + "", + "" + ) + MINIMAP2_ALIGN.out.bam + .set { ch_minimap_bam } + + + // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] + // bam: list of concatenated aligned bams + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + + + // ch_minimap_bams into tumor and paired to phase the paired ones on normal + // and add index + + ch_minimap_bam + .join(MINIMAP2_ALIGN.out.index) + .branch { meta, bams, bais -> + paired: meta.paired_data + tumor_only: !meta.paired_data + } + .set { branched_minimap } + + + // branched_minimap -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bais: indexes for bam files + + // + // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE + // + // Phasing/haplotaging/small germline variant calling for tumor-normal samples + + TUMOR_NORMAL_HAPPHASE ( + branched_minimap.paired, + ch_fasta, + ch_fai, + clair3_modelMap, + clairs_modelMap, + downloaded_model_files + ) + + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + + // + // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE + // + // Phasing/haplotagging for tumor only samples + + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + + + TUMOR_ONLY_HAPPHASE ( + branched_minimap.tumor_only, + ch_fasta, + ch_fai, + clairs_modelMap, + dbsnp, + colors, + onekgenomes, + gnomad + ) + + germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) + somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + + if (!params.skip_vep) { + // + // MODULE: GERMLINE_VEP + // + if (params.vep_custom != null) { + vep_custom = file(params.vep_custom) + } else { + vep_custom = [] + } + if (params.vep_custom_tbi != null) { + vep_custom_tbi = file(params.vep_custom_tbi) + } else { + vep_custom_tbi = [] + } + GERMLINE_VEP ( + germline_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) + + // + // MODULE: SOMATIC_VEP + // + + SOMATIC_VEP ( + somatic_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) + } + + + ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) + + // Get Severus input channel + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .set { severus_reformat } + // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + + // + // MODULE: SEVERUS + // + + SEVERUS ( + severus_reformat, + [[:], params.bed_file, params.pon_file] + ) + + + + ch_versions = ch_versions.mix(SEVERUS.out.versions) + + SEVERUS.out.all_vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { sv_vep } + + if(!params.skip_vep) { + SV_VEP ( + sv_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SV_VEP.out.versions) + } + + // + // MODULE: CRAMINO + // + + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_POST ( ch_minimap_bam ) + + ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + } + + // + // Module: MOSDEPTH + // + + ch_mosdepth_global = Channel.empty() + ch_mosdepth_summary = Channel.empty() + + if (!params.skip_qc && !params.skip_mosdepth) { + + // prepare mosdepth input channel: we need to specify compulsory path to bed as well + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + .map { meta, bam, bai -> [meta, bam, bai, []] } + .set { ch_mosdepth_in } + + MOSDEPTH ( + ch_mosdepth_in, + ch_fasta + ) + + ch_mosdepth_global = MOSDEPTH.out.global_txt + ch_mosdepth_summary = MOSDEPTH.out.summary_txt + + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + } + + // + // SUBWORKFLOW: BAM_STATS_SAMTOOLS + // + ch_bam_stats = Channel.empty() + ch_bam_flagstat = Channel.empty() + ch_bam_idxstats = Channel.empty() + + if (!params.skip_qc && !params.skip_bamstats ) { + + BAM_STATS_SAMTOOLS ( + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_fasta + ) + + bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats + bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat + bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats + + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + } + + // + // MODULE: ASCAT + // + + if (!params.skip_ascat) { + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set { ascat_ch } + + ASCAT ( + ascat_ch, + params.genome_name, + allele_files, + loci_files, + [], + [], + [], + [] + ) + + ch_versions = ch_versions.mix(ASCAT.out.versions) + } + + // + // MODULE: WAKHAN + // + + if (!params.skip_wakhan) { + + // Prepare input channel for WAKHAN + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] + } + .join(SEVERUS.out.all_vcf) + .set { wakhan_input } + + WAKHAN ( + wakhan_input, + ch_fasta + ) + + ch_versions = ch_versions.mix(WAKHAN.out.versions) + } + + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', + sort: true, + newLine: true + ).set { ch_collated_versions } + + + // + // MODULE: MultiQC + // + ch_multiqc_config = Channel.fromPath( + "$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() + ch_multiqc_logo = params.multiqc_logo ? + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() + + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? + file(params.multiqc_methods_description, checkIfExists: true) : + file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) + ch_methods_description = Channel.value( + methodsDescriptionText(ch_multiqc_custom_methods_description)) + + ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) + ch_multiqc_files = ch_multiqc_files.mix( + ch_methods_description.collectFile( + name: 'methods_description_mqc.yaml', + sort: true + ) + ) + + // Collect MultiQC files + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it[1]}.ifEmpty([])) + + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it[1]}.ifEmpty([])) + + + MULTIQC ( + ch_multiqc_files.collect(), + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList(), + [], + [] + ) + + emit: + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] + + + +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + THE END +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/