diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml index e2833ee9..2f6859ce 100644 --- a/.github/actions/get-shards/action.yml +++ b/.github/actions/get-shards/action.yml @@ -21,7 +21,7 @@ runs: using: "composite" steps: - name: Install nf-test - uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + uses: nf-core/setup-nf-test@v2 with: version: ${{ env.NFT_VER }} - name: Get number of shards diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 4175e3c8..ba7095e8 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -20,24 +20,24 @@ runs: using: "composite" steps: - name: Setup Nextflow - uses: nf-core/setup-nextflow@893c28b667aedeba26e37f296d260ccc5bc4d914 # v3 + uses: nf-core/setup-nextflow@v3 with: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7 with: - python-version: "3.14" + python-version: "3.15" - name: Install nf-test - uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 + uses: nf-core/setup-nf-test@v2 with: version: "${{ env.NFT_VER }}" install-pdiff: true - name: Setup apptainer if: contains(inputs.profile, 'singularity') - uses: eWaterCycle/setup-apptainer@3f706d898c9db585b1d741b4692e66755f3a1b40 # v2.0.0 + uses: eWaterCycle/setup-apptainer@3f706d898c9db585b1d741b4692e66755f3a1b40 # v2 - name: Set up Singularity if: contains(inputs.profile, 'singularity') @@ -48,7 +48,7 @@ runs: - name: Conda setup if: contains(inputs.profile, 'conda') - uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4 + uses: conda-incubator/setup-miniconda@be893c923ea9cf1cf7cd510fbdde27c7e18cbdcb # v4.1.0 with: auto-update-conda: true conda-solver: libmamba diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 7626b4a5..8414993e 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -56,7 +56,7 @@ jobs: - name: Upload PR comment artifact if: failure() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: pr-comment path: pr-comment/ diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ca2eb822..8d2d4f7c 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -42,18 +42,18 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install Nextflow - uses: nf-core/setup-nextflow@893c28b667aedeba26e37f296d260ccc5bc4d914 # v3 + uses: nf-core/setup-nextflow@v3 - name: Disk space cleanup - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + uses: jlumbroso/free-disk-space@ceedf095f4ec1a097402bc6bd80831f2e1a6fde6 # v2.0.0 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7 with: - python-version: "3.14" + python-version: "3.15" architecture: "x64" - name: Setup Apptainer - uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 + uses: eWaterCycle/setup-apptainer@3f706d898c9db585b1d741b4692e66755f3a1b40 # v2 with: apptainer-version: 1.3.4 @@ -135,7 +135,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml new file mode 100644 index 00000000..81ac1812 --- /dev/null +++ b/.github/workflows/fix-linting.yml @@ -0,0 +1,21 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] # Add "@nf-core-bot fix linting" as a PR comment to trigger this workflow. + +concurrency: + group: ${{ github.workflow }}-${{ github.event.issue.number }} + +jobs: + fix-linting: + uses: nf-core/actions/.github/workflows/fix-linting.yml@v1 + with: + nextflow-versions: '["25.10.4","latest-everything"]' + permissions: + actions: read + contents: read + issues: write + pull-requests: write + + secrets: + BOT_TOKEN: ${{ secrets.nf_core_bot_auth_token }} diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml deleted file mode 100644 index 61394953..00000000 --- a/.github/workflows/fix_linting.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Fix linting from a comment -on: - issue_comment: - types: [created] - -jobs: - fix-linting: - # Only run if comment is on a PR with the main repo, and if it contains the magic keywords - if: > - contains(github.event.comment.html_url, '/pull/') && - contains(github.event.comment.body, '@nf-core-bot fix linting') && - 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@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - token: ${{ secrets.nf_core_bot_auth_token }} - - # indication that the linting is being fixed - - name: React on comment - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: eyes - - # Action runs on the issue comment, so we don't get the PR by default - # Use the gh cli to check out the PR - - name: Checkout Pull Request - run: gh pr checkout ${{ github.event.issue.number }} - env: - GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - - name: Install Nextflow - uses: nf-core/setup-nextflow@893c28b667aedeba26e37f296d260ccc5bc4d914 # v3 - - # Install and run prek - - name: Run prek - id: prek - uses: j178/prek-action@5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16 # v2 - continue-on-error: true - - # indication that the linting has finished - - name: react if linting finished succesfully - if: steps.prek.outcome == 'success' - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: "+1" - - - name: Commit & push changes - id: commit-and-push - if: steps.prek.outcome == 'failure' - run: | - git config user.email "core@nf-co.re" - git config user.name "nf-core-bot" - git config push.default upstream - git add . - git status - git commit -m "[automated] Fix code linting" - git push - - - name: react if linting errors were fixed - id: react-if-fixed - if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@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@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@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/lrsomatic/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 7ca0ebd9..084489f4 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install Nextflow - uses: nf-core/setup-nextflow@893c28b667aedeba26e37f296d260ccc5bc4d914 # v3 + uses: nf-core/setup-nextflow@v3 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: @@ -37,15 +37,15 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install Nextflow - uses: nf-core/setup-nextflow@893c28b667aedeba26e37f296d260ccc5bc4d914 # v3 + uses: nf-core/setup-nextflow@v3 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7 with: - python-version: "3.14" + python-version: "3.15" architecture: "x64" - name: Setup uv - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 - name: read .nf-core.yml uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 @@ -78,7 +78,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: linting-logs path: | @@ -99,7 +99,7 @@ jobs: - name: Upload PR comment artifact if: ${{ always() }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: pr-comment path: pr-comment/ diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 73d02998..8a0ef6a0 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -127,7 +127,7 @@ jobs: - name: Upload PR comment fragment if: ${{ always() && steps.run_nf_test.outcome == 'failure' && matrix.NXF_VER == 'latest-everything' }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: name: pr-comment-fragment-${{ strategy.job-index }} path: pr-comment-fragment/ @@ -160,7 +160,7 @@ jobs: - name: Download PR comment fragments if: ${{ always() }} - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 continue-on-error: true with: pattern: pr-comment-fragment-* @@ -194,7 +194,7 @@ jobs: - name: Upload PR comment artifact if: ${{ always() }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7 with: name: pr-comment path: pr-comment/ diff --git a/.github/workflows/pr-comment.yml b/.github/workflows/pr-comment.yml index ab7b59dd..093fa638 100644 --- a/.github/workflows/pr-comment.yml +++ b/.github/workflows/pr-comment.yml @@ -31,7 +31,7 @@ jobs: if: github.event.workflow_run.event == 'pull_request' steps: - name: Download PR comment artifact - uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 + uses: dawidd6/action-download-artifact@eab87c9830c39eff17e5a6eadb20bfb4bc880477 # v27 with: run_id: ${{ github.event.workflow_run.id }} name: pr-comment diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index 149e2851..775758ba 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -54,7 +54,7 @@ jobs: fi - name: Upload PR comment artifact - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: pr-comment path: pr-comment/ diff --git a/.nf-core.yml b/.nf-core.yml index f61b2031..80c387b7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -32,7 +32,7 @@ lint: # a -preview run publishes nothing, so this test asserts on the workflow graph instead of a versions.yml snapshot nf_test_content: - tests/sv_annotation_compose.nf.test -nf_core_version: 4.1.0 +nf_core_version: 4.2.1 repository_type: pipeline template: author: Robert Forsyth & Luuk Harbers diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a83210cc..bfd4fd2c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.9.6 + - prettier@3.9.10 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..8389b2db --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,12 @@ +{ + // See https://github.com/nf-core/vscode-extensionpack + "recommendations": [ + "codezombiech.gitignore", + "esbenp.prettier-vscode", + "jebbs.markdown-extended", + "mechatroner.rainbow-csv", + "nextflow.nextflow", + "onnovalkering.vscode-singularity", + "redhat.vscode-yaml" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index a33b527c..a0033586 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "markdown.styles": ["public/vscode_markdown.css"] + // Render nf-core website admonitions nicely in markdown previews + "markdown.styles": ["https://nf-co.re/vscode_markdown.css"] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 250d345f..5a5b86b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Changed` +- [#224](https://github.com/IntGenomicsLab/lrsomatic/pull/224) - Updated to the nf-core template for [nf-core/tools 4.2.1](https://github.com/nf-core/tools/releases/tag/4.2.1). Bumps nf-schema to 2.7.3 (needed for Nextflow 26.04) and nft-utils to 1.2.1, sets `manifest.diagram` to the existing metro map (`assets/lrsomatic_1.0.png`), replaces `fix_linting.yml` with the reusable `fix-linting.yml` from nf-core/actions, adds recommended VS Code extensions, and stops `workflow.onComplete` from blocking on the MultiQC report. The linting workflow keeps running plain `pre-commit` rather than the template's prek-action (@ljwharbers). +- [#224](https://github.com/IntGenomicsLab/lrsomatic/pull/224) - Dropped `ext.use_gpu` from the GPU resource labels, following the template. `CLAIR3` now reads `params.use_gpu` instead of `task.ext.use_gpu`, the same param that picks its label and container, as DeepVariant, DeepSomatic and fibertools already do (@ljwharbers). - [#204](https://github.com/IntGenomicsLab/lrsomatic/pull/204) - With `--modkit_phased` set and haplotype DMR running, `5hmC` is appended to `--modified-bases` whenever `--modkit_args` names `5mC` without it, so the published `modkit_pileup/*_{hp1,hp2,combined}.bed.gz` now carry a 5hmC row next to each 5mC row. `modkit dmr pair` rejects bedMethyl rows whose valid coverage includes uncounted (`N_other`) calls, which ONT SUP data calling both 5mC and 5hmC produces under the `--cpg --modified-bases 5mC` default. Runs with `--skip_dmr`, without `--modkit_phased`, or without DMR references keep `--modkit_args` exactly as given (@YannVRB). - [#205](https://github.com/IntGenomicsLab/lrsomatic/pull/205) - Moved the fiber-seq steps into a `FIBERSEQ` subworkflow and the AmpliconArchitect MD5 default into `aaDataRepoMd5()`, because with dev merged the `LRSOMATIC` workflow body exceeded the 65,535-character limit on a compiled string and failed to compile; behaviour is unchanged (@robert-a-forsyth). - [#205](https://github.com/IntGenomicsLab/lrsomatic/pull/205) - `--download_sigprofiler_genome` now defaults to `true`, so a run without `--sigprofiler_genome_dir` installs the SigProfiler genome instead of stopping at launch; a given directory still wins (@robert-a-forsyth). @@ -61,6 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` +- [#224](https://github.com/IntGenomicsLab/lrsomatic/pull/224) - Fixed `CLAIR3` with `--use_gpu`, which failed at start with "Reference index fai file not found". The GPU image `hkubal/clair3:v2.0.2_gpu` follows the reference symlink and looks for the `.fai` next to the real file, but Nextflow stages the index from a different task. The GPU image is now `hkubal/clair3:v2.0.5_gpu`, which has the fix and bundles the same models. CPU runs keep the 2.0.3 biocontainer. The image doesn't run on GPUs newer than compute capability 9.0, such as the B200. `docs/usage.md` and the schema now say so and list every tool that `--use_gpu` affects (@ljwharbers). - [#223](https://github.com/IntGenomicsLab/lrsomatic/pull/223) - Fixed the Severus input channel (@robert-a-forsyth). - [#205](https://github.com/IntGenomicsLab/lrsomatic/pull/205) - `PREPARE_AA_DATA_REPO` no longer reads a `versions` output `UNTAR` does not have, which crashed every default GRCh38 run with CoRAL; overriding `--aa_data_repo_url` drops the genome's default MD5 (@robert-a-forsyth). - [#205](https://github.com/IntGenomicsLab/lrsomatic/pull/205) - `-profile test_full` starts again: it skips CoRAL and signatures and carries the chr19 SAVANA workarounds from `test` (@robert-a-forsyth). @@ -112,12 +115,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#213](https://github.com/IntGenomicsLab/lrsomatic/pull/213) - Updated the small variant callers. **Germline and somatic calls change** with the new models (@ljwharbers). - | Tool | Old | New | Notes | - | ------------- | ----- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `clair3` | 1.2.0 | 2.0.3 | Clair3 v2 runs on PyTorch and **cannot read the v1 TensorFlow models** the pipeline downloaded from ONT's CDN. Models bundled with the image (HKU's and ONT's recent R10.4.1 SUP/HAC ones, `hifi_revio`) are now used from the image with no download; other models are fetched as PyTorch directories from HKU (ONT's Rerio catalogue for `r9`/`r10` names) by the new `CLAIR3_MODEL` step, which replaces `WGET`/`UNTAR` and, unlike `WGET`, checks the TLS certificate (Clair3 unpickles the files). The GPU image is `hkubal/clair3:v2.0.2_gpu`, the newest published | - | `clairs` | 0.4.4 | 0.5.1 | Bundles Clair3 2.0.3 for its germline step | - | `deepvariant` | 1.9.0 | 1.10.0 | nf-core update; `make_examples` now takes its flags from the model (`--checkpoint`): the ONT model is 199 wide with the new fuzzy channel, and both models call easy sites with the small model | - | `deepsomatic` | 1.7.0 | 1.10.0 | `make_examples_somatic` now takes its flags from the model (`--checkpoint`) instead of a hard-coded channel list and pileup width; the paired PacBio model is 147 wide with 9 channels. The small model is kept off explicitly (`--nocall_small_model_examples`), because the module does not pass its calls on | + | Tool | Old | New | Notes | + | ------------- | ----- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `clair3` | 1.2.0 | 2.0.3 | Clair3 v2 runs on PyTorch and **cannot read the v1 TensorFlow models** the pipeline downloaded from ONT's CDN. Models bundled with the image (HKU's and ONT's recent R10.4.1 SUP/HAC ones, `hifi_revio`) are now used from the image with no download; other models are fetched as PyTorch directories from HKU (ONT's Rerio catalogue for `r9`/`r10` names) by the new `CLAIR3_MODEL` step, which replaces `WGET`/`UNTAR` and, unlike `WGET`, checks the TLS certificate (Clair3 unpickles the files). The GPU image is `hkubal/clair3:v2.0.5_gpu` (was `v2.0.2_gpu` until #224; see Fixed) | + | `clairs` | 0.4.4 | 0.5.1 | Bundles Clair3 2.0.3 for its germline step | + | `deepvariant` | 1.9.0 | 1.10.0 | nf-core update; `make_examples` now takes its flags from the model (`--checkpoint`): the ONT model is 199 wide with the new fuzzy channel, and both models call easy sites with the small model | + | `deepsomatic` | 1.7.0 | 1.10.0 | `make_examples_somatic` now takes its flags from the model (`--checkpoint`) instead of a hard-coded channel list and pileup width; the paired PacBio model is 147 wide with 9 channels. The small model is kept off explicitly (`--nocall_small_model_examples`), because the module does not pass its calls on | - [#214](https://github.com/IntGenomicsLab/lrsomatic/pull/214) - Updated Wakhan from 0.4.4 to 0.5.0, run from `docker.io/ljwharbers/wakhan:0.5.0-histfix-1afd44d` (`oras://docker.io/ljwharbers/wakhan-sif:0.5.0-histfix-1afd44d` for Singularity/Apptainer) because no biocontainer was built for it. The image carries upstream commit 1afd44d4, which fixes the `IndexError` in `update_coverage_hist` that killed WAKHAN on some samples (KolmogorovLab/Wakhan#64). **The `wakhan/` output layout changes**: each solution is now `solution_{ploidy}_{purity}_{confidence}/` with `integer_profile.{bed,vcf,html,pdf}` (one boundary-aligned table for both haplotypes, replacing the two `*_HP_{1,2}.bed` files), `subclonal_profile.*`, `genes/genes_copynumber_states.*` and a `HiScanner_plots_data.zip` for the Wakhan web viewer; ranked solutions are `solution_rank_{n}`. Wakhan 0.5.0 no longer writes the per-chromosome `variation_plots`, `genome_copynumbers_details` plots or per-solution `loh_regions*.bed`. `LRSOMATICREPORT` now runs lrsomatic_report v1.6.1 (`ghcr.io/ljwharbers/lrsomatic-report:1.6.1`), which finds the copy-number plots in both layouts; v1.6.0 silently dropped them for 0.5.0 output. The WAKHAN stub now writes the outputs the module declares, and the version comes from `wakhan --version` (@ljwharbers). diff --git a/README.md b/README.md index 761ae695..a8387f74 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-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-4.1.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.1.0) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-4.2.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.2.1) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) diff --git a/conf/base.config b/conf/base.config index d825db31..c12468aa 100644 --- a/conf/base.config +++ b/conf/base.config @@ -27,21 +27,18 @@ process { // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_gpu_high { - ext.use_gpu = { params.use_gpu as boolean } accelerator = { (params.use_gpu as boolean) ? 1 : null } cpus = { 8 * task.attempt } memory = { 48.GB * task.attempt } time = { 8.h * task.attempt } } withLabel:process_gpu_very_high { - ext.use_gpu = { params.use_gpu as boolean } accelerator = { (params.use_gpu as boolean) ? 1 : null } cpus = { 16 * task.attempt } memory = { 96.GB * task.attempt } time = { 10.h * task.attempt } } withLabel:process_gpu_very_high_memory { - ext.use_gpu = { params.use_gpu as boolean } accelerator = { (params.use_gpu as boolean) ? 1 : null } cpus = { 16 * task.attempt } memory = { 128.GB * task.attempt } @@ -91,7 +88,6 @@ process { maxRetries = 2 } withLabel: process_gpu { - ext.use_gpu = { workflow.profile.contains('gpu') } accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/docs/usage.md b/docs/usage.md index 044e9e02..7a07bd77 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -580,10 +580,10 @@ lost: they remain in `variants/phased/germline_smallvariants.vcf.gz`, in #### Advanced Options -| Parameter | Description | -| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `--use_gpu` | A boolean to enable GPU acceleration for DeepVariant and DeepSomatic. Requires a GPU-enabled compute environment. Default = `false` | -| `--generate_gvcf` | A boolean to enable gVCF output from DeepVariant (germline) and DeepSomatic (somatic). gVCF files include calls at all positions, not just variant sites. Default = `false` | +| Parameter | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--use_gpu` | A boolean to run DeepVariant, DeepSomatic, Clair3 and the fibertools steps (m6A prediction, nucleosomes, FIRE) on a GPU, with their GPU container images. Needs a GPU-enabled compute environment; add the `gpu` profile (`-profile <...>,gpu`) so the containers can see the GPU. Clair3's GPU image (`hkubal/clair3:v2.0.5_gpu`) is built for NVIDIA GPUs up to compute capability 9.0 (for example A100, H100 or RTX Ada) and fails on newer cards such as the B200; there, leave `--use_gpu` off. Default = `false` | +| `--generate_gvcf` | A boolean to enable gVCF output from DeepVariant (germline) and DeepSomatic (somatic). gVCF files include calls at all positions, not just variant sites. Default = `false` | #### Genome-Derived Parameters diff --git a/modules.json b/modules.json index 0a33c58a..4368a728 100644 --- a/modules.json +++ b/modules.json @@ -255,7 +255,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "a3fb7351b1fdb2b1de282b765816bbea190e86a8", + "git_sha": "6ef220fd9252b42fb3c50348bbdbcb6246730686", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 5c737383..fd09cd7c 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -3,10 +3,11 @@ process CLAIR3 { label "${params.use_gpu ? 'process_gpu_very_high' : 'process_very_high'}" conda "${moduleDir}/environment.yml" - // No GPU image was published for 2.0.3; 2.0.2 differs only by the --gender option, which is not used here + // GPU: HKU's image (no biocontainer has CUDA). Needs >= 2.0.3: 2.0.2 resolves the reference symlink and then + // misses the .fai, which Nextflow stages from a different task. Bundles the same models as the biocontainer. container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? - (params.use_gpu ? 'docker://docker.io/hkubal/clair3:v2.0.2_gpu' : 'https://depot.galaxyproject.org/singularity/clair3:2.0.3--py311hbc58adc_0') : - (params.use_gpu ? 'docker.io/hkubal/clair3:v2.0.2_gpu' : 'quay.io/biocontainers/clair3:2.0.3--py311hbc58adc_0') }" + (params.use_gpu ? 'docker://docker.io/hkubal/clair3:v2.0.5_gpu' : 'https://depot.galaxyproject.org/singularity/clair3:2.0.3--py311hbc58adc_0') : + (params.use_gpu ? 'docker.io/hkubal/clair3:v2.0.5_gpu' : 'quay.io/biocontainers/clair3:2.0.3--py311hbc58adc_0') }" input: tuple val(meta) , path(bam), path(bai), path(model), val(platform) @@ -26,7 +27,7 @@ process CLAIR3 { script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" - def use_gpu = task.ext.use_gpu as boolean + def use_gpu = params.use_gpu as boolean // An empty model input means the model is bundled with the image: models/ next to run_clair3.sh // in the biocontainer, /opt/models in the HKU Docker image def model_path = model ? "${model}" : "\${CLAIR3_MODELS}/${meta.clair3_model}" diff --git a/nextflow.config b/nextflow.config index 836884c5..24edbd9b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -474,11 +474,12 @@ manifest { nextflowVersion = '!>=25.10.4' version = '1.1.0' doi = '' + diagram = 'assets/lrsomatic_1.0.png' } // Nextflow plugins plugins { - id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.7.3' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nextflow_schema.json b/nextflow_schema.json index 46c7fe25..667eceee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -732,7 +732,8 @@ }, "use_gpu": { "type": "boolean", - "description": "Use GPU for supported tools (e.g. DeepVariant, DeepSomatic, Clair3)" + "description": "Run DeepVariant, DeepSomatic, Clair3 and fibertools on a GPU (use with the gpu profile).", + "help_text": "Clair3's GPU image supports NVIDIA GPUs up to compute capability 9.0 (A100, H100, RTX Ada); it fails on newer cards such as the B200, so leave this off there." }, "skip_report": { "type": "boolean", @@ -880,7 +881,7 @@ }, "trace_report_suffix": { "type": "string", - "fa_icon": "far calendar", + "fa_icon": "far fa-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 }, diff --git a/nf-test.config b/nf-test.config index f37973a1..0b021827 100644 --- a/nf-test.config +++ b/nf-test.config @@ -36,7 +36,7 @@ config { // load the necessary plugins plugins { - load "nft-utils@0.0.3" + load "nft-utils@1.2.1" // bam() assertions for sample4's merged BAM (see tests/.nftignore) load "nft-bam@0.7.0" } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 8b93ca59..47ba8849 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -1,29 +1,23 @@ { "@context": [ - "https://w3id.org/ro/crate/1.2/context", - { - "GithubService": "https://w3id.org/ro/terms/test#GithubService", - "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", - "PlanemoEngine": "https://w3id.org/ro/terms/test#PlanemoEngine", - "TestDefinition": "https://w3id.org/ro/terms/test#TestDefinition", - "TestInstance": "https://w3id.org/ro/terms/test#TestInstance", - "TestService": "https://w3id.org/ro/terms/test#TestService", - "TestSuite": "https://w3id.org/ro/terms/test#TestSuite", - "TravisService": "https://w3id.org/ro/terms/test#TravisService", - "definition": "https://w3id.org/ro/terms/test#definition", - "engineVersion": "https://w3id.org/ro/terms/test#engineVersion", - "instance": "https://w3id.org/ro/terms/test#instance", - "resource": "https://w3id.org/ro/terms/test#resource", - "runsOn": "https://w3id.org/ro/terms/test#runsOn" - } + "https://w3id.org/ro/crate/1.3/context", + "https://w3id.org/ro/terms/test" ], "@graph": [ { "@id": "./", "@type": "Dataset", + "conformsTo": [ + { + "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.1" + }, + { + "@id": "https://w3id.org/ro/wftest/0.2" + } + ], "creativeWorkStatus": "Stable", - "datePublished": "2026-08-14T13:41:35+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\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.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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.10.4-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-4.1.0-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.1.0)\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 — **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\nFor more information on how to run the pipeline, you can also go [here](https://intgenomicslab.github.io/lrsomatic).\n\n## Pipeline summary\n\n![image](./assets/lrsomatic_1.0.png)\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/running/run-pipelines#using-parameter-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Amber Verhasselt, Alexandra Pančíková, 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 that combines the output from `mosdepth` and `samtools` into one HTML report, and a self-contained per-sample HTML report (`/report/_report.html`) covering small variants, structural variants, copy number and QC in one place — disable it with `--skip_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├── Sample 1\n│ ├── ascat\n│ ├── bamfiles\n│ ├── qc\n│ │ ├── tumor\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ ├── variants\n│ │ ├──clairS-TO\n│ │ ├──severus\n│ ├── vep\n│ │ ├── germline\n│ │ ├── somatic\n│ │ ├── SVs\n│ ├── report\n│\n├── Sample 2\n│ ├── ascat\n│ ├── bamfiles\n│ ├── qc\n│ │ ├── tumor\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ │ ├── normal\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ ├── variants\n│ │ ├── clair3\n│ │ ├── clairS\n│ │ ├── severus\n│ ├── vep\n│ │ ├── germline\n│ │ ├── somatic\n│ │ ├── SVs\n├── 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](docs/CONTRIBUTING.md).\n\n## Citations\n\nIf you use `IntGenomicsLab/lrsomatic` for your analysis, please cite it using the following:\n\n> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data\n>\n> Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester\n>\n> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772\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", + "datePublished": "2026-10-28T09:47:28+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\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.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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.10.4-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-4.2.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/4.2.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/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 — **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\nFor more information on how to run the pipeline, you can also go [here](https://intgenomicslab.github.io/lrsomatic).\n\n## Pipeline summary\n\n![image](./assets/lrsomatic_1.0.png)\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. Somatic structural variant and copy-number calling ([`SAVANA`](https://github.com/cortes-ciriano-lab/savana))\n\nc. 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)), with pathogenicity and clinical-significance plugins: [`AlphaMissense`](https://github.com/google-deepmind/alphamissense), [`ClinVar`](https://www.ncbi.nlm.nih.gov/clinvar/), [`REVEL`](https://sites.google.com/site/revelgenomics/), [`SIFT`/`PolyPhen`](https://github.com/Ensembl/VEP_plugins), and optionally [`CADD`](https://cadd.gs.washington.edu/) and [`EVE`](https://evemodel.org/)\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nc. Somatic SV and CNA functional annotation ([`Padfoot`](https://github.com/KolmogorovLab/Padfoot))\n\n**5) Visualisation:**\n\na. Rearrangement and copy-number figures per CN/SV caller pair ([`ReConPlot`](https://github.com/cortes-ciriano-lab/ReConPlot))\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 is a sample. BAMs must be unaligned, all fields except `bam_normal` are required, and an empty `bam_normal` runs the sample in tumour-only mode. `platform` is `ont` or `pb`, `sex` is `female` or `male`, and `fiber` is `y` or `n` for Fiber-seq; see the [usage documentation](/docs/usage.md#full-description-of-samplesheet-columns).\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/running/run-pipelines#using-parameter-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Amber Verhasselt, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThe main output is an aligned and phased tumour BAM, per-sample QC from `cramino`, `mosdepth`, `samtools` and optionally `fibertools`, a MultiQC report, and a self-contained per-sample HTML report (`/report/_report.html`; disable it with `--skip_report`).\n\nVariant and copy number callers (`clairS`, `clairS-TO`, `severus`, `savana`, `ascat`) write to their own folders; Padfoot annotations and ReConPlot figures go to `padfoot/` and `reconplot/`, one subfolder per caller pair. See the [output documentation](/docs/output.md).\n\nExample output directory structure:\n\n```\n├── Sample 1\n│ ├── ascat\n│ ├── bamfiles\n│ ├── padfoot\n│ │ ├── savana\n│ │ └── severus_wakhan\n│ ├── qc\n│ │ ├── tumor\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ ├── reconplot\n│ │ ├── savana\n│ │ ├── severus_ascat\n│ │ └── severus_wakhan\n│ ├── variants\n│ │ ├──clairS-TO\n│ │ ├──severus\n│ │ ├──savana\n│ ├── vep\n│ │ ├── germline\n│ │ ├── somatic\n│ │ ├── SVs\n│ ├── report\n│\n├── Sample 2\n│ ├── ascat\n│ ├── bamfiles\n│ ├── padfoot\n│ │ ├── savana\n│ │ └── severus_wakhan\n│ ├── qc\n│ │ ├── tumor\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ │ ├── normal\n│ │ │ ├── cramino_aln\n│ │ │ ├── cramino_ubam\n│ │ │ ├── fibertoolsrs\n│ │ │ ├── mosdepth\n│ │ │ ├── samtools\n│ ├── reconplot\n│ │ ├── savana\n│ │ ├── severus_ascat\n│ │ └── severus_wakhan\n│ ├── variants\n│ │ ├── clair3\n│ │ ├── clairS\n│ │ ├── severus\n│ │ ├── savana\n│ ├── vep\n│ │ ├── germline\n│ │ ├── somatic\n│ │ ├── SVs\n├── 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](docs/CONTRIBUTING.md).\n\n## Citations\n\nIf you use `IntGenomicsLab/lrsomatic` for your analysis, please cite it using the following:\n\n> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data\n>\n> Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester\n>\n> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772\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" @@ -31,6 +25,9 @@ { "@id": "assets/" }, + { + "@id": "bin/" + }, { "@id": "conf/" }, @@ -96,7 +93,7 @@ }, "mentions": [ { - "@id": "#096b60a2-c60b-4f0d-8b26-4baa567c4ef5" + "@id": "#97291dab-36c6-4b95-b3ba-9d715c953af5" } ], "name": "IntGenomicsLab/lrsomatic" @@ -107,14 +104,9 @@ "about": { "@id": "./" }, - "conformsTo": [ - { - "@id": "https://w3id.org/ro/crate/1.2" - }, - { - "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" - } - ] + "conformsTo": { + "@id": "https://w3id.org/ro/crate/1.3" + } }, { "@id": "main.nf", @@ -152,7 +144,7 @@ } ], "dateCreated": "", - "dateModified": "2026-08-14T15:41:35Z", + "dateModified": "2026-10-28T10:47:28Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -199,11 +191,20 @@ "version": "!>=25.10.4" }, { - "@id": "#096b60a2-c60b-4f0d-8b26-4baa567c4ef5", + "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.1", + "@type": [ + "CreativeWork", + "Profile" + ], + "name": "Workflow RO-Crate", + "version": "1.1" + }, + { + "@id": "#97291dab-36c6-4b95-b3ba-9d715c953af5", "@type": "TestSuite", "instance": [ { - "@id": "#3094354b-3f75-4b03-837e-301a462687e7" + "@id": "#65d87ca4-0d27-4af3-8b1a-875becab8174" } ], "mainEntity": { @@ -212,7 +213,16 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#3094354b-3f75-4b03-837e-301a462687e7", + "@id": "https://w3id.org/ro/wftest/0.2", + "@type": [ + "CreativeWork", + "Profile" + ], + "name": "Workflow Testing RO-Crate", + "version": "0.2" + }, + { + "@id": "#65d87ca4-0d27-4af3-8b1a-875becab8174", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", @@ -234,6 +244,11 @@ "@type": "Dataset", "description": "Additional files" }, + { + "@id": "bin/", + "@type": "Dataset", + "description": "Scripts that must be callable from a pipeline process" + }, { "@id": "conf/", "@type": "Dataset", diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 532f7082..95744073 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -65,7 +65,7 @@ workflow PIPELINE_INITIALISATION { "", "", command, - false + null ) // @@ -216,7 +216,7 @@ workflow PIPELINE_COMPLETION { plaintext_email, outdir, monochrome_logs, - multiqc_reports.getVal(), + multiqc_reports.isBound() ? multiqc_reports.getVal() : [], ) } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml index d08d2434..a32b454d 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml +++ b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml @@ -13,10 +13,10 @@ input: description: | Nextflow CLI positional arguments output: - - success: + - valid_config: type: boolean description: | - Dummy output to indicate success + Whether a custom configuration or profile was provided to the pipeline authors: - "@adamrtalbot" maintainers: diff --git a/tests/clair_only.nf.test.snap b/tests/clair_only.nf.test.snap index d0518faf..9bff949b 100644 --- a/tests/clair_only.nf.test.snap +++ b/tests/clair_only.nf.test.snap @@ -3,11 +3,11 @@ "content": [ "88c8d3cf9cb49fdbc53372b2275d5f3e" ], + "timestamp": "2026-09-02T10:24:37.511974063", "meta": { "nf-test": "0.9.4", "nextflow": "26.04.3" - }, - "timestamp": "2026-09-02T10:24:37.511974063" + } }, "-profile test, clair only, extended samplesheet": { "content": [ @@ -806,8 +806,8 @@ [ "sample1_normal.bam:md5,9f778338336c41085b8d0f626f4ed3e3", "sample1_normal.bam.bai:md5,51a07b9bb493578602f1db320fd9e778", - "sample1_tumor.bam:md5,8b74c0425ca53674a3f29b27d33f811a", - "sample1_tumor.bam.bai:md5,0e3fce541093eb470c1b0d98f44f120e", + "sample1_tumor.bam:md5,6fb23863ea4a0feb283d5006808c0c3c", + "sample1_tumor.bam.bai:md5,00cc7ab78b8002719f34744ab4760857", "sample1_normal.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1_normal.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1_normal.stats:md5,d79e3c68505d39cf29641dfdf5849ef1", @@ -819,7 +819,7 @@ "sample1_whatshap_stats.tsv:md5,cf8917be389dfef1344eeb6b7e99c7c5", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,003e4e80ec4233315762233e5f1ec0d8", + "breakpoints_double.csv:md5,e307fa52370d89e72ea09f84d4eff2f7", "read_qual.txt:md5,92321a03aae1168fdce8ea921b635036", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", @@ -838,12 +838,12 @@ "sample2_whatshap_stats.tsv:md5,31f4d9c3228d60ac463695ca19d05f3a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,ab7ccd32508029426ca1365053fdc23b", + "breakpoints_double.csv:md5,fa0c1072b74d3dcf914901f73154bbad", "read_qual.txt:md5,57aaac5f18f81b1cbde13e49c012651a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,06eb979bcc58aac9dc9429f2c6a91b1c", - "sample3_tumor.bam.bai:md5,59c95f7b5733008f51de5f30bd902ff7", + "sample3_tumor.bam:md5,9983ad703deaadf2765da20f40cfa206", + "sample3_tumor.bam.bai:md5,f18b06f6e424c7e5d418d2235f168c2e", "sample3_tumor.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3_tumor.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3_tumor.stats:md5,9d2945cfd8813c828d702e86afbaa58b", @@ -852,7 +852,7 @@ "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,c18b66eebc1714279e685ab1c56d6cf3", + "breakpoints_double.csv:md5,0c3021e35f1e8b0ae78fd2783e678c9f", "read_qual.txt:md5,f6d803b54f3aa4a36f21af1a9a97923f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", @@ -864,12 +864,12 @@ "sample4_whatshap_stats.tsv:md5,804922ca6ebd94ae71a7a4058fa9e156", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,1b6b52f5a606d329dcf18226dc0babd0", + "breakpoints_double.csv:md5,e5a537ffb30a6fc9f78ea88d3a5596e2", "read_qual.txt:md5,1efaf50beda973a8e6502566a212628c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample5_tumor.bam:md5,79d8899d89e68b1923ed49ac3ffa2746", - "sample5_tumor.bam.bai:md5,c2c90700339fddbd70c6a7198f843b7c", + "sample5_tumor.bam:md5,fcb61ade133e072cd8e7595610d80636", + "sample5_tumor.bam.bai:md5,50fbd04a1801214fa676bd7958dc6a86", "sample5_tumor.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample5_tumor.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample5_tumor.stats:md5,d757137207bc345e962cc3c9640252f2", @@ -878,16 +878,16 @@ "sample5_whatshap_stats.tsv:md5,0ec14e83f9ad788104de1c6ef3f021f2", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,8f023c63deb462ea4b55566babd365d0", + "breakpoints_double.csv:md5,d61891bf2f24f4a94498a953210287a3", "read_qual.txt:md5,f6d803b54f3aa4a36f21af1a9a97923f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], + "timestamp": "2026-10-28T11:10:57.095837215", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" - }, - "timestamp": "2026-10-05T20:09:59.776226598" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } } } \ No newline at end of file diff --git a/tests/consensus.nf.test.snap b/tests/consensus.nf.test.snap index 5d0f1fc5..d641c78e 100644 --- a/tests/consensus.nf.test.snap +++ b/tests/consensus.nf.test.snap @@ -679,8 +679,8 @@ [ "sample1_normal.bam:md5,529e96162af6f913be7e50a210365d8a", "sample1_normal.bam.bai:md5,034f8853f7aa7907adb51a16b56a94f9", - "sample1_tumor.bam:md5,fe9c35bc653348f062189cd495ed5208", - "sample1_tumor.bam.bai:md5,cca02afab0659bd5aa8941a331ba87dd", + "sample1_tumor.bam:md5,d1f6cb4bf17eff53d18206ec631e621e", + "sample1_tumor.bam.bai:md5,34665ec29ead4e94ab0d8c0d550a2d6d", "sample1_normal.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1_normal.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1_normal.stats:md5,d79e3c68505d39cf29641dfdf5849ef1", @@ -692,7 +692,7 @@ "sample1_whatshap_stats.tsv:md5,ec24f50578a481fcda2cea12dcfd1bae", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,003e4e80ec4233315762233e5f1ec0d8", + "breakpoints_double.csv:md5,c76eef6f53a826ba0d1ea3f84d0befc0", "read_qual.txt:md5,92321a03aae1168fdce8ea921b635036", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", @@ -711,12 +711,12 @@ "sample2_whatshap_stats.tsv:md5,1b2e88694c1f14f946543c191e1f75b7", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,ab7ccd32508029426ca1365053fdc23b", + "breakpoints_double.csv:md5,d5d056ce97784eedf461ad798910f9c2", "read_qual.txt:md5,57aaac5f18f81b1cbde13e49c012651a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,06eb979bcc58aac9dc9429f2c6a91b1c", - "sample3_tumor.bam.bai:md5,59c95f7b5733008f51de5f30bd902ff7", + "sample3_tumor.bam:md5,9983ad703deaadf2765da20f40cfa206", + "sample3_tumor.bam.bai:md5,f18b06f6e424c7e5d418d2235f168c2e", "sample3_tumor.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3_tumor.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3_tumor.stats:md5,9d2945cfd8813c828d702e86afbaa58b", @@ -725,16 +725,16 @@ "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,c18b66eebc1714279e685ab1c56d6cf3", + "breakpoints_double.csv:md5,0c3021e35f1e8b0ae78fd2783e678c9f", "read_qual.txt:md5,f6d803b54f3aa4a36f21af1a9a97923f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], + "timestamp": "2026-10-28T11:16:25.596223448", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" - }, - "timestamp": "2026-10-06T11:13:19.254341842" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } } } \ No newline at end of file diff --git a/tests/deep_only.nf.test.snap b/tests/deep_only.nf.test.snap index c281dd83..4a9f4862 100644 --- a/tests/deep_only.nf.test.snap +++ b/tests/deep_only.nf.test.snap @@ -615,8 +615,8 @@ [ "sample1_normal.bam:md5,bffc2444a70313bb24a6b52189bbb65a", "sample1_normal.bam.bai:md5,c8162096af7955d5550bb01a9a870013", - "sample1_tumor.bam:md5,a04100696156c1d2c66f2b69e1119048", - "sample1_tumor.bam.bai:md5,3cbed78851ca9d34da2cca80a680bd4a", + "sample1_tumor.bam:md5,c4eaa5bdd47baedb922759cd23599dd4", + "sample1_tumor.bam.bai:md5,0e90c40f3f97f137b9f08bf88557f997", "sample1_normal.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1_normal.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1_normal.stats:md5,d79e3c68505d39cf29641dfdf5849ef1", @@ -628,7 +628,7 @@ "sample1_whatshap_stats.tsv:md5,46666007fed1d295aba347a9e7618e34", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,003e4e80ec4233315762233e5f1ec0d8", + "breakpoints_double.csv:md5,3dcda68bb247950df3ce73812a087863", "read_qual.txt:md5,92321a03aae1168fdce8ea921b635036", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", @@ -647,12 +647,12 @@ "sample2_whatshap_stats.tsv:md5,b887c4013730bdfa6474ba703dd1ca17", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,ab7ccd32508029426ca1365053fdc23b", + "breakpoints_double.csv:md5,d5d056ce97784eedf461ad798910f9c2", "read_qual.txt:md5,57aaac5f18f81b1cbde13e49c012651a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,8a6d2472ecbcb90f849b12ee14bf3a47", - "sample3_tumor.bam.bai:md5,78eefad4ce39c3ae1ef672cf9a8417f5", + "sample3_tumor.bam:md5,6fa1e11f893633c19a12f927a723216b", + "sample3_tumor.bam.bai:md5,330a63a0285d580ad441ddf5ee5e3027", "sample3_tumor.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3_tumor.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3_tumor.stats:md5,9d2945cfd8813c828d702e86afbaa58b", @@ -661,16 +661,16 @@ "sample3_whatshap_stats.tsv:md5,2dad37f19eea1a9cb75a1b07f584a5ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,c18b66eebc1714279e685ab1c56d6cf3", + "breakpoints_double.csv:md5,ff3bd14c47b355d44baa2ca094d0e42f", "read_qual.txt:md5,f6d803b54f3aa4a36f21af1a9a97923f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], + "timestamp": "2026-10-28T11:14:03.646069097", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" - }, - "timestamp": "2026-10-06T11:29:37.927428469" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } } } \ No newline at end of file diff --git a/tests/union.nf.test.snap b/tests/union.nf.test.snap index 31b9fc86..274fbb7b 100644 --- a/tests/union.nf.test.snap +++ b/tests/union.nf.test.snap @@ -673,8 +673,8 @@ [ "sample1_normal.bam:md5,157917470659ee56879fd5c8570149c3", "sample1_normal.bam.bai:md5,affa80567bd26028f688cb5d3346fa44", - "sample1_tumor.bam:md5,be58d6ef251d2c044b0dfdc5b6f19c89", - "sample1_tumor.bam.bai:md5,84c74bdfe9cf7d9612d967b9aba95a4c", + "sample1_tumor.bam:md5,3f862b1b46ea5e5149fff01596d5e5bf", + "sample1_tumor.bam.bai:md5,a430335bfdbb92524b388bed2ab9cdb7", "sample1_normal.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1_normal.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1_normal.stats:md5,d79e3c68505d39cf29641dfdf5849ef1", @@ -686,7 +686,7 @@ "sample1_whatshap_stats.tsv:md5,905ca791c9087b1fbcd14794a6af8b5a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,003e4e80ec4233315762233e5f1ec0d8", + "breakpoints_double.csv:md5,e307fa52370d89e72ea09f84d4eff2f7", "read_qual.txt:md5,92321a03aae1168fdce8ea921b635036", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", @@ -705,12 +705,12 @@ "sample2_whatshap_stats.tsv:md5,138f333a6c09f4f51db218ed430ec26f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,ab7ccd32508029426ca1365053fdc23b", + "breakpoints_double.csv:md5,fa0c1072b74d3dcf914901f73154bbad", "read_qual.txt:md5,57aaac5f18f81b1cbde13e49c012651a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,8a6d2472ecbcb90f849b12ee14bf3a47", - "sample3_tumor.bam.bai:md5,78eefad4ce39c3ae1ef672cf9a8417f5", + "sample3_tumor.bam:md5,6fa1e11f893633c19a12f927a723216b", + "sample3_tumor.bam.bai:md5,330a63a0285d580ad441ddf5ee5e3027", "sample3_tumor.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3_tumor.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3_tumor.stats:md5,9d2945cfd8813c828d702e86afbaa58b", @@ -719,16 +719,16 @@ "sample3_whatshap_stats.tsv:md5,2dad37f19eea1a9cb75a1b07f584a5ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,c18b66eebc1714279e685ab1c56d6cf3", + "breakpoints_double.csv:md5,ff3bd14c47b355d44baa2ca094d0e42f", "read_qual.txt:md5,f6d803b54f3aa4a36f21af1a9a97923f", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], + "timestamp": "2026-10-28T11:19:48.20272296", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" - }, - "timestamp": "2026-10-06T11:40:46.910684091" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } } } \ No newline at end of file