Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7eaede8
Update nf-core modules and bump local module tools
ljwharbers Oct 1, 2026
733bc23
Restore NanoPlot arrow input and fix missed .tbi joins
ljwharbers Oct 1, 2026
2ec2bef
Rename AF tags only where the source tag exists; update snapshots
ljwharbers Oct 1, 2026
9555b5c
Update union snapshot
ljwharbers Oct 1, 2026
c3ba089
Fill in PR number in CHANGELOG entry
ljwharbers Oct 1, 2026
0e628ff
Update Clair3, ClairS, DeepVariant and DeepSomatic
ljwharbers Oct 1, 2026
7cb08bb
Restore DeepVariant edits that were missing from the patch files
ljwharbers Oct 1, 2026
c1d0489
Update default, chm13 and clair_only snapshots for the new callers
ljwharbers Oct 1, 2026
69ebae2
Update consensus, deep_only and union snapshots for the new callers
ljwharbers Oct 1, 2026
d3d4614
Fill in PR number in CHANGELOG entry
ljwharbers Oct 1, 2026
906aad3
Skip nf-core component tests in nextflow-lint
ljwharbers Oct 1, 2026
6467ebe
Update Wakhan to 0.5.0
ljwharbers Oct 1, 2026
4f1c7e1
Fill in PR number in CHANGELOG entry
ljwharbers Oct 1, 2026
a47eb1f
Correct the #212 CHANGELOG entry
ljwharbers Oct 1, 2026
9688f05
Re-record module snapshots for patched NanoPlot and bcftools
ljwharbers Oct 1, 2026
786ef8e
Run lrsomatic_report 1.6.1
ljwharbers Oct 1, 2026
78fb702
Warn instead of abort on bcftools norm REF mismatches
ljwharbers Oct 1, 2026
a8d27e6
Merge branch 'chore/module-updates' into chore/variant-caller-updates
ljwharbers Oct 1, 2026
fc0e823
Address review: DeepSomatic small model, ClairS container ternary
ljwharbers Oct 1, 2026
1ae5e77
Add a WAKHAN module stub test
ljwharbers Oct 1, 2026
2ee7d0a
Merge remote-tracking branch 'origin/chore/module-updates' into feat/…
ljwharbers Oct 1, 2026
9ff6d0c
Pull WAKHAN from Docker Hub, with the coverage-histogram fix
ljwharbers Oct 1, 2026
35b41b4
Merge pull request #213 from IntGenomicsLab/chore/variant-caller-updates
AmberVerhasselt Oct 2, 2026
9edfb76
Merge origin/chore/module-updates (#213) into feat/wakhan-0.5.0
ljwharbers Oct 2, 2026
f8a8dc5
Merge pull request #214 from IntGenomicsLab/feat/wakhan-0.5.0
AmberVerhasselt Oct 2, 2026
30d5cc6
Address round-2 review: CLAIR3_MODEL TLS, stub test, model checks
ljwharbers Oct 2, 2026
5060eb8
Merge dev into chore/module-updates
ljwharbers Oct 2, 2026
f74b247
Regenerate snapshots after merging dev
ljwharbers Oct 2, 2026
e5284ea
Merge branch 'dev' into chore/module-updates
ljwharbers Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ repos:
hooks:
- id: nextflow-lint
files: '\.nf$|nextflow\.config$'
# nf-core component tests are nf-core/modules' own; some include modules this pipeline does not install
# (subworkflows/nf-core/deepvariant/tests includes deepvariant/rundeepvariant)
exclude: "^(modules|subworkflows)/nf-core/.*/tests/"
args: ["-output", "json"]
- repo: local
hooks:
Expand Down
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#182](https://github.com/IntGenomicsLab/lrsomatic/pull/182) - Added `--vcf` to the default `vep_args` so VEP writes VCF output rather than its default tab-delimited format (@AmberVerhasselt).
- [#183](https://github.com/IntGenomicsLab/lrsomatic/pull/183) - Corrected the `github` URL for Laurens Lambrechts in `manifest.contributors`, which was a copy of @MariosEft97's, to @laulambr. RO-Crate metadata updated to match (@ljwharbers).

### `Dependencies`

- [#212](https://github.com/IntGenomicsLab/lrsomatic/pull/212) - Updated all nf-core modules and the `bam_stats_samtools` subworkflow to the current nf-core/modules master with `nf-core modules update` (the `utils_*` subworkflows stay on the template's versions, because their master needs nf-schema 3.0.0), and bumped the tools further where nf-core lags the release and a single-tool biocontainer could be used (recorded as module patches). The callers follow the new module interfaces: `.tbi`/`.csi`/`.bai` outputs are now one `.index` channel, `WGET` takes the file suffix in its input tuple, and most modules report versions through the `versions` topic. The variant callers (Clair3, ClairS, DeepVariant, DeepSomatic) are updated in a separate PR (@ljwharbers).

| Tool | Old | New | Notes |
| --------------- | ---------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `bcftools` | 1.20 / 1.22 | 1.24 | All nf-core and local bcftools modules, `VCFSPLIT`, `VEPPLUGIN_EVE`/`VEPPLUGIN_REVEL`. `BCFTOOLS_NORM` now runs with `--check-ref w`: 1.24 aborts when a REF differs from the FASTA, and Clair3 writes `N` where GRCh38 has IUPAC codes (e.g. `B` at chr3:16902883), which 1.22 accepted |
| `samtools` | 1.21 / 1.22.1 / 1.23.1 | 1.24 | Including `METAEXTRACT`; `minimap2/align` stays on nf-core's samtools 1.23.1 |
| `minimap2` | 2.29 | 2.30 | 2.31 has no minimap2 + samtools image yet |
| `mosdepth` | 0.3.11 | 0.3.14 | |
| `nanoplot` | 1.46.1 | 1.48.0 | |
| `ensembl-vep` | 115.2 | 116.1 | 116.2's biocontainer lacks `Math::CDF`; the default `--vep_cache_version` (113) is unchanged |
| `severus` | 1.6 | 1.7 | |
| `cramino` | 1.3.0 | 2.0.0 | **N50, N75, median and mean read length now use the full read length** (primary alignments, clipped bases included), so the report's N50 goes up; the old aligned values are new `... aligned` rows. `% from total alignments` is renamed `% from total reads` |
| `fibertools-rs` | 0.8.1 | 0.13.1 | **Fiber-seq BAMs now carry nucleosomes, MSPs and FIREs in the MolecularAnnotation tags `Ma` (`nuc`, `msp` and `fire` intervals) and `Aq` (their qualities)** instead of `ns`/`nl`/`as`/`al`/`aq`; downstream tools reading the old tags need `ft convert-tags` or an update |
| `wakhan` | 0.4.3 | 0.4.4 | 0.5.0 changes the output directory layout and has no biocontainer yet |

- [#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 |

- [#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).

## v1.1.0 - [2026-04-28]

### `Added`
Expand Down
55 changes: 17 additions & 38 deletions conf/modules.config
Original file line number Diff line number Diff line change
Expand Up @@ -122,20 +122,21 @@ process {
withName: '.*:BCFTOOLS_NORM' {
ext.prefix = { "${meta.id}.${meta.caller}_norm" }
// 'consensus' splits multi-allelics so BCFTOOLS_ISEC can match them per ALT; BCFTOOLS_NORM_REJOIN rejoins them.
ext.args = { meta.split ? "-m -any -Oz" : "-Oz" }
// Warn, not abort, on REF mismatches: Clair3 writes N where GRCh38 has IUPAC codes, which bcftools 1.24 rejects
ext.args = { meta.split ? "-m -any -Oz --check-ref w" : "-Oz --check-ref w" }
publishDir = [
enabled: false
]
}
// Rejoin split multi-allelics ('consensus' only); LongPhase keys variants by position and cannot take two records at one POS.
withName: '.*:GERMLINE_CONSENSUS:BCFTOOLS_NORM_REJOIN' {
ext.prefix = { "${meta.id}_germline_sorted" }
ext.args = { '-m +any --output-type z --write-index=tbi' }
ext.args = { '-m +any --check-ref w --output-type z --write-index=tbi' }
publishDir = [ enabled: false ]
}
withName: '.*:SOMATIC_CONSENSUS:BCFTOOLS_NORM_REJOIN' {
ext.prefix = { "${meta.id}_somatic_sorted" }
ext.args = { '-m +any --output-type z --write-index=tbi' }
ext.args = { '-m +any --check-ref w --output-type z --write-index=tbi' }
publishDir = [ enabled: false ]
}

Expand Down Expand Up @@ -179,12 +180,12 @@ process {
// Split multi-allelics in both inputs so the CHROM,POS,REF,ALT verdict match works per ALT.
withName: '.*:DS_VERDICT_SPLIT_DS' {
ext.prefix = { "${meta.id}.deepsomatic_split" }
ext.args = { '-m -any --output-type z --write-index=tbi' }
ext.args = { '-m -any --check-ref w --output-type z --write-index=tbi' }
publishDir = [ enabled: false ]
}
withName: '.*:DS_VERDICT_SPLIT_DV' {
ext.prefix = { "${meta.id}.deepvariant_split" }
ext.args = { '-m -any --output-type z --write-index=tbi' }
ext.args = { '-m -any --check-ref w --output-type z --write-index=tbi' }
publishDir = [ enabled: false ]
}

Expand Down Expand Up @@ -226,7 +227,7 @@ process {
// Rejoin split multi-allelics; LongPhase keys variants by position and cannot take two records at one POS.
withName: '.*:DS_GERMLINE_REJOIN' {
ext.prefix = { "${meta.id}.deepvariant_germline" }
ext.args = { '-m +any --output-type z --write-index=tbi' }
ext.args = { '-m +any --check-ref w --output-type z --write-index=tbi' }
publishDir = [ enabled: false ]
}

Expand All @@ -239,12 +240,10 @@ process {
]
}

// DeepVariant 1.10 checkpoints carry their make_examples flags in model.example_info.json, read via
// --checkpoint: the ONT model is 199 wide with the new fuzzy channel, and both enable the small model
withName: '.*DEEPVARIANT_MAKEEXAMPLES' {
ext.args = {
meta.platform == 'pb'
? '--channel_list "BASE_CHANNELS,haplotype,base_6ma" --alt_aligned_pileup "diff_channels" --pileup_image_width "147"'
: '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"'
}
ext.args = { "--checkpoint '/opt/models/${meta.platform == 'pb' ? 'pacbio' : 'ont_r104'}'" }
publishDir = [
enabled: false
]
Expand Down Expand Up @@ -272,12 +271,12 @@ process {
]
}

// DeepSomatic 1.10 checkpoints carry their make_examples flags (channels, pileup width, thresholds) in
// model.example_info.json, which make_examples_somatic reads when given --checkpoint; the paired PacBio
// model is 147 wide and 9 channels, so hard-coded flags would no longer match call_variants.
// The small model stays off: the module does not collect its calls, so a checkpoint enabling it would drop them
withName: '.*DEEPSOMATIC_MAKEEXAMPLES' {
ext.args = {
meta.paired_data
? '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"'
: '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"'
}
ext.args = { "--checkpoint '/opt/models/deepsomatic/${meta.platform == 'pb' ? 'pacbio' : 'ont'}${meta.paired_data ? '' : '_tumor_only'}' --nocall_small_model_examples" }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No small test runs DeepVariant or DeepSomatic. The default test has no DEEPVARIANT_* / DEEPSOMATIC_* processes in its snapshot. So nothing in PR CI checks these 1.10.0 changes:

  • the move from hard-coded flags to --checkpoint-derived make_examples flags;
  • the model paths (/opt/models/ont_r104, /opt/models/deepsomatic/{pacbio,ont}{,_tumor_only});
  • --nocall_small_model_examples;
  • the DeepVariant small-model CVO handoff.

This also applies to the BCFTOOLS_NORM --check-ref w change (line 126): BCFTOOLS_NORM isn't in the default snapshot either. Only the extended deep_only / consensus / union tests reach these steps. Please run those, plus the Slurm test array for both ONT and PacBio and for both paired and tumour-only, before merging.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct, no small test reaches them. Here is what did run:

  • The extended deep_only, consensus and union tests (and default, chm13, clair_only) on Mindwell with the Update Clair3, ClairS, DeepVariant and DeepSomatic #213 callers. Their snapshots were re-recorded in c1d0489 and 69ebae2.
  • Real data: C8 PacBio tumour/normal on GRCh38 (Slurm 11645745). Run A on 78fb702 (--check-ref w, old callers) and run B on fc0e823 (DeepVariant/DeepSomatic 1.10, Clair3 2, ClairS 0.5.1) both completed with 0 failed tasks. That includes the DeepVariant small-model path, DeepSomatic, both consensus BCFTOOLS_NORM steps past the chr3 IUPAC site that aborted before, STANDARDIZE_AF and LongPhase.

Not covered on real data: ONT, and tumour-only. Tumour-only only ran in the extended tests on the chr19/20 test data.

publishDir = [
enabled: false
]
Expand All @@ -299,15 +298,7 @@ process {
}

withName: '.*DEEPSOMATIC_CALLVARIANTS' {
ext.args = {
meta.platform == 'pb'
? (meta.paired_data
? "--checkpoint '/opt/models/deepsomatic/pacbio'"
: "--checkpoint '/opt/models/deepsomatic/pacbio_tumor_only'" )
: (meta.paired_data
? "--checkpoint '/opt/models/deepsomatic/ont'"
: "--checkpoint '/opt/models/deepsomatic/ont_tumor_only'")
}
ext.args = { "--checkpoint '/opt/models/deepsomatic/${meta.platform == 'pb' ? 'pacbio' : 'ont'}${meta.paired_data ? '' : '_tumor_only'}'" }
publishDir = [
enabled : false
]
Expand Down Expand Up @@ -739,25 +730,13 @@ process {
]
}

withName : '.*:WGET' {
ext.args = {
[
"--no-check-certificate"
].join(' ').trim() }
ext.suffix = { "tar.gz" }
publishDir = [
enabled: false
]
}

withName : '.*:UNTAR' {
withName : '.*:CLAIR3_MODEL' {
publishDir = [
enabled: false
]
}

withName : '.*:WGET_(REVEL|EVE)' {
ext.suffix = { "zip" }
publishDir = [
enabled: false
]
Expand Down
Loading
Loading