diff --git a/CHANGELOG.md b/CHANGELOG.md index f5778818..f6b6f299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Added` - [#190](https://github.com/IntGenomicsLab/lrsomatic/pull/190) - Added mutational signature analysis: SigProfilerMatrixGenerator matrices (SBS/DBS/ID) and per-sample COSMIC signature fitting with SigProfilerAssignment on the phased somatic VCF, with CHM13-T2T support via a purpose-built image (`ghcr.io/ljwharbers/sigprofiler`) and CHM13-renormalised COSMIC signatures; new `--sigprofiler_*` / `--download_sigprofiler_genome` / `--skip_signatures` parameters (@ljwharbers). +- [#188](https://github.com/IntGenomicsLab/lrsomatic/pull/188) - Added `modkit_args` (default `--cpg --modified-bases 5mC`) to control the arguments passed to `modkit pileup`, and `modkit_phased` to run the pileup with `--phased` on the Longphase-haplotagged BAMs, producing `_hp1`, `_hp2` and `_combined` bedMethyl files per sample (@ljwharbers). - [#176](https://github.com/IntGenomicsLab/lrsomatic/pull/176) - Added `LRSOMATICREPORT` as the final pipeline step: a self-contained per-sample HTML report covering small variants, structural variants, copy number and QC. Skip it with `--skip_report`; choose the gene panel selected on load with `--report_gene_panel` (@ljwharbers). - [#176](https://github.com/IntGenomicsLab/lrsomatic/pull/176) - Vendored the [lrsomatic_report](https://github.com/ljwharbers/lrsomatic_report) v1.3.2 tool source at `assets/lrsomatic_report`, so `nextflow run IntGenomicsLab/lrsomatic` ships it without a submodule checkout (@ljwharbers). - [#176](https://github.com/IntGenomicsLab/lrsomatic/pull/176) - Added a `solution_dirs` output to the WAKHAN module so its per-solution copy-number plots can be staged downstream (@ljwharbers). ### `Changed` +- [#188](https://github.com/IntGenomicsLab/lrsomatic/pull/188) - `MODKIT_PILEUP` now runs `modkit pileup` with `--cpg --modified-bases 5mC` by default; previously it ran with no arguments, and that unfiltered pileup (every modification code at every sequence context) produced 30-45 GB per sample. Reruns therefore give different bedMethyl content: only 5mC rows at CpG sites, so 5hmC and 6mA calls and non-CpG positions are no longer reported. Set `--modkit_args=''` (the `=` form; `--modkit_args ''` reaches the pipeline as `true` and is rejected by parameter validation on Nextflow 25) or an empty `modkit_args` entry in a params file to get the previous unfiltered output (@ljwharbers). - [#186](https://github.com/IntGenomicsLab/lrsomatic/pull/186) - Re-synced the vendored [lrsomatic_report](https://github.com/ljwharbers/lrsomatic_report) to v1.3.0, which adds tickbox dropdown filters on the categorical columns of both variant tables and turns the report's gene panel selector into checkboxes (@ljwharbers). - [#176](https://github.com/IntGenomicsLab/lrsomatic/pull/176) - Re-synced the vendored [lrsomatic_report](https://github.com/ljwharbers/lrsomatic_report) to v1.3.2: facet dropdown counts follow the active filters, opening a facet menu no longer resets the table's horizontal scroll, a flatter clinical theme, and inline code comments trimmed to one line (@ljwharbers). - [#186](https://github.com/IntGenomicsLab/lrsomatic/pull/186) - `--report_gene_panel` now takes a comma-separated list, so several panels can be applied at once: a variant or SV is kept if it hits any of them. Panel values are also validated at launch instead of failing inside the report task (@ljwharbers). @@ -26,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` +- [#188](https://github.com/IntGenomicsLab/lrsomatic/pull/188) - `MODKIT_PILEUP` now runs a patched modkit 0.6.4 built from [ljwharbers/modkit@pacbio-conflict-fix](https://github.com/ljwharbers/modkit/tree/pacbio-conflict-fix): `ghcr.io/ljwharbers/modkit:0.6.4-pacbiofix-6e0afa2` under Docker, and the native SIF `oras://ghcr.io/ljwharbers/modkit-sif:0.6.4-pacbiofix-6e0afa2` under Singularity/Apptainer (unless `singularity_pull_docker_container` is set, which falls back to the Docker image). It keeps reads whose 5mC and 5hmC probabilities sum above 1, fixes pileup on PacBio-style MM tags, and honours `--phased` and `--modified-bases` in the general pileup workers that modkit uses for PacBio BAMs with 6mA calls (stock modkit wrote empty `_hp1`/`_hp2` files and an `h` row next to every `m` row for those). Stock modkit 0.4.3-0.6.4 silently dropped 32-65 % of reads from recent PacBio HiFi BAMs (Jasmine >= 26.1.3) and returned empty `--cpg` pileups ([nanoporetech/modkit#612](https://github.com/nanoporetech/modkit/issues/612); fixes proposed upstream in [nanoporetech/modkit#720](https://github.com/nanoporetech/modkit/pull/720)). The image is `linux/amd64` only and Conda is not supported for this step: `MODKIT_PILEUP` stops with an error under `-profile conda`/`mamba`, use `--skip_modkit` there. The module should return to the nf-core biocontainer once a modkit release includes the fix (@ljwharbers). - [#181](https://github.com/IntGenomicsLab/lrsomatic/pull/181) - NanoPlot pre- and post-alignment statistics now reach MultiQC. `ch_nanoplot_pre_txt` and `ch_nanoplot_post_txt` were declared empty and mixed into the MultiQC inputs, but never assigned from `NANOPLOT_PRE.out.txt` / `NANOPLOT_POST.out.txt`, so the NanoStat section was silently missing from every report (@ljwharbers). - [#181](https://github.com/IntGenomicsLab/lrsomatic/pull/181) - `NANOPLOT_PRE` now includes the replicate in its output prefix, so samples with more than one replicate no longer collapse into a single MultiQC sample (@ljwharbers). - [#181](https://github.com/IntGenomicsLab/lrsomatic/pull/181) - samtools stats/flagstat/idxstats and mosdepth outputs are now prefixed `_` instead of ``. The tumor and normal files of a matched pair shared a basename, so MultiQC logged `Duplicate sample name found! Overwriting` and reported only one of the two; the general statistics table now has one row per BAM (`_tumor`, `_normal`), which the post-alignment NanoStat row joins (@ljwharbers). diff --git a/conf/modules.config b/conf/modules.config index cd4f4295..829cd4d9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -330,6 +330,14 @@ process { // withName: '.*:MODKIT_PILEUP' { + ext.args = { + [ + // Nextflow turns `--modkit_args ''` (and a bare `--modkit_args`) into `true`: a boolean that nf-schema rejects on + // Nextflow 25, the string 'true' on Nextflow 26. The documented form is `--modkit_args=''`; this backstop treats `true` as "no arguments" + (params.modkit_args == null || params.modkit_args in [true, 'true']) ? '' : params.modkit_args, + params.modkit_phased ? '--phased' : '' + ].join(' ').trim() + } publishDir = [ path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/modkit_pileup" }, mode: params.publish_dir_mode, diff --git a/docs/output.md b/docs/output.md index 0d10b09d..72bd4d9d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -231,15 +231,20 @@ QC outputs are placed under `tumor/` for all samples, and additionally under `no ├── methylation │ ├── tumor │ │ └── modkit_pileup -│ │ └── sample.bed.gz +│ │ ├── sample.bed.gz # default +│ │ ├── sample_hp1.bed.gz # --modkit_phased only +│ │ ├── sample_hp2.bed.gz # --modkit_phased only +│ │ └── sample_combined.bed.gz # --modkit_phased only │ ├── normal # paired samples only │ │ └── modkit_pileup -│ │ └── sample.bed.gz +│ │ └── ... # same layout as tumor ``` -| File | Description | -| -------------------------------------------- | ----------------------------------------------------------------------------------- | -| `{tumor,normal}/modkit_pileup/sample.bed.gz` | Modkit pileup BED file containing per-CpG methylation frequency and coverage values | +| File | Description | +| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `{tumor,normal}/modkit_pileup/sample.bed.gz` | Modkit pileup bedMethyl table (bgzip) with per-strand methylation frequency and coverage. By default (`--modkit_args '--cpg --modified-bases 5mC'`) rows are 5mC calls at CpG sites only. | +| `{tumor,normal}/modkit_pileup/sample_{hp1,hp2}.bed.gz` | With `--modkit_phased`: bedMethyl tables restricted to reads carrying haplotype tag `HP:1` or `HP:2` from the Longphase-haplotagged BAM. | +| `{tumor,normal}/modkit_pileup/sample_combined.bed.gz` | With `--modkit_phased`: bedMethyl table over all reads, including untagged ones (equivalent to the unphased default output). There is no separate file for untagged reads; they only contribute to `_combined`. | diff --git a/docs/usage.md b/docs/usage.md index e82dc99e..a5e21093 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -139,24 +139,33 @@ For structural variants, the CHM13 panel of normals is a merged panel combining #### 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` | -| `--skip_m6a` | A boolean to skip `fibertools_m6a`, used if you have m6a calls but would still like nucleosome positions for PacBio data (ONT data is required to have m6a calls). Default = `false` | -| `--skip_nanoplot` | A boolean to skip NanoPlot QC on aligned and unaligned BAM files. Default = `false` | -| `--skip_normalfiber` | A boolean to skip fibertools processing for the normal sample. Default = `false` | -| `--skip_modcall` | A boolean to skip modkit methylation calling. Default = `false` | -| `--skip_modkit` | A boolean to skip the modkit pileup step. Default = `false` | -| `--skip_whatshapstats` | A boolean to skip WhatsHap phasing statistics. Default = `false` | -| `--skip_signatures` | A boolean to skip mutational signature analysis (SigProfilerMatrixGenerator + SigProfilerAssignment). Default = `false` | -| `--skip_report` | A boolean to skip the final per-sample HTML report. Default = `false` | +| 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` | +| `--skip_m6a` | A boolean to skip `fibertools_m6a`, used if you have m6a calls but would still like nucleosome positions for PacBio data (ONT data is required to have m6a calls). Default = `false` | +| `--skip_nanoplot` | A boolean to skip NanoPlot QC on aligned and unaligned BAM files. Default = `false` | +| `--skip_normalfiber` | A boolean to skip fibertools processing for the normal sample. Default = `false` | +| `--skip_modcall` | A boolean to skip Longphase `modcall`, the 5mC base-modification calling whose VCF is used as extra evidence during phasing. Unrelated to the modkit pileup (see `--skip_modkit`). Default = `false` | +| `--skip_modkit` | A boolean to skip the modkit pileup step. Default = `false` | +| `--skip_whatshapstats` | A boolean to skip WhatsHap phasing statistics. Default = `false` | +| `--skip_signatures` | A boolean to skip mutational signature analysis (SigProfilerMatrixGenerator + SigProfilerAssignment). Default = `false` | +| `--skip_report` | A boolean to skip the final per-sample HTML report. Default = `false` | + +#### Modkit options: + +| Parameter | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `--modkit_args` | Arguments passed to `modkit pileup`. The value replaces the default rather than extending it, so repeat `--cpg --modified-bases 5mC` when adding flags (e.g. `--cpg --modified-bases 5mC --combine-strands`). An empty value gives the unfiltered pileup of every modification code at every position: use the `=` form, `--modkit_args=''`, or an empty `modkit_args` entry in a `-params-file` (`--modkit_args ''` reaches the pipeline as `true`, which parameter validation rejects on Nextflow 25 and which the pipeline has to discard on Nextflow 26). The default restricts output to 5mC calls at CpG sites. Note that `--modified-bases` only filters the output: on PacBio data, positions (not reads) where the 5mC and 5hmC probabilities sum above 1 are still dropped, and non-conflicting 5hmC calls are counted in the `N_other` column. Default = `--cpg --modified-bases 5mC` | +| `--modkit_phased` | A boolean to run `modkit pileup --phased` on the Longphase-haplotagged BAMs, producing `_hp1`, `_hp2` and `_combined` bedMethyl files per sample instead of a single unphased file. The pileup then depends on small-variant calling, phasing and haplotagging having completed for the sample, so a failure in any of those steps means no bedMethyl output for that sample; the default pileup only needs the aligned BAM. Default = `false` | + +The pileup runs a patched modkit 0.6.4 image (`ghcr.io/ljwharbers/modkit`, built for `linux/amd64` only from [ljwharbers/modkit@pacbio-conflict-fix](https://github.com/ljwharbers/modkit/tree/pacbio-conflict-fix)) because stock modkit 0.4.3-0.6.4 drops PacBio HiFi reads whose 5mC and 5hmC probabilities sum above 1 and returns empty `--cpg` pileups on them ([nanoporetech/modkit#612](https://github.com/nanoporetech/modkit/issues/612); fix proposed in [nanoporetech/modkit#720](https://github.com/nanoporetech/modkit/pull/720)). Conda and the `arm64` profile are not supported for this step: `MODKIT_PILEUP` stops with an error under `-profile conda`/`mamba`, and no arm64 image exists. Use `--skip_modkit` in those environments. #### LONGPHASE options: diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf index 7487783d..dd0934fc 100644 --- a/modules/nf-core/modkit/pileup/main.nf +++ b/modules/nf-core/modkit/pileup/main.nf @@ -2,10 +2,12 @@ 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.6.1--hcdda2d0_0': - 'biocontainers/ont-modkit:0.6.1--hcdda2d0_0' }" + // Conda is not supported: the PacBio fixes below exist only in the patched image, and + // environment.yml would install stock ont-modkit 0.6.1 (the guard in `script:` stops conda/mamba runs) + // Patched modkit 0.6.4 (nanoporetech/modkit#720, source: github.com/ljwharbers/modkit/tree/pacbio-conflict-fix) that keeps PacBio reads with 5mC+5hmC > 1 and honours --phased/--modified-bases in the general workers; revert to the biocontainer once released + container "${(workflow.containerEngine == 'singularity' || workflow.containerEngine == 'apptainer') && !task.ext.singularity_pull_docker_container + ? 'oras://ghcr.io/ljwharbers/modkit-sif:0.6.4-pacbiofix-6e0afa2' + : 'ghcr.io/ljwharbers/modkit:0.6.4-pacbiofix-6e0afa2'}" input: tuple val(meta), path(bam), path(bai) @@ -22,6 +24,10 @@ process MODKIT_PILEUP { task.ext.when == null || task.ext.when script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "MODKIT_PILEUP does not support Conda: the PacBio fixes only exist in the patched container. Use Docker / Singularity / Apptainer, or --skip_modkit." + } def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--ref ${fasta}" : "" diff --git a/modules/nf-core/modkit/pileup/modkit-pileup.diff b/modules/nf-core/modkit/pileup/modkit-pileup.diff index d880bb11..e3c691c5 100644 --- a/modules/nf-core/modkit/pileup/modkit-pileup.diff +++ b/modules/nf-core/modkit/pileup/modkit-pileup.diff @@ -1,9 +1,23 @@ Changes in component 'nf-core/modkit/pileup' +'modules/nf-core/modkit/pileup/environment.yml' is unchanged 'modules/nf-core/modkit/pileup/meta.yml' is unchanged Changes in 'modkit/pileup/main.nf': --- modules/nf-core/modkit/pileup/main.nf +++ modules/nf-core/modkit/pileup/main.nf -@@ -9,8 +9,9 @@ +@@ -2,15 +2,18 @@ + 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.6.1--hcdda2d0_0': +- 'biocontainers/ont-modkit:0.6.1--hcdda2d0_0' }" ++ // Conda is not supported: the PacBio fixes below exist only in the patched image, and ++ // environment.yml would install stock ont-modkit 0.6.1 (the guard in `script:` stops conda/mamba runs) ++ // Patched modkit 0.6.4 (nanoporetech/modkit#720, source: github.com/ljwharbers/modkit/tree/pacbio-conflict-fix) that keeps PacBio reads with 5mC+5hmC > 1 and honours --phased/--modified-bases in the general workers; revert to the biocontainer once released ++ container "${(workflow.containerEngine == 'singularity' || workflow.containerEngine == 'apptainer') && !task.ext.singularity_pull_docker_container ++ ? 'oras://ghcr.io/ljwharbers/modkit-sif:0.6.4-pacbiofix-6e0afa2' ++ : 'ghcr.io/ljwharbers/modkit:0.6.4-pacbiofix-6e0afa2'}" input: tuple val(meta), path(bam), path(bai) @@ -15,9 +29,1176 @@ Changes in 'modkit/pileup/main.nf': output: tuple val(meta), path("*.bed.gz") , emit: bedgz , optional: true +@@ -21,6 +24,10 @@ + task.ext.when == null || task.ext.when + + script: ++ // Exit if running this module with -profile conda / -profile mamba ++ if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { ++ error "MODKIT_PILEUP does not support Conda: the PacBio fixes only exist in the patched container. Use Docker / Singularity / Apptainer, or --skip_modkit." ++ } + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--ref ${fasta}" : "" -'modules/nf-core/modkit/pileup/environment.yml' is unchanged -'modules/nf-core/modkit/pileup/tests/main.nf.test' is unchanged -'modules/nf-core/modkit/pileup/tests/main.nf.test.snap' is unchanged 'modules/nf-core/modkit/pileup/tests/nextflow.config' is unchanged +Changes in 'modkit/pileup/tests/main.nf.test': +--- modules/nf-core/modkit/pileup/tests/main.nf.test ++++ modules/nf-core/modkit/pileup/tests/main.nf.test +@@ -22,8 +22,9 @@ + 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[1] = [[],[]] + input[2] = [[],[]] ++ input[3] = [[],[]] + """ + } + } +@@ -50,12 +51,9 @@ + 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] = [[],[]] ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = [[],[]] + """ + } + } +@@ -82,12 +80,9 @@ + 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') ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ +@@ -116,12 +111,9 @@ + 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] = [[],[]] ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = [[],[]] + """ + } + } +@@ -148,12 +140,9 @@ + 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') ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ +@@ -184,8 +173,9 @@ + 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[1] = [[],[]] + input[2] = [[],[]] ++ input[3] = [[],[]] + """ + } + } +@@ -214,12 +204,9 @@ + 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] = [[],[]] ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = [[],[]] + """ + } + } +@@ -247,12 +234,9 @@ + 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') ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ +@@ -283,12 +267,9 @@ + 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] = [[],[]] ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = [[],[]] + """ + } + } +@@ -317,12 +298,9 @@ + 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') ++ input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] ++ input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ++ input[3] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + +Changes in 'modkit/pileup/tests/main.nf.test.snap': +--- modules/nf-core/modkit/pileup/tests/main.nf.test.snap ++++ modules/nf-core/modkit/pileup/tests/main.nf.test.snap +@@ -7,103 +7,309 @@ + { + "id": "test" + }, +- "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" +- ] +- ], +- "1": [ +- +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" +- ] +- ], +- "log": [ +- +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], ++ "test.bed.gz:md5,cd173b78a199424358268f7f15fc1878" ++ ] ++ ], ++ "1": [ ++ ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,cd173b78a199424358268f7f15fc1878" ++ ] ++ ], ++ "log": [ ++ ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-09-14T14:22:06.129485351", ++ "meta": { ++ "nf-test": "0.9.4", ++ "nextflow": "26.04.3" ++ } ++ }, ++ "[bam, bai], [fasta, fai], [] - stub": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "1": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "log": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-01-22T11:46:32.126118262", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:15.943030058" +- }, +- "[bam, bai], [fasta, fai], [] - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "log": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], ++ } ++ }, ++ "[bam, bai], [fasta, fai], [], phased": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ [ ++ "test_combined.bed.gz:md5,32452a02e350e5ac558ab68bbbaccc85", ++ "test_hp1.bed.gz:md5,abd206b393ead3f3a574a4c34dc7429a", ++ "test_hp2.bed.gz:md5,5092dde96578433a30c4a7c86f3cd94d" ++ ] ++ ] ++ ], ++ "1": [ ++ ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ [ ++ "test_combined.bed.gz:md5,32452a02e350e5ac558ab68bbbaccc85", ++ "test_hp1.bed.gz:md5,abd206b393ead3f3a574a4c34dc7429a", ++ "test_hp2.bed.gz:md5,5092dde96578433a30c4a7c86f3cd94d" ++ ] ++ ] ++ ], ++ "log": [ ++ ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-09-14T14:22:11.928290711", ++ "meta": { ++ "nf-test": "0.9.4", ++ "nextflow": "26.04.3" ++ } ++ }, ++ "[bam, bai], [fasta, fai], [], phased - stub": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "1": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "log": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-01-22T11:46:40.051078689", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:32.126118262" +- }, +- "[bam, bai], [fasta, fai], [], phased": { ++ } ++ }, ++ "[bam, bai], [fasta, fai], []": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ++ ] ++ ], ++ "1": [ ++ ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ++ ] ++ ], ++ "log": [ ++ ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-09-14T14:22:00.669505516", ++ "meta": { ++ "nf-test": "0.9.4", ++ "nextflow": "26.04.3" ++ } ++ }, ++ "[bam, bai], [], []": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ++ ] ++ ], ++ "1": [ ++ ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ++ ] ++ ], ++ "log": [ ++ ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-09-14T14:21:54.845566402", ++ "meta": { ++ "nf-test": "0.9.4", ++ "nextflow": "26.04.3" ++ } ++ }, ++ "[bam, bai], [fasta, fai], bed, phased": { + "content": [ + { + "0": [ +@@ -112,9 +318,9 @@ + "id": "test" + }, + [ +- "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", +- "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", +- "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" ++ "test_combined.bed.gz:md5,cd173b78a199424358268f7f15fc1878", ++ "test_hp1.bed.gz:md5,d67280b345e95029cb5c0ea771128ba1", ++ "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" + ] + ] + ], +@@ -125,7 +331,7 @@ + [ + "MODKIT_PILEUP", + "modkit", +- "0.6.1" ++ "0.6.4" + ] + ], + "bedgz": [ +@@ -134,9 +340,9 @@ + "id": "test" + }, + [ +- "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", +- "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", +- "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" ++ "test_combined.bed.gz:md5,cd173b78a199424358268f7f15fc1878", ++ "test_hp1.bed.gz:md5,d67280b345e95029cb5c0ea771128ba1", ++ "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" + ] + ] + ], +@@ -147,392 +353,186 @@ + [ + "MODKIT_PILEUP", + "modkit", +- "0.6.1" +- ] +- ] +- } +- ], ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-09-14T14:22:17.427189446", ++ "meta": { ++ "nf-test": "0.9.4", ++ "nextflow": "26.04.3" ++ } ++ }, ++ "[bam, bai], [fasta, fai], bed, phased - stub": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "1": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "log": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-01-22T11:46:44.034301557", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:20.026595076" +- }, +- "[bam, bai], [fasta, fai], [], phased - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "log": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], ++ } ++ }, ++ "[bam, bai], [], [] - stub": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "1": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "log": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-01-22T11:46:28.153658113", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:40.051078689" +- }, +- "[bam, bai], [fasta, fai], []": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" +- ] +- ], +- "1": [ +- +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" +- ] +- ], +- "log": [ +- +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], ++ } ++ }, ++ "[bam, bai], [fasta, fai], bed - stub": { ++ "content": [ ++ { ++ "0": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "1": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "2": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ], ++ "bedgz": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ++ ] ++ ], ++ "log": [ ++ [ ++ { ++ "id": "test" ++ }, ++ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ++ ] ++ ], ++ "versions_modkit": [ ++ [ ++ "MODKIT_PILEUP", ++ "modkit", ++ "0.6.4" ++ ] ++ ] ++ } ++ ], ++ "timestamp": "2026-01-22T11:46:36.173040315", + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:11.978364755" +- }, +- "[bam, bai], [], []": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" +- ] +- ], +- "1": [ +- +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" +- ] +- ], +- "log": [ +- +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.3", +- "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:07.765200083" +- }, +- "[bam, bai], [fasta, fai], bed, phased": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- [ +- "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", +- "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", +- "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" +- ] +- ] +- ], +- "1": [ +- +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- [ +- "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", +- "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", +- "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" +- ] +- ] +- ], +- "log": [ +- +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.3", +- "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:24.273720433" +- }, +- "[bam, bai], [fasta, fai], bed, phased - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "log": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.3", +- "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:44.034301557" +- }, +- "[bam, bai], [], [] - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "log": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.3", +- "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:28.153658113" +- }, +- "[bam, bai], [fasta, fai], bed - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "2": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ], +- "bedgz": [ +- [ +- { +- "id": "test" +- }, +- "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "log": [ +- [ +- { +- "id": "test" +- }, +- "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" +- ] +- ], +- "versions_modkit": [ +- [ +- "MODKIT_PILEUP", +- "modkit", +- "0.6.1" +- ] +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.3", +- "nextflow": "25.04.2" +- }, +- "timestamp": "2026-01-22T11:46:36.173040315" ++ } + } +-}+} + ************************************************************ diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test b/modules/nf-core/modkit/pileup/tests/main.nf.test index 652b725a..5b57e946 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test @@ -22,8 +22,9 @@ nextflow_process { 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[1] = [[],[]] input[2] = [[],[]] + input[3] = [[],[]] """ } } @@ -50,12 +51,9 @@ nextflow_process { 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] = [[],[]] + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = [[],[]] """ } } @@ -82,12 +80,9 @@ nextflow_process { 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') + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) .map { file -> [ [ id:'chr22' ], file ] } """ @@ -116,12 +111,9 @@ nextflow_process { 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] = [[],[]] + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = [[],[]] """ } } @@ -148,12 +140,9 @@ nextflow_process { 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') + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) .map { file -> [ [ id:'chr22' ], file ] } """ @@ -184,8 +173,9 @@ nextflow_process { 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[1] = [[],[]] input[2] = [[],[]] + input[3] = [[],[]] """ } } @@ -214,12 +204,9 @@ nextflow_process { 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] = [[],[]] + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = [[],[]] """ } } @@ -247,12 +234,9 @@ nextflow_process { 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') + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) .map { file -> [ [ id:'chr22' ], file ] } """ @@ -283,12 +267,9 @@ nextflow_process { 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] = [[],[]] + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = [[],[]] """ } } @@ -317,12 +298,9 @@ nextflow_process { 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') + input[1] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + input[2] = [ [ id: 'test_ref' ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + input[3] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) .map { file -> [ [ id:'chr22' ], 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 index 55ba8d79..7393d919 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -7,7 +7,7 @@ { "id": "test" }, - "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" + "test.bed.gz:md5,cd173b78a199424358268f7f15fc1878" ] ], "1": [ @@ -17,7 +17,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -25,7 +25,7 @@ { "id": "test" }, - "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" + "test.bed.gz:md5,cd173b78a199424358268f7f15fc1878" ] ], "log": [ @@ -35,16 +35,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-09-14T14:22:06.129485351", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:15.943030058" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } }, "[bam, bai], [fasta, fai], [] - stub": { "content": [ @@ -69,7 +69,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -92,16 +92,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-01-22T11:46:32.126118262", "meta": { "nf-test": "0.9.3", "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:32.126118262" + } }, "[bam, bai], [fasta, fai], [], phased": { "content": [ @@ -112,9 +112,9 @@ "id": "test" }, [ - "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", - "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", - "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" + "test_combined.bed.gz:md5,32452a02e350e5ac558ab68bbbaccc85", + "test_hp1.bed.gz:md5,abd206b393ead3f3a574a4c34dc7429a", + "test_hp2.bed.gz:md5,5092dde96578433a30c4a7c86f3cd94d" ] ] ], @@ -125,7 +125,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -134,9 +134,9 @@ "id": "test" }, [ - "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", - "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", - "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" + "test_combined.bed.gz:md5,32452a02e350e5ac558ab68bbbaccc85", + "test_hp1.bed.gz:md5,abd206b393ead3f3a574a4c34dc7429a", + "test_hp2.bed.gz:md5,5092dde96578433a30c4a7c86f3cd94d" ] ] ], @@ -147,16 +147,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-09-14T14:22:11.928290711", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:20.026595076" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } }, "[bam, bai], [fasta, fai], [], phased - stub": { "content": [ @@ -181,7 +181,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -204,16 +204,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-01-22T11:46:40.051078689", "meta": { "nf-test": "0.9.3", "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:40.051078689" + } }, "[bam, bai], [fasta, fai], []": { "content": [ @@ -223,7 +223,7 @@ { "id": "test" }, - "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ] ], "1": [ @@ -233,7 +233,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -241,7 +241,7 @@ { "id": "test" }, - "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ] ], "log": [ @@ -251,16 +251,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-09-14T14:22:00.669505516", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:11.978364755" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } }, "[bam, bai], [], []": { "content": [ @@ -270,7 +270,7 @@ { "id": "test" }, - "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ] ], "1": [ @@ -280,7 +280,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -288,7 +288,7 @@ { "id": "test" }, - "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,1ec207494e615704e7806d4a6621de93" ] ], "log": [ @@ -298,16 +298,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-09-14T14:21:54.845566402", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:07.765200083" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } }, "[bam, bai], [fasta, fai], bed, phased": { "content": [ @@ -318,8 +318,8 @@ "id": "test" }, [ - "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", - "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", + "test_combined.bed.gz:md5,cd173b78a199424358268f7f15fc1878", + "test_hp1.bed.gz:md5,d67280b345e95029cb5c0ea771128ba1", "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" ] ] @@ -331,7 +331,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -340,8 +340,8 @@ "id": "test" }, [ - "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", - "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", + "test_combined.bed.gz:md5,cd173b78a199424358268f7f15fc1878", + "test_hp1.bed.gz:md5,d67280b345e95029cb5c0ea771128ba1", "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" ] ] @@ -353,16 +353,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-09-14T14:22:17.427189446", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:24.273720433" + "nf-test": "0.9.4", + "nextflow": "26.04.3" + } }, "[bam, bai], [fasta, fai], bed, phased - stub": { "content": [ @@ -387,7 +387,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -410,16 +410,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-01-22T11:46:44.034301557", "meta": { "nf-test": "0.9.3", "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:44.034301557" + } }, "[bam, bai], [], [] - stub": { "content": [ @@ -444,7 +444,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -467,16 +467,16 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-01-22T11:46:28.153658113", "meta": { "nf-test": "0.9.3", "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:28.153658113" + } }, "[bam, bai], [fasta, fai], bed - stub": { "content": [ @@ -501,7 +501,7 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ], "bedgz": [ @@ -524,15 +524,15 @@ [ "MODKIT_PILEUP", "modkit", - "0.6.1" + "0.6.4" ] ] } ], + "timestamp": "2026-01-22T11:46:36.173040315", "meta": { "nf-test": "0.9.3", "nextflow": "25.04.2" - }, - "timestamp": "2026-01-22T11:46:36.173040315" + } } -} \ No newline at end of file +} diff --git a/nextflow.config b/nextflow.config index e57a90f5..5b297c7c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,6 +25,10 @@ params { // Longphase options longphase_tag_supplementary = false + // Modkit options + modkit_args = '--cpg --modified-bases 5mC' + modkit_phased = false + // PON Options clairsto_pon_vcfs = null clairsto_pon_flags = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 05cd97a5..a3f11593 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -118,6 +118,24 @@ } } }, + "modkit_options": { + "title": "Modkit options", + "type": "object", + "description": "Options for modkit pileup of base modifications", + "properties": { + "modkit_args": { + "type": "string", + "description": "Command line arguments passed to `modkit pileup`. The value replaces the default rather than extending it, so repeat `--cpg --modified-bases 5mC` when adding flags (e.g. `--cpg --modified-bases 5mC --combine-strands`); an empty value gives the unfiltered pileup of every modification code at every position (use the `=` form on the command line, `--modkit_args=''`, or an empty `modkit_args` entry in a params file; `--modkit_args ''` reaches the pipeline as `true`, which parameter validation rejects on Nextflow 25 and which the pipeline has to discard on Nextflow 26). The default restricts the bedMethyl output to 5mC calls at CpG sites. Note that `--modified-bases` only filters the output: on PacBio data, positions (not reads) where the 5mC and 5hmC probabilities sum above 1 are still dropped, and non-conflicting 5hmC calls are counted in the `N_other` column.", + "fa_icon": "fas fa-terminal", + "default": "--cpg --modified-bases 5mC" + }, + "modkit_phased": { + "type": "boolean", + "description": "Run `modkit pileup --phased` on the Longphase-haplotagged BAMs (HP tag) instead of the unphased aligned BAMs, producing `_hp1.bed.gz`, `_hp2.bed.gz` and `_combined.bed.gz`. The pileup then depends on small-variant calling, phasing and haplotagging having completed for the sample: a failure in any of those steps means no bedMethyl output for that sample, whereas the default pileup only needs the aligned BAM.", + "default": false + } + } + }, "reference_genome_options": { "title": "Reference genome options", "type": "object", @@ -421,7 +439,7 @@ }, "skip_modcall": { "type": "boolean", - "description": "Skip modification calling" + "description": "Skip Longphase `modcall`, the 5mC base-modification calling whose VCF is used as extra evidence during phasing. Unrelated to the modkit pileup (see `skip_modkit`)." }, "use_gpu": { "type": "boolean", @@ -597,6 +615,9 @@ { "$ref": "#/$defs/longphase_options" }, + { + "$ref": "#/$defs/modkit_options" + }, { "$ref": "#/$defs/reference_genome_options" }, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index d994cabc..6539238d 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -541,14 +541,6 @@ workflow LRSOMATIC { .set { ch_minimap_bam } // ch_minimap_bam: [meta, bam] -- post-alignment BAM (replicates merged) - // - // MODULE: MODKIT_PILEUP - // - - if (!params.skip_modkit) { - MODKIT_PILEUP(ch_index_minimap, ch_fasta, ch_fai, [[:],[]]) - } - ch_index_minimap .branch { meta, _bams, _bais -> paired: meta.paired_data @@ -670,6 +662,17 @@ workflow LRSOMATIC { ch_fai ) + // + // MODULE: MODKIT_PILEUP (haplotagged BAM with --modkit_phased, merged BAM otherwise) + // + if (!params.skip_modkit) { + ch_modkit_input = params.modkit_phased + ? PHASING_HAPLOTYPING.out.tumor_normal_hapbams_ch + : ch_index_minimap + // ch_modkit_input: [meta, bam, bai] -- BAM to pile up; meta.type selects the publish directory + MODKIT_PILEUP(ch_modkit_input, ch_fasta, ch_fai, [[:],[]]) + } + // Prepare phased VCFs for VEP: add empty 'extra' list required by ENSEMBLVEP_VEP PHASING_HAPLOTYPING.out.phased_somatic_vcf .map { meta, vcf, _tbi ->