From 5b8304c3673ed6b1d0da36702840a6d192903ce4 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 12:23:11 +0100 Subject: [PATCH 001/557] added minimap2 index --- modules.json | 5 ++ .../nf-core/minimap2/index/environment.yml | 7 ++ modules/nf-core/minimap2/index/main.nf | 44 ++++++++++++ modules/nf-core/minimap2/index/meta.yml | 46 +++++++++++++ .../nf-core/minimap2/index/tests/main.nf.test | 32 +++++++++ .../minimap2/index/tests/main.nf.test.snap | 68 +++++++++++++++++++ modules/nf-core/minimap2/index/tests/tags.yml | 2 + workflows/lr_somatic.nf | 2 + 8 files changed, 206 insertions(+) create mode 100644 modules/nf-core/minimap2/index/environment.yml create mode 100644 modules/nf-core/minimap2/index/main.nf create mode 100644 modules/nf-core/minimap2/index/meta.yml create mode 100644 modules/nf-core/minimap2/index/tests/main.nf.test create mode 100644 modules/nf-core/minimap2/index/tests/main.nf.test.snap create mode 100644 modules/nf-core/minimap2/index/tests/tags.yml diff --git a/modules.json b/modules.json index 99f2f4e0..9284ed36 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "minimap2/index": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", diff --git a/modules/nf-core/minimap2/index/environment.yml b/modules/nf-core/minimap2/index/environment.yml new file mode 100644 index 00000000..c2dd2cfd --- /dev/null +++ b/modules/nf-core/minimap2/index/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::minimap2=2.28 diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf new file mode 100644 index 00000000..38320214 --- /dev/null +++ b/modules/nf-core/minimap2/index/main.nf @@ -0,0 +1,44 @@ +process MINIMAP2_INDEX { + label 'process_low' + + // Note: the versions here need to match the versions used in minimap2/align + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/minimap2:2.28--he4a0461_0' : + 'biocontainers/minimap2:2.28--he4a0461_0' }" + + input: + tuple val(meta), path(fasta) + + output: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + minimap2 \\ + -t $task.cpus \\ + -d ${fasta.baseName}.mmi \\ + $args \\ + $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ + + stub: + """ + touch ${fasta.baseName}.mmi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ +} diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml new file mode 100644 index 00000000..57c80e29 --- /dev/null +++ b/modules/nf-core/minimap2/index/meta.yml @@ -0,0 +1,46 @@ +name: minimap2_index +description: Provides fasta index required by minimap2 alignment. +keywords: + - index + - fasta + - reference +tools: + - minimap2: + description: | + A versatile pairwise aligner for genomic and spliced nucleotide sequences. + homepage: https://github.com/lh3/minimap2 + documentation: https://github.com/lh3/minimap2#uguide + licence: ["MIT"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: | + Reference database in FASTA format. +output: + - index: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.mmi": + type: file + description: Minimap2 fasta index. + pattern: "*.mmi" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@yuukiiwa" + - "@drpatelh" +maintainers: + - "@yuukiiwa" + - "@drpatelh" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test b/modules/nf-core/minimap2/index/tests/main.nf.test new file mode 100644 index 00000000..97840ff7 --- /dev/null +++ b/modules/nf-core/minimap2/index/tests/main.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test Process MINIMAP2_INDEX" + script "../main.nf" + process "MINIMAP2_INDEX" + + tag "modules" + tag "modules_nfcore" + tag "minimap2" + tag "minimap2/index" + + test("minimap2 index") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test.snap b/modules/nf-core/minimap2/index/tests/main.nf.test.snap new file mode 100644 index 00000000..0b098828 --- /dev/null +++ b/modules/nf-core/minimap2/index/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "test_ref" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "1": [ + "versions.yml:md5,0fced0ee8015e7f50b82566e3db8f7b0" + ], + "index": [ + [ + { + "id": "test_ref" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "versions": [ + "versions.yml:md5,0fced0ee8015e7f50b82566e3db8f7b0" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T11:46:30.000058092" + }, + "minimap2 index": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "1": [ + "versions.yml:md5,2f8340380c6741e9261a284262a90bde" + ], + "index": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" + ] + ], + "versions": [ + "versions.yml:md5,2f8340380c6741e9261a284262a90bde" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T10:58:29.828187662" + } +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/tests/tags.yml b/modules/nf-core/minimap2/index/tests/tags.yml new file mode 100644 index 00000000..e5ef8e19 --- /dev/null +++ b/modules/nf-core/minimap2/index/tests/tags.yml @@ -0,0 +1,2 @@ +minimap2/index: + - modules/nf-core/minimap2/index/** diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 922fbf25..f9d09165 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -9,6 +9,8 @@ include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pi include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW From c3f97a1fdce5e869a62c0864b2a8c0ffb694f4eb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 12:27:30 +0100 Subject: [PATCH 002/557] added minimap2 align module --- modules.json | 5 + .../nf-core/minimap2/align/environment.yml | 10 + modules/nf-core/minimap2/align/main.nf | 78 +++ modules/nf-core/minimap2/align/meta.yml | 99 ++++ .../nf-core/minimap2/align/tests/main.nf.test | 441 ++++++++++++++++ .../minimap2/align/tests/main.nf.test.snap | 476 ++++++++++++++++++ modules/nf-core/minimap2/align/tests/tags.yml | 2 + 7 files changed, 1111 insertions(+) create mode 100644 modules/nf-core/minimap2/align/environment.yml create mode 100644 modules/nf-core/minimap2/align/main.nf create mode 100644 modules/nf-core/minimap2/align/meta.yml create mode 100644 modules/nf-core/minimap2/align/tests/main.nf.test create mode 100644 modules/nf-core/minimap2/align/tests/main.nf.test.snap create mode 100644 modules/nf-core/minimap2/align/tests/tags.yml diff --git a/modules.json b/modules.json index 9284ed36..26e87545 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "minimap2/align": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "minimap2/index": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", diff --git a/modules/nf-core/minimap2/align/environment.yml b/modules/nf-core/minimap2/align/environment.yml new file mode 100644 index 00000000..60677e65 --- /dev/null +++ b/modules/nf-core/minimap2/align/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::htslib=1.20 + - bioconda::minimap2=2.28 + - bioconda::samtools=1.20 diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf new file mode 100644 index 00000000..d82dc14d --- /dev/null +++ b/modules/nf-core/minimap2/align/main.nf @@ -0,0 +1,78 @@ +process MINIMAP2_ALIGN { + tag "$meta.id" + label 'process_high' + + // Note: the versions here need to match the versions used in the mulled container below and minimap2/index + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:3161f532a5ea6f1dec9be5667c9efc2afdac6104-0' : + 'biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:3161f532a5ea6f1dec9be5667c9efc2afdac6104-0' }" + + input: + tuple val(meta), path(reads) + tuple val(meta2), path(reference) + val bam_format + val bam_index_extension + val cigar_paf_format + val cigar_bam + + output: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def args4 = task.ext.args4 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def bam_index = bam_index_extension ? "${prefix}.bam##idx##${prefix}.bam.${bam_index_extension} --write-index" : "${prefix}.bam" + def bam_output = bam_format ? "-a | samtools sort -@ ${task.cpus-1} -o ${bam_index} ${args2}" : "-o ${prefix}.paf" + def cigar_paf = cigar_paf_format && !bam_format ? "-c" : '' + def set_cigar_bam = cigar_bam && bam_format ? "-L" : '' + def bam_input = "${reads.extension}".matches('sam|bam|cram') + def samtools_reset_fastq = bam_input ? "samtools reset --threads ${task.cpus-1} $args3 $reads | samtools fastq --threads ${task.cpus-1} $args4 |" : '' + def query = bam_input ? "-" : reads + def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) + + """ + $samtools_reset_fastq \\ + minimap2 \\ + $args \\ + -t $task.cpus \\ + $target \\ + $query \\ + $cigar_paf \\ + $set_cigar_bam \\ + $bam_output + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def output_file = bam_format ? "${prefix}.bam" : "${prefix}.paf" + def bam_index = bam_index_extension ? "touch ${prefix}.bam.${bam_index_extension}" : "" + def bam_input = "${reads.extension}".matches('sam|bam|cram') + def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) + + """ + touch $output_file + ${bam_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) + END_VERSIONS + """ +} diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml new file mode 100644 index 00000000..a4cfc891 --- /dev/null +++ b/modules/nf-core/minimap2/align/meta.yml @@ -0,0 +1,99 @@ +name: minimap2_align +description: A versatile pairwise aligner for genomic and spliced nucleotide sequences +keywords: + - align + - fasta + - fastq + - genome + - paf + - reference +tools: + - minimap2: + description: | + A versatile pairwise aligner for genomic and spliced nucleotide sequences. + homepage: https://github.com/lh3/minimap2 + documentation: https://github.com/lh3/minimap2#uguide + licence: ["MIT"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FASTA or FASTQ files of size 1 and 2 for single-end + and paired-end data, respectively. + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test_ref'] + - reference: + type: file + description: | + Reference database in FASTA format. + - - bam_format: + type: boolean + description: Specify that output should be in BAM format + - - bam_index_extension: + type: string + description: BAM alignment index extension (e.g. "bai") + - - cigar_paf_format: + type: boolean + description: Specify that output CIGAR should be in PAF format + - - cigar_bam: + type: boolean + description: | + Write CIGAR with >65535 ops at the CG tag. This is recommended when + doing XYZ (https://github.com/lh3/minimap2#working-with-65535-cigar-operations) +output: + - paf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.paf": + type: file + description: Alignment in PAF format + pattern: "*.paf" + - bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: Alignment in BAM format + pattern: "*.bam" + - index: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam.${bam_index_extension}": + type: file + description: BAM alignment index + pattern: "*.bam.*" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@heuermh" + - "@sofstam" + - "@sateeshperi" + - "@jfy133" + - "@fellen31" +maintainers: + - "@heuermh" + - "@sofstam" + - "@sateeshperi" + - "@jfy133" + - "@fellen31" diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test b/modules/nf-core/minimap2/align/tests/main.nf.test new file mode 100644 index 00000000..4072c171 --- /dev/null +++ b/modules/nf-core/minimap2/align/tests/main.nf.test @@ -0,0 +1,441 @@ +nextflow_process { + + name "Test Process MINIMAP2_ALIGN" + script "../main.nf" + process "MINIMAP2_ALIGN" + + tag "modules" + tag "modules_nfcore" + tag "minimap2" + tag "minimap2/align" + + test("sarscov2 - fastq, fasta, true, [], false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, 'bai', false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + file(process.out.index[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [fastq1, fastq2], fasta, true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ] + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - fastq, [], true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, [], false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, 'bai', false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + bam(process.out.bam[0][1]).getHeader(), + bam(process.out.bam[0][1]).getReadsMD5(), + file(process.out.index[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam, [], true, false, false") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, true, 'bai', false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fastq, fasta, false, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = false + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, [], false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, fasta, true, 'bai', false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + input[2] = true + input[3] = 'bai' + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - bam, [], true, false, false - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam', checkIfExists: true) + ] + input[1] = [ + [ id:'test_ref' ], // meta map + [] + ] + input[2] = true + input[3] = [] + input[4] = false + input[5] = false + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test.snap b/modules/nf-core/minimap2/align/tests/main.nf.test.snap new file mode 100644 index 00000000..12264a85 --- /dev/null +++ b/modules/nf-core/minimap2/align/tests/main.nf.test.snap @@ -0,0 +1,476 @@ +{ + "sarscov2 - bam, fasta, true, 'bai', false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + ], + "5d426b9a5f5b2c54f1d7f1e4c238ae94", + "test.bam.bai", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:03:00.827260362" + }, + "sarscov2 - bam, fasta, true, 'bai', false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:21:37.92353539" + }, + "sarscov2 - fastq, fasta, true, 'bai', false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-03T11:29:44.669021368" + }, + "sarscov2 - fastq, fasta, false, [], false, false - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.paf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ], + "bam": [ + + ], + "index": [ + + ], + "paf": [ + [ + { + "id": "test", + "single_end": true + }, + "test.paf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-03T11:15:52.738781039" + }, + "sarscov2 - fastq, fasta, true, [], false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-03T11:15:23.033808223" + }, + "sarscov2 - [fastq1, fastq2], fasta, true, false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz test_2.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + ], + "1bc392244f228bf52cf0b5a8f6a654c9", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:18:18.964586894" + }, + "sarscov2 - fastq, fasta, true, [], false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + ], + "f194745c0ccfcb2a9c0aee094a08750", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:17:48.667488325" + }, + "sarscov2 - fastq, fasta, true, 'bai', false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + ], + "f194745c0ccfcb2a9c0aee094a08750", + "test.bam.bai", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:18:02.517416733" + }, + "sarscov2 - bam, fasta, true, [], false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:MT192765.1\tLN:29829", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + ], + "5d426b9a5f5b2c54f1d7f1e4c238ae94", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:02:49.64829488" + }, + "sarscov2 - bam, fasta, true, [], false, false - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ], + "bam": [ + [ + { + "id": "test", + "single_end": true + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + + ], + "paf": [ + + ], + "versions": [ + "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:21:22.162291795" + }, + "sarscov2 - fastq, [], true, false, false": { + "content": [ + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:ERR5069949.2151832\tLN:150", + "@SQ\tSN:ERR5069949.576388\tLN:77", + "@SQ\tSN:ERR5069949.501486\tLN:146", + "@SQ\tSN:ERR5069949.1331889\tLN:132", + "@SQ\tSN:ERR5069949.2161340\tLN:80", + "@SQ\tSN:ERR5069949.973930\tLN:79", + "@SQ\tSN:ERR5069949.2417063\tLN:150", + "@SQ\tSN:ERR5069949.376959\tLN:151", + "@SQ\tSN:ERR5069949.1088785\tLN:149", + "@SQ\tSN:ERR5069949.1066259\tLN:147", + "@SQ\tSN:ERR5069949.2832676\tLN:139", + "@SQ\tSN:ERR5069949.2953930\tLN:151", + "@SQ\tSN:ERR5069949.324865\tLN:151", + "@SQ\tSN:ERR5069949.2185111\tLN:150", + "@SQ\tSN:ERR5069949.937422\tLN:151", + "@SQ\tSN:ERR5069949.2431709\tLN:150", + "@SQ\tSN:ERR5069949.1246538\tLN:148", + "@SQ\tSN:ERR5069949.1189252\tLN:98", + "@SQ\tSN:ERR5069949.2216307\tLN:147", + "@SQ\tSN:ERR5069949.3273002\tLN:148", + "@SQ\tSN:ERR5069949.3277445\tLN:151", + "@SQ\tSN:ERR5069949.3022231\tLN:147", + "@SQ\tSN:ERR5069949.184542\tLN:151", + "@SQ\tSN:ERR5069949.540529\tLN:149", + "@SQ\tSN:ERR5069949.686090\tLN:150", + "@SQ\tSN:ERR5069949.2787556\tLN:106", + "@SQ\tSN:ERR5069949.2650879\tLN:150", + "@SQ\tSN:ERR5069949.2064910\tLN:149", + "@SQ\tSN:ERR5069949.2328704\tLN:150", + "@SQ\tSN:ERR5069949.1067032\tLN:150", + "@SQ\tSN:ERR5069949.3338256\tLN:151", + "@SQ\tSN:ERR5069949.1412839\tLN:147", + "@SQ\tSN:ERR5069949.1538968\tLN:150", + "@SQ\tSN:ERR5069949.147998\tLN:94", + "@SQ\tSN:ERR5069949.366975\tLN:106", + "@SQ\tSN:ERR5069949.1372331\tLN:151", + "@SQ\tSN:ERR5069949.1709367\tLN:129", + "@SQ\tSN:ERR5069949.2388984\tLN:150", + "@SQ\tSN:ERR5069949.1132353\tLN:150", + "@SQ\tSN:ERR5069949.1151736\tLN:151", + "@SQ\tSN:ERR5069949.479807\tLN:150", + "@SQ\tSN:ERR5069949.2176303\tLN:151", + "@SQ\tSN:ERR5069949.2772897\tLN:151", + "@SQ\tSN:ERR5069949.1020777\tLN:122", + "@SQ\tSN:ERR5069949.465452\tLN:151", + "@SQ\tSN:ERR5069949.1704586\tLN:149", + "@SQ\tSN:ERR5069949.1258508\tLN:151", + "@SQ\tSN:ERR5069949.986441\tLN:119", + "@SQ\tSN:ERR5069949.2674295\tLN:148", + "@SQ\tSN:ERR5069949.885966\tLN:79", + "@SQ\tSN:ERR5069949.2342766\tLN:151", + "@SQ\tSN:ERR5069949.3122970\tLN:127", + "@SQ\tSN:ERR5069949.3279513\tLN:72", + "@SQ\tSN:ERR5069949.309410\tLN:151", + "@SQ\tSN:ERR5069949.532979\tLN:149", + "@SQ\tSN:ERR5069949.2888794\tLN:151", + "@SQ\tSN:ERR5069949.2205229\tLN:150", + "@SQ\tSN:ERR5069949.786562\tLN:151", + "@SQ\tSN:ERR5069949.919671\tLN:151", + "@SQ\tSN:ERR5069949.1328186\tLN:151", + "@SQ\tSN:ERR5069949.870926\tLN:149", + "@SQ\tSN:ERR5069949.2257580\tLN:151", + "@SQ\tSN:ERR5069949.3249622\tLN:77", + "@SQ\tSN:ERR5069949.611123\tLN:125", + "@SQ\tSN:ERR5069949.651338\tLN:142", + "@SQ\tSN:ERR5069949.169513\tLN:92", + "@SQ\tSN:ERR5069949.155944\tLN:150", + "@SQ\tSN:ERR5069949.2033605\tLN:150", + "@SQ\tSN:ERR5069949.2730382\tLN:142", + "@SQ\tSN:ERR5069949.2125592\tLN:150", + "@SQ\tSN:ERR5069949.1062611\tLN:151", + "@SQ\tSN:ERR5069949.1778133\tLN:151", + "@SQ\tSN:ERR5069949.3057020\tLN:95", + "@SQ\tSN:ERR5069949.2972968\tLN:141", + "@SQ\tSN:ERR5069949.2734474\tLN:149", + "@SQ\tSN:ERR5069949.856527\tLN:151", + "@SQ\tSN:ERR5069949.2098070\tLN:151", + "@SQ\tSN:ERR5069949.1552198\tLN:150", + "@SQ\tSN:ERR5069949.2385514\tLN:150", + "@SQ\tSN:ERR5069949.2270078\tLN:151", + "@SQ\tSN:ERR5069949.114870\tLN:150", + "@SQ\tSN:ERR5069949.2668880\tLN:147", + "@SQ\tSN:ERR5069949.257821\tLN:139", + "@SQ\tSN:ERR5069949.2243023\tLN:150", + "@SQ\tSN:ERR5069949.2605155\tLN:146", + "@SQ\tSN:ERR5069949.1340552\tLN:151", + "@SQ\tSN:ERR5069949.1561137\tLN:150", + "@SQ\tSN:ERR5069949.2361683\tLN:149", + "@SQ\tSN:ERR5069949.2521353\tLN:150", + "@SQ\tSN:ERR5069949.1261808\tLN:149", + "@SQ\tSN:ERR5069949.2734873\tLN:98", + "@SQ\tSN:ERR5069949.3017828\tLN:107", + "@SQ\tSN:ERR5069949.573706\tLN:150", + "@SQ\tSN:ERR5069949.1980512\tLN:151", + "@SQ\tSN:ERR5069949.1014693\tLN:150", + "@SQ\tSN:ERR5069949.3184655\tLN:150", + "@SQ\tSN:ERR5069949.29668\tLN:89", + "@SQ\tSN:ERR5069949.3258358\tLN:151", + "@SQ\tSN:ERR5069949.1476386\tLN:151", + "@SQ\tSN:ERR5069949.2415814\tLN:150", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a test_1.fastq.gz test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + ], + "16c1c651f8ec67383bcdee3c55aed94f", + [ + "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-23T11:18:34.246998277" + } +} \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/tests/tags.yml b/modules/nf-core/minimap2/align/tests/tags.yml new file mode 100644 index 00000000..39dba374 --- /dev/null +++ b/modules/nf-core/minimap2/align/tests/tags.yml @@ -0,0 +1,2 @@ +minimap2/align: + - "modules/nf-core/minimap2/align/**" From 262f1c488baec8dc484a02f5bb72926285485b1a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 13:11:20 +0100 Subject: [PATCH 003/557] added samtools merge --- modules.json | 5 ++ modules/nf-core/samtools/cat/environment.yml | 8 +++ modules/nf-core/samtools/cat/main.nf | 50 +++++++++++++ modules/nf-core/samtools/cat/meta.yml | 59 ++++++++++++++++ .../nf-core/samtools/cat/tests/main.nf.test | 61 ++++++++++++++++ .../samtools/cat/tests/main.nf.test.snap | 70 +++++++++++++++++++ modules/nf-core/samtools/cat/tests/tags.yml | 2 + workflows/lr_somatic.nf | 13 +++- 8 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/samtools/cat/environment.yml create mode 100644 modules/nf-core/samtools/cat/main.nf create mode 100644 modules/nf-core/samtools/cat/meta.yml create mode 100644 modules/nf-core/samtools/cat/tests/main.nf.test create mode 100644 modules/nf-core/samtools/cat/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/cat/tests/tags.yml diff --git a/modules.json b/modules.json index 26e87545..16f2cb50 100644 --- a/modules.json +++ b/modules.json @@ -19,6 +19,11 @@ "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", "installed_by": ["modules"] + }, + "samtools/cat": { + "branch": "master", + "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/samtools/cat/environment.yml b/modules/nf-core/samtools/cat/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/cat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/cat/main.nf b/modules/nf-core/samtools/cat/main.nf new file mode 100644 index 00000000..0490b81d --- /dev/null +++ b/modules/nf-core/samtools/cat/main.nf @@ -0,0 +1,50 @@ +process SAMTOOLS_CAT { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input_files, stageAs: "?/*") + + output: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + """ + samtools \\ + cat \\ + $args \\ + -o ${prefix}.${file_type} \\ + $input_files + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() + """ + touch ${prefix}.${file_type} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/cat/meta.yml b/modules/nf-core/samtools/cat/meta.yml new file mode 100644 index 00000000..dfb0f78c --- /dev/null +++ b/modules/nf-core/samtools/cat/meta.yml @@ -0,0 +1,59 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +name: samtools_cat +description: Concatenate BAM or CRAM file +keywords: + - merge + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_files: + type: file + description: BAM/CRAM files + pattern: "*.{bam,cram}" +output: + - bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.bam: + type: file + description: Concatenated BAM file + pattern: "*.{bam}" + - cram: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.cram: + type: file + description: Concatenated CRAM file + pattern: "*.{cram}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@matthdsm" +maintainers: + - "@matthdsm" diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test b/modules/nf-core/samtools/cat/tests/main.nf.test new file mode 100644 index 00000000..dad80b83 --- /dev/null +++ b/modules/nf-core/samtools/cat/tests/main.nf.test @@ -0,0 +1,61 @@ +nextflow_process { + + name "Test Process SAMTOOLS_CAT" + script "../main.nf" + process "SAMTOOLS_CAT" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/cat" + + test("bams") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bams_bam") }, + { assert snapshot(process.out.cram).match("bams_cram") }, + { assert snapshot(process.out.versions).match("bams_versions") } + ) + } + } + + test("bams_stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bams_stub_bam") }, + { assert snapshot(process.out.cram).match("bams_stub_cram") }, + { assert snapshot(process.out.versions).match("bams_stub_versions") } + ) + } + } +} diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test.snap b/modules/nf-core/samtools/cat/tests/main.nf.test.snap new file mode 100644 index 00000000..9af1b19f --- /dev/null +++ b/modules/nf-core/samtools/cat/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "bams_stub_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:42.587418" + }, + "bams_stub_versions": { + "content": [ + [ + "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:47:51.511914861" + }, + "bams_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:37.965199" + }, + "bams_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:37.96805" + }, + "bams_stub_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-02T16:45:42.583881" + }, + "bams_versions": { + "content": [ + [ + "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:47:50.783194958" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/cat/tests/tags.yml b/modules/nf-core/samtools/cat/tests/tags.yml new file mode 100644 index 00000000..97605570 --- /dev/null +++ b/modules/nf-core/samtools/cat/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/cat: + - "modules/nf-core/samtools/cat/**" diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index f9d09165..be64d5ce 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -9,7 +9,8 @@ include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pi include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -25,7 +26,17 @@ workflow LR_SOMATIC { ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() + + // + // MODULE: Combine bam files from the same sample + // + MERGE_BAM_SAMPLE ( ch_samplesheet ) + .reads + .set { ch_cat_fastq } + ch_versions = ch_versions.mix (CAT_FASTQ_SAMPLE.out.versions.first().ifEmpty(null)) + + // // Collate and save software versions // From bac8bb814f9b4ea005c655c6bfc46cac5797b6c9 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 14:33:31 +0100 Subject: [PATCH 004/557] created cramino module --- modules/local/cramino/environment.yml | 7 +++ modules/local/cramino/main.nf | 72 +++++++++++++++++++++++ modules/local/cramino/meta.yml | 69 ++++++++++++++++++++++ modules/local/cramino/tests/main.nf.test | 73 ++++++++++++++++++++++++ 4 files changed, 221 insertions(+) create mode 100644 modules/local/cramino/environment.yml create mode 100644 modules/local/cramino/main.nf create mode 100644 modules/local/cramino/meta.yml create mode 100644 modules/local/cramino/tests/main.nf.test diff --git a/modules/local/cramino/environment.yml b/modules/local/cramino/environment.yml new file mode 100644 index 00000000..7e7abacd --- /dev/null +++ b/modules/local/cramino/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::cramino=0.15.0" diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf new file mode 100644 index 00000000..1a152360 --- /dev/null +++ b/modules/local/cramino/main.nf @@ -0,0 +1,72 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process CRAMINO { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cramino:0.15.0--h3dc2dae_1': + 'biocontainers/cramino:0.15.0--h3dc2dae_1' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + cramino $args $bam > ${prefix}_cramino.txt + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cramino: \$(cramino --version |& sed '1!d ; s/cramino //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_cramino.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cramino: \$(cramino --version |& sed '1!d ; s/cramino //') + END_VERSIONS + """ +} diff --git a/modules/local/cramino/meta.yml b/modules/local/cramino/meta.yml new file mode 100644 index 00000000..abe5d891 --- /dev/null +++ b/modules/local/cramino/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "cramino" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "cramino": + ## TODO nf-core: Add a description and other details for the software below + description: "A tool for very fast quality assessment of long read cram/bam files." + homepage: "None" + documentation: "None" + tool_dev_url: "None" + doi: "" + licence: ['MIT'] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@alexanRNA" +maintainers: + - "@alexanRNA" diff --git a/modules/local/cramino/tests/main.nf.test b/modules/local/cramino/tests/main.nf.test new file mode 100644 index 00000000..e5d85d24 --- /dev/null +++ b/modules/local/cramino/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test cramino +nextflow_process { + + name "Test Process CRAMINO" + script "../main.nf" + process "CRAMINO" + + tag "modules" + tag "modules_" + tag "cramino" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} From bc32b12c84a8e6cab4c7dd2de5ef5649583b8f8c Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 14:36:47 +0100 Subject: [PATCH 005/557] remove TODO --- modules/local/cramino/main.nf | 41 ++++++++++------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index 1a152360..ac32e102 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -1,20 +1,3 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process CRAMINO { tag "$meta.id" label 'process_single' @@ -37,30 +20,28 @@ process CRAMINO { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + + + + + """ cramino $args $bam > ${prefix}_cramino.txt + + cat <<-END_VERSIONS > versions.yml "${task.process}": cramino: \$(cramino --version |& sed '1!d ; s/cramino //') END_VERSIONS """ + + + + stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ touch ${prefix}_cramino.txt From ffcf46f31a1e8a71ee530b1e2e5c584da1c0847d Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 14:46:55 +0100 Subject: [PATCH 006/557] add cramino info to output.md --- docs/output.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index fc35fed4..734a7120 100644 --- a/docs/output.md +++ b/docs/output.md @@ -13,6 +13,7 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### MultiQC @@ -29,7 +30,20 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + + +### Cramino +
+Output files + +- `cramino/` + - `*_cramino.txt`: text file containing the quality check results from Cramino + +[Cramino](https://github.com/wdecoster/cramino) is a tools for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . + + +### Pipeline information
Output files From 6dc1034cb304a268f5e1819467ab97a1a03cffb2 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 14:48:39 +0100 Subject: [PATCH 007/557] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee035dca..4ff60cca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` +- cramino module ### `Fixed` From daacf746c3eacba1ac0dc339ad400595e740b721 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:09:15 +0100 Subject: [PATCH 008/557] update modules --- conf/modules.config | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f0b0d55a..2cc219de 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -27,4 +27,24 @@ process { ] } + withName: '*CRAMINO_PRE' { + ext.args = { '--ubam' } + publishDir = [ + path: { "${params.outdir}/cramino_ubam" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '*CRAMINO_POST' { + ext.args = { '' } + publishDir = [ + path: { "${params.outdir}/cramino_aln" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + + } From 118e56a03fc965f5c4544f56704e986a2354b404 Mon Sep 17 00:00:00 2001 From: vsc36671 Date: Tue, 4 Feb 2025 15:14:42 +0100 Subject: [PATCH 009/557] Test samplesheet --- assets/samplesheet.csv | 7 +++--- assets/schema_input.json | 24 +++++++++++++------ conf/test.config | 4 ++-- .../utils_nfcore_lr_somatic_pipeline/main.nf | 12 +++++----- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 5f653ab7..dc42d351 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,3 +1,4 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, +sample,bam_tumor,bam_normal,method,specs +sample1_pb_paired,/path/to/sample1_tumor.bam,/path/to/sample1_normal.bam,pb,NA +sample1_ont_paired,/path/to/sample2_tumor.bam,/path/to/sample2_normal.bam,ont,R9 +sample1_ont_tumoronly,/path/to/sample3_tumor.bam,,ont,R10 \ No newline at end of file diff --git a/assets/schema_input.json b/assets/schema_input.json index fda49a3f..d9a225f2 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -13,21 +13,31 @@ "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["id"] }, - "fastq_1": { + "bam_tumor": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of tumor sample must be provided, cannot contain spaces and must have extension '.bam'" }, - "fastq_2": { + "bam_normal": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of normal sample must be provided, cannot contain spaces and must have extension '.bam'" + }, + "method": { + "type": "string", + "enum": ["pb", "ont"], + "errorMessage": "Method must be one of the following: 'pb' or 'ont'" + }, + "specs": { + "type": "string", + "enum": ["R9", "R10", "NA"], + "errorMessage": "Detailed of the used sequencing technology (R9 or R10) for ont and 'NA' for pb" } }, - "required": ["sample", "fastq_1"] + "required": ["sample", "bam_tumor","method","specs"] } } diff --git a/conf/test.config b/conf/test.config index ec9b4d95..90d1e401 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,8 +25,8 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - + //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + input = '/staging/leuven/stg_00096/home/laulambr/hackaton_250204/lr_somatic/assets/samplesheet.csv' // Genome references genome = 'R64-1-1' } diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index d366b8f6..09fc69e9 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -75,11 +75,11 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] + meta, bam_tumor, bam_normal -> + if (!bam_normal) { + return [ meta.id, meta + [ paired_data:false ], [ bam_tumor ] ] } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] + return [ meta.id, meta + [ paired_data:true ], [ bam_tumor, bam_normal ] ] } } .groupTuple() @@ -87,8 +87,8 @@ workflow PIPELINE_INITIALISATION { validateInputSamplesheet(samplesheet) } .map { - meta, fastqs -> - return [ meta, fastqs.flatten() ] + meta, bams -> + return [ meta, bams.flatten() ] } .set { ch_samplesheet } From 86633c9b4e9e14217feaddd2ae57f126c75e93f3 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:36:37 +0100 Subject: [PATCH 010/557] install modkit pileup module and updated manually to 0.4.3 --- modules.json | 5 + modules/nf-core/modkit/pileup/environment.yml | 7 + modules/nf-core/modkit/pileup/main.nf | 70 ++ modules/nf-core/modkit/pileup/meta.yml | 90 +++ .../nf-core/modkit/pileup/tests/main.nf.test | 378 ++++++++++ .../modkit/pileup/tests/main.nf.test.snap | 674 ++++++++++++++++++ .../pileup/tests/nextflow.traditional.config | 5 + .../tests/nextflow.traditional_hp.config | 5 + .../nextflow.traditional_hp_bedgraph.config | 5 + modules/nf-core/modkit/pileup/tests/tags.yml | 2 + 10 files changed, 1241 insertions(+) create mode 100644 modules/nf-core/modkit/pileup/environment.yml create mode 100644 modules/nf-core/modkit/pileup/main.nf create mode 100644 modules/nf-core/modkit/pileup/meta.yml create mode 100644 modules/nf-core/modkit/pileup/tests/main.nf.test create mode 100644 modules/nf-core/modkit/pileup/tests/main.nf.test.snap create mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional.config create mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config create mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config create mode 100644 modules/nf-core/modkit/pileup/tests/tags.yml diff --git a/modules.json b/modules.json index 99f2f4e0..38da8439 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "modkit/pileup": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", diff --git a/modules/nf-core/modkit/pileup/environment.yml b/modules/nf-core/modkit/pileup/environment.yml new file mode 100644 index 00000000..7a87bce9 --- /dev/null +++ b/modules/nf-core/modkit/pileup/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - ont-modkit=0.3.0 diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf new file mode 100644 index 00000000..284f8d50 --- /dev/null +++ b/modules/nf-core/modkit/pileup/main.nf @@ -0,0 +1,70 @@ +process MODKIT_PILEUP { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ont-modkit:0.4.3--hcdda2d0_0': + 'biocontainers/ont-modkit:0.4.3--hcdda2d0_0' }" + + input: + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + tuple val(meta3), path(bed) + + output: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--ref ${fasta}" : "" + def include_bed = bed ? "--include-bed ${bed}" : '' + + """ + modkit \\ + pileup \\ + $args \\ + --threads ${task.cpus} \\ + --prefix ${prefix} \\ + $reference \\ + $include_bed \\ + $bam \\ + ${prefix}.tmp + + if test -d ${prefix}.tmp; then + for file in ${prefix}.tmp/*; do + if test -f \$file; then + mv \$file \$(basename \$file) + fi + done + else + mv ${prefix}.tmp ${prefix}.bed + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + modkit: \$( modkit --version | sed 's/mod_kit //' ) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bed + touch ${prefix}.bedgraph + touch ${prefix}.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + modkit: \$( modkit --version | sed 's/mod_kit //' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modkit/pileup/meta.yml b/modules/nf-core/modkit/pileup/meta.yml new file mode 100644 index 00000000..2f274d0c --- /dev/null +++ b/modules/nf-core/modkit/pileup/meta.yml @@ -0,0 +1,90 @@ +name: modkit_pileup +description: A bioinformatics tool for working with modified bases +keywords: + - methylation + - ont + - long-read +tools: + - "modkit": + description: A bioinformatics tool for working with modified bases in Oxford Nanopore + sequencing data + homepage: https://github.com/nanoporetech/modkit + documentation: https://github.com/nanoporetech/modkit + tool_dev_url: https://github.com/nanoporetech/modkit + licence: ["Oxford Nanopore Technologies PLC. Public License Version 1.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + - bai: + type: file + description: Associated index file for BAM + pattern: "*.bai" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference sequence in FASTA format. Required for motif (e.g. CpG) + filtering + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing BED file information + e.g. `[ id:'regions' ]` + - bed: + type: file + description: BED file that will restrict threshold estimation and pileup results + to positions overlapping intervals in the file + pattern: "*.bed" +output: + - bed: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.bed": + type: file + description: bedMethyl output file(s) + pattern: "*.bed" + - bedgraph: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.bedgraph": + type: file + description: bedgraph output files + pattern: "*.bedgraph" + - log: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.log": + type: file + description: File for debug logs to be written to + pattern: "*.log" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@Michal-Babins" + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test b/modules/nf-core/modkit/pileup/tests/main.nf.test new file mode 100644 index 00000000..371cc3b9 --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test @@ -0,0 +1,378 @@ +nextflow_process { + + name "Test Process MODKIT_PILEUP" + script "../main.nf" + tag "modules" + tag "modules_nfcore" + tag "modkit" + tag "modkit/pileup" + process "MODKIT_PILEUP" + + test("[bam, bai], [], []") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [[],[]] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, []") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed") { + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional") { + + config "./nextflow.traditional.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional, HP") { + + config "./nextflow.traditional_hp.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional, HP, bedgraph") { + + config "./nextflow.traditional_hp_bedgraph.config" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], [], [] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [[],[]] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, [] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [[],[]] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional - stub") { + + config "./nextflow.traditional.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional, HP - stub") { + + config "./nextflow.traditional_hp.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[bam, bai], fasta, bed - traditional, HP, bedgraph - stub") { + + config "./nextflow.traditional_hp_bedgraph.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id: 'test_ref' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = Channel.of('chr22\t0\t1000') + .collectFile(name: 'chr22.bed', newLine: true) + .map { file -> [ [ id:'chr22' ], file ] } + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap new file mode 100644 index 00000000..b960409d --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -0,0 +1,674 @@ +{ + "[bam, bai], fasta, bed - traditional, HP": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:09:40.272533628" + }, + "[bam, bai], fasta, bed - traditional, HP, bedgraph - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:11:33.234594142" + }, + "[bam, bai], fasta, []": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:09:03.537667806" + }, + "[bam, bai], fasta, bed - traditional - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:10:45.47904997" + }, + "[bam, bai], fasta, bed - traditional, HP - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:11:06.023194848" + }, + "[bam, bai], fasta, [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:10:17.995261822" + }, + "[bam, bai], fasta, bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:10:30.574897879" + }, + "[bam, bai], [], []": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,f973de342df883efc1656c82a3a3978d" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:08:51.291346508" + }, + "[bam, bai], [], [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "bedgraph": [ + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:10:05.670301111" + }, + "[bam, bai], fasta, bed": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:09:15.042805699" + }, + "[bam, bai], fasta, bed - traditional, HP, bedgraph": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + + ], + "bedgraph": [ + [ + { + "id": "test" + }, + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] + ] + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:09:52.968133216" + }, + "[bam, bai], fasta, bed - traditional": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" + ] + ], + "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-10T09:09:27.735400826" + } +} \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config new file mode 100644 index 00000000..672598d5 --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional' + } +} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config new file mode 100644 index 00000000..c0e0d79a --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional --partition-tag HP' + } +} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config new file mode 100644 index 00000000..4f456dcd --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = '--preset traditional --partition-tag HP --bedgraph' + } +} diff --git a/modules/nf-core/modkit/pileup/tests/tags.yml b/modules/nf-core/modkit/pileup/tests/tags.yml new file mode 100644 index 00000000..578e48b1 --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/tags.yml @@ -0,0 +1,2 @@ +modkit/pileup: + - "modules/nf-core/modkit/pileup/**" From 44399dc0bacd9d8304c117ae674809c4d6a76c52 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:45:42 +0100 Subject: [PATCH 011/557] modkit pilep add to config file --- conf/modules.config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 2cc219de..1bf482bd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -45,6 +45,16 @@ process { ] } + withName: '*MODKIT_PILEUP' { + ext.args = { '' } + publishDir = [ + path: { "${params.outdir}/modkit_pileup" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + } From 6c86ba8abf072edd15b1cdb2efedaa082617b427 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:52:30 +0100 Subject: [PATCH 012/557] update output.md file --- docs/output.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 734a7120..9cb4fbe1 100644 --- a/docs/output.md +++ b/docs/output.md @@ -14,6 +14,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files +- [Modkit](#modkit) - Tool to process methylation data - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### MultiQC @@ -40,7 +41,25 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ - `cramino/` - `*_cramino.txt`: text file containing the quality check results from Cramino -[Cramino](https://github.com/wdecoster/cramino) is a tools for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . +
+ +[Cramino](https://github.com/wdecoster/cramino) is a tool for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . + + + +### Modkit +
+Output files + +- `modkit/` + - `*.bed`: bed file with genomic positions wiht modified bases + - `*.bedgraph`: bedgraph file with genomic positions wiht modified bases + - `*log`: log file + +
+ +[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see , + ### Pipeline information From d388c11f0bf6def4dc21542367d94dd13d183944 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:53:20 +0100 Subject: [PATCH 013/557] fix typo --- docs/output.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/output.md b/docs/output.md index 9cb4fbe1..58ee0202 100644 --- a/docs/output.md +++ b/docs/output.md @@ -52,8 +52,8 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ Output files - `modkit/` - - `*.bed`: bed file with genomic positions wiht modified bases - - `*.bedgraph`: bedgraph file with genomic positions wiht modified bases + - `*.bed`: bed file with genomic positions with modified bases + - `*.bedgraph`: bedgraph file with genomic positions with modified bases - `*log`: log file
From 4d88ec599c8f3cd1da760a1c074fa2dd319dce7c Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 15:56:30 +0100 Subject: [PATCH 014/557] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ff60cca..4e45a60d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ ### `Added` - cramino module +- modkit pileup module ### `Fixed` From 1d11761fec33e12d01ae204a2076aff9b58f50a9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 16:07:31 +0100 Subject: [PATCH 015/557] added prepare ref files --- conf/modules.config | 16 +- modules.json | 10 + modules/nf-core/pigz/uncompress/main.nf | 48 ++++ modules/nf-core/pigz/uncompress/meta.yml | 42 +++ .../pigz/uncompress/tests/main.nf.test | 33 +++ .../pigz/uncompress/tests/main.nf.test.snap | 35 +++ .../nf-core/pigz/uncompress/tests/tags.yml | 2 + .../nf-core/samtools/faidx/environment.yml | 8 + modules/nf-core/samtools/faidx/main.nf | 50 ++++ modules/nf-core/samtools/faidx/meta.yml | 80 ++++++ .../nf-core/samtools/faidx/tests/main.nf.test | 122 +++++++++ .../samtools/faidx/tests/main.nf.test.snap | 249 ++++++++++++++++++ .../samtools/faidx/tests/nextflow.config | 7 + .../samtools/faidx/tests/nextflow2.config | 6 + modules/nf-core/samtools/faidx/tests/tags.yml | 2 + subworkflows/local/prepare_reference_files.nf | 38 +++ workflows/lr_somatic.nf | 99 ++++++- 17 files changed, 840 insertions(+), 7 deletions(-) create mode 100644 modules/nf-core/pigz/uncompress/main.nf create mode 100644 modules/nf-core/pigz/uncompress/meta.yml create mode 100644 modules/nf-core/pigz/uncompress/tests/main.nf.test create mode 100644 modules/nf-core/pigz/uncompress/tests/main.nf.test.snap create mode 100644 modules/nf-core/pigz/uncompress/tests/tags.yml create mode 100644 modules/nf-core/samtools/faidx/environment.yml create mode 100644 modules/nf-core/samtools/faidx/main.nf create mode 100644 modules/nf-core/samtools/faidx/meta.yml create mode 100644 modules/nf-core/samtools/faidx/tests/main.nf.test create mode 100644 modules/nf-core/samtools/faidx/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/faidx/tests/nextflow.config create mode 100644 modules/nf-core/samtools/faidx/tests/nextflow2.config create mode 100644 modules/nf-core/samtools/faidx/tests/tags.yml create mode 100644 subworkflows/local/prepare_reference_files.nf diff --git a/conf/modules.config b/conf/modules.config index f0b0d55a..6a34e951 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,7 +18,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: 'MULTIQC' { + withName: '*MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, @@ -26,5 +26,19 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '*MINIMAP_ALIGN' { + ext.args = { + [ + { "-ax map-ont" }, + params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " + ].join(' ').trim() + ext.args4 = '-T "*"' + } + publishDir = [ + enabled: false + ] + + } } diff --git a/modules.json b/modules.json index 16f2cb50..d349465c 100644 --- a/modules.json +++ b/modules.json @@ -20,10 +20,20 @@ "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", "installed_by": ["modules"] }, + "pigz/uncompress": { + "branch": "master", + "git_sha": "c70357ea249a541df53dd5b479b3c32b0c26c4d2", + "installed_by": ["modules"] + }, "samtools/cat": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", "installed_by": ["modules"] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/pigz/uncompress/main.nf b/modules/nf-core/pigz/uncompress/main.nf new file mode 100644 index 00000000..c7528f86 --- /dev/null +++ b/modules/nf-core/pigz/uncompress/main.nf @@ -0,0 +1,48 @@ +process PIGZ_UNCOMPRESS { + label 'process_low' + //stageInMode 'copy' // this directive can be set in case the original input should be kept + + conda "conda-forge::pigz" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pigz:2.8': + 'biocontainers/pigz:2.8' }" + + input: + tuple val(meta), path(zip) + + output: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + uncompressed_filename = zip.toString() - '.gz' + // calling pigz -f to make it follow symlinks + """ + unpigz \\ + -p $task.cpus \\ + -fk \\ + $args \\ + ${zip} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + uncompressed_filename = zip.toString() - '.gz' + """ + touch ${zip.dropRight(3)} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + END_VERSIONS + """ +} diff --git a/modules/nf-core/pigz/uncompress/meta.yml b/modules/nf-core/pigz/uncompress/meta.yml new file mode 100644 index 00000000..3f583b22 --- /dev/null +++ b/modules/nf-core/pigz/uncompress/meta.yml @@ -0,0 +1,42 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +name: "pigz_uncompress" +description: write your description here +keywords: + - uncompress + - gzip + - parallelized +tools: + - "pigz": + description: "Parallel implementation of the gzip algorithm." + homepage: "https://zlib.net/pigz/" + documentation: "https://zlib.net/pigz/pigz.pdf" + + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - zip: + type: file + description: Gzipped file + pattern: "*.{gzip}" +output: + - file: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test']` + - ${uncompressed_filename}: + type: file + description: File to compress + pattern: "*" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@lrauschning" diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test b/modules/nf-core/pigz/uncompress/tests/main.nf.test new file mode 100644 index 00000000..62ab27e2 --- /dev/null +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test @@ -0,0 +1,33 @@ +nextflow_process { + + name "Test Process PIGZ_UNCOMPRESS" + script "modules/nf-core/pigz/uncompress/main.nf" + process "PIGZ_UNCOMPRESS" + tag "modules" + tag "modules_nfcore" + tag "pigz" + tag "pigz/uncompress" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + +} \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap new file mode 100644 index 00000000..126dd7d6 --- /dev/null +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap @@ -0,0 +1,35 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "1": [ + "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + ], + "file": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" + ] + ], + "versions": [ + "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-15T16:43:21.55056643" + } +} \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/tags.yml b/modules/nf-core/pigz/uncompress/tests/tags.yml new file mode 100644 index 00000000..6719a90a --- /dev/null +++ b/modules/nf-core/pigz/uncompress/tests/tags.yml @@ -0,0 +1,2 @@ +pigz/uncompress: + - modules/nf-core/pigz/uncompress/** diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf new file mode 100644 index 00000000..28c0a81c --- /dev/null +++ b/modules/nf-core/samtools/faidx/main.nf @@ -0,0 +1,50 @@ +process SAMTOOLS_FAIDX { + tag "$fasta" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(fasta) + tuple val(meta2), path(fai) + + output: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa , optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + samtools \\ + faidx \\ + $fasta \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() + def fastacmd = match[0] ? "touch ${match[0][1]}" : '' + """ + ${fastacmd} + touch ${fasta}.fai + + cat <<-END_VERSIONS > versions.yml + + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml new file mode 100644 index 00000000..6721b2cb --- /dev/null +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -0,0 +1,80 @@ +name: samtools_faidx +description: Index FASTA file +keywords: + - index + - fasta + - faidx +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" +output: + - fa: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{fa,fasta}": + type: file + description: FASTA file + pattern: "*.{fa}" + - fai: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.fai": + type: file + description: FASTA index file + pattern: "*.{fai}" + - gzi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.gzi": + type: file + description: Optional gzip index file for compressed inputs + pattern: "*.gzi" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@ewels" + - "@phue" +maintainers: + - "@drpatelh" + - "@ewels" + - "@phue" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test new file mode 100644 index 00000000..17244ef2 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -0,0 +1,122 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FAIDX" + script "../main.nf" + process "SAMTOOLS_FAIDX" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/faidx" + + test("test_samtools_faidx") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_bgzip") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true)] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fasta") { + + config "./nextflow2.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fai") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap new file mode 100644 index 00000000..1bbb3ec2 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -0,0 +1,249 @@ +{ + "test_samtools_faidx": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:57:47.450887871" + }, + "test_samtools_faidx_bgzip": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "3": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:58:04.804905659" + }, + "test_samtools_faidx_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:58:23.831268154" + }, + "test_samtools_faidx_stub_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:58:35.600243706" + }, + "test_samtools_faidx_stub_fai": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T07:58:54.705460167" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config new file mode 100644 index 00000000..f76a3ba0 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = 'MT192765.1 -o extract.fa' + } + +} diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config new file mode 100644 index 00000000..33ebbd5d --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow2.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = '-o extract.fa' + } +} diff --git a/modules/nf-core/samtools/faidx/tests/tags.yml b/modules/nf-core/samtools/faidx/tests/tags.yml new file mode 100644 index 00000000..e4a83948 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/faidx: + - modules/nf-core/samtools/faidx/** diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf new file mode 100644 index 00000000..c43775c1 --- /dev/null +++ b/subworkflows/local/prepare_reference_files.nf @@ -0,0 +1,38 @@ +// +// Creates gtfs to that add introns as features +// + +include { PIGZ_UNCOMPRESS as UNZIP_FASTA } from '../../modules/nf-core/pigz/uncompress/main' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' + +workflow PREPARE_REFERENCE_FILES { + take: + fasta + + main: + ch_versions = Channel.empty() + + // Check if fasta and gtf are zipped + + // + ch_prepared_fasta = Channel.empty() + if (fasta.endsWith('.gz')){ + UNZIP_FASTA( [ [:], fasta ]) + + ch_prepared_fasta = UNZIP_FASTA.out.file + ch_versions = ch_versions.mix(UNZIP_FASTA.out.versions) + } else { + ch_prepared_fasta = [ [:], fasta ] + } + + // + // MODULE: Index the fasta + // + SAMTOOLS_FAIDX( ch_prepared_fasta, [ [:], "$projectDir/assets/dummy_file.txt" ]) + ch_prepared_fai = SAMTOOLS_FAIDX.out.fai + + emit: + prepped_fasta = ch_prepared_fasta + prepped_fai = ch_prepared_fai + versions = ch_versions +} \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index be64d5ce..ab52a4b3 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -9,8 +9,10 @@ include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pi include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { SAMTOOLS_CAT as SAMTOOLS_CAT_TUMOUR } from '../modules/nf-core/samtools/cat/main' +include { SAMTOOLS_CAT as SAMTOOLS_CAT_NORMAL } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -28,14 +30,99 @@ workflow LR_SOMATIC { ch_multiqc_files = Channel.empty() // - // MODULE: Combine bam files from the same sample + // SUBWORKFLOW: Read in samplesheet, validate and stage input files // - MERGE_BAM_SAMPLE ( ch_samplesheet ) + ch_samplesheet + .branch{ + meta, tumour -> + single: tumour.size() == 1 + return [ meta, tumour.flatten(), normal.flatten() ] // TODO: this probably doesnt work + multiple: tumour.size() > 1 + return [ meta, tumour.flatten(), normal.flatten() ] + } + .set { ch_ubams } + + // TODO: Split workflow here in paired/tumour-only? + + // + // MODULE: Combine bam files from the same sample (TUMOUR ubams) + // + // TODO: Ensure it only takes tumour bam here + SAMTOOLS_CAT_TUMOUR ( ch_ubams.multiple ) + .reads + .mix ( ch_ubams.single ) + .set { ch_cat_ubams } + + ch_versions = ch_versions.mix (SAMTOOLS_CAT_TUMOUR.out.versions.first().ifEmpty(null)) + + // + // MODULE: Combine bam files from the same sample (NORMAL ubams) + // + // TODO: Ensure it only takes normal bam here + SAMTOOLS_CAT_NORMAL ( ch_ubams.multiple ) .reads - .set { ch_cat_fastq } + .mix ( ch_ubams.single ) + .set { ch_cat_ubams } - ch_versions = ch_versions.mix (CAT_FASTQ_SAMPLE.out.versions.first().ifEmpty(null)) + + ch_versions = ch_versions.mix (SAMTOOLS_CAT_NORMAL.out.versions.first().ifEmpty(null)) + + // TODO: Add pre-alignment QC step here + // + // MODULE: CRAMINO + // + CRAMINO_PRE ( ) + + + // + // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // + + PREPARE_REFERENCE_FILES ( params.fasta ) + + ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta + ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) + + // + // MODULE: Run MINIMAP2_INDEX + // + + // Create minimap2 index channel + + + if (!params.skip_save_minimap2_index) { + + MINIMAP2_INDEX ( ch_fasta ) + ch_minimap_index = MINIMAP2_INDEX.out.index + + ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) + } + + // + // MODULE: Run MINIMAP2_ALIGN + // + MINIMAP2_ALIGN ( + ch_cat_ubams, + ch_minimap_index, + true, + 'bai', + "", + "" + ) + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + MINIMAP2_ALIGN.out.bam + | set { ch_minimap_bam } + + + // TODO: Add post-alignment QC step here + // + // MODULE: CRAMINO + // + CRAMINO_POST ( ) // // Collate and save software versions From c4175850b30d88cbc9078bf1543ccc21fbd3cdf8 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 16:09:14 +0100 Subject: [PATCH 016/557] Add nf-core mosdepth --- modules.json | 5 + modules/nf-core/mosdepth/environment.yml | 8 + modules/nf-core/mosdepth/main.nf | 80 + modules/nf-core/mosdepth/meta.yml | 179 +++ modules/nf-core/mosdepth/tests/main.nf.test | 246 +++ .../nf-core/mosdepth/tests/main.nf.test.snap | 1386 +++++++++++++++++ .../nf-core/mosdepth/tests/quantized.config | 3 + modules/nf-core/mosdepth/tests/tags.yml | 2 + .../nf-core/mosdepth/tests/threshold.config | 3 + modules/nf-core/mosdepth/tests/window.config | 3 + 10 files changed, 1915 insertions(+) create mode 100644 modules/nf-core/mosdepth/environment.yml create mode 100644 modules/nf-core/mosdepth/main.nf create mode 100644 modules/nf-core/mosdepth/meta.yml create mode 100644 modules/nf-core/mosdepth/tests/main.nf.test create mode 100644 modules/nf-core/mosdepth/tests/main.nf.test.snap create mode 100644 modules/nf-core/mosdepth/tests/quantized.config create mode 100644 modules/nf-core/mosdepth/tests/tags.yml create mode 100644 modules/nf-core/mosdepth/tests/threshold.config create mode 100644 modules/nf-core/mosdepth/tests/window.config diff --git a/modules.json b/modules.json index 99f2f4e0..5bd9ea39 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "mosdepth": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", diff --git a/modules/nf-core/mosdepth/environment.yml b/modules/nf-core/mosdepth/environment.yml new file mode 100644 index 00000000..f871e054 --- /dev/null +++ b/modules/nf-core/mosdepth/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/mosdepth + - mosdepth=0.3.10 diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf new file mode 100644 index 00000000..3bf945f9 --- /dev/null +++ b/modules/nf-core/mosdepth/main.nf @@ -0,0 +1,80 @@ +process MOSDEPTH { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mosdepth:0.3.10--h4e814b3_1' : + 'biocontainers/mosdepth:0.3.10--h4e814b3_1'}" + + input: + tuple val(meta), path(bam), path(bai), path(bed) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--fasta ${fasta}" : "" + def interval = bed ? "--by ${bed}" : "" + if (bed && args.contains("--by")) { + error "'--by' can only be specified once when running mosdepth! Either remove input BED file definition or remove '--by' from 'ext.args' definition" + } + if (!bed && args.contains("--thresholds")) { + error "'--thresholds' can only be specified in conjunction with '--by'" + } + + """ + mosdepth \\ + --threads $task.cpus \\ + $interval \\ + $reference \\ + $args \\ + $prefix \\ + $bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.global.dist.txt + touch ${prefix}.region.dist.txt + touch ${prefix}.summary.txt + touch ${prefix}.per-base.d4 + echo "" | gzip > ${prefix}.per-base.bed.gz + touch ${prefix}.per-base.bed.gz.csi + echo "" | gzip > ${prefix}.regions.bed.gz + touch ${prefix}.regions.bed.gz.csi + echo "" | gzip > ${prefix}.quantized.bed.gz + touch ${prefix}.quantized.bed.gz.csi + echo "" | gzip > ${prefix}.thresholds.bed.gz + touch ${prefix}.thresholds.bed.gz.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml new file mode 100644 index 00000000..dc783c90 --- /dev/null +++ b/modules/nf-core/mosdepth/meta.yml @@ -0,0 +1,179 @@ +name: mosdepth +description: Calculates genome-wide sequencing coverage. +keywords: + - mosdepth + - bam + - cram + - coverage +tools: + - mosdepth: + description: | + Fast BAM/CRAM depth calculation for WGS, exome, or targeted sequencing. + documentation: https://github.com/brentp/mosdepth + doi: 10.1093/bioinformatics/btx699 + licence: ["MIT"] + identifier: biotools:mosdepth +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Input BAM/CRAM file + pattern: "*.{bam,cram}" + - bai: + type: file + description: Index for BAM/CRAM file + pattern: "*.{bai,crai}" + - bed: + type: file + description: BED file with intersected intervals + pattern: "*.{bed}" + - - meta2: + type: map + description: | + Groovy Map containing bed information + e.g. [ id:'test' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta}" +output: + - global_txt: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.global.dist.txt": + type: file + description: Text file with global cumulative coverage distribution + pattern: "*.{global.dist.txt}" + - summary_txt: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.summary.txt": + type: file + description: Text file with summary mean depths per chromosome and regions + pattern: "*.{summary.txt}" + - regions_txt: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.region.dist.txt": + type: file + description: Text file with region cumulative coverage distribution + pattern: "*.{region.dist.txt}" + - per_base_d4: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.d4": + type: file + description: D4 file with per-base coverage + pattern: "*.{per-base.d4}" + - per_base_bed: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.bed.gz": + type: file + description: BED file with per-base coverage + pattern: "*.{per-base.bed.gz}" + - per_base_csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.per-base.bed.gz.csi": + type: file + description: Index file for BED file with per-base coverage + pattern: "*.{per-base.bed.gz.csi}" + - regions_bed: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.regions.bed.gz": + type: file + description: BED file with per-region coverage + pattern: "*.{regions.bed.gz}" + - regions_csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.regions.bed.gz.csi": + type: file + description: Index file for BED file with per-region coverage + pattern: "*.{regions.bed.gz.csi}" + - quantized_bed: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.quantized.bed.gz": + type: file + description: BED file with binned coverage + pattern: "*.{quantized.bed.gz}" + - quantized_csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.quantized.bed.gz.csi": + type: file + description: Index file for BED file with binned coverage + pattern: "*.{quantized.bed.gz.csi}" + - thresholds_bed: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.thresholds.bed.gz": + type: file + description: BED file with the number of bases in each region that are covered + at or above each threshold + pattern: "*.{thresholds.bed.gz}" + - thresholds_csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.thresholds.bed.gz.csi": + type: file + description: Index file for BED file with threshold coverage + pattern: "*.{thresholds.bed.gz.csi}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" + - "@matthdsm" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/mosdepth/tests/main.nf.test b/modules/nf-core/mosdepth/tests/main.nf.test new file mode 100644 index 00000000..0b3c860d --- /dev/null +++ b/modules/nf-core/mosdepth/tests/main.nf.test @@ -0,0 +1,246 @@ +nextflow_process { + + name "Test Process MOSDEPTH" + script "../main.nf" + process "MOSDEPTH" + + tag "modules" + tag "modules_nfcore" + tag "mosdepth" + + test("homo_sapiens - bam, bai, []") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - cram, crai, []") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - cram, crai, bed") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - window") { + + config "./window.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - quantized") { + + config "./quantized.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed - thresholds") { + + config "./threshold.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - bam, bai, bed - fail") { + + config "./window.config" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.failed } + ) + } + + } + + test("homo_sapiens - bam, bai, [] - stub") { + + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test', single_end:true ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/mosdepth/tests/main.nf.test.snap b/modules/nf-core/mosdepth/tests/main.nf.test.snap new file mode 100644 index 00000000..67e16562 --- /dev/null +++ b/modules/nf-core/mosdepth/tests/main.nf.test.snap @@ -0,0 +1,1386 @@ +{ + "homo_sapiens - bam, bai, [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.global.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "per_base_d4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.d4:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "quantized_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "quantized_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "thresholds_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "thresholds_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:57:12.350279421" + }, + "homo_sapiens - cram, crai, bed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:12.528228123" + }, + "homo_sapiens - bam, bai, [] - quantized": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,f037c215449d361112efc10108fcc17c" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + ] + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz:md5,f037c215449d361112efc10108fcc17c" + ] + ], + "quantized_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + ] + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:38.422491251" + }, + "homo_sapiens - bam, bai, bed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:43.01015749" + }, + "homo_sapiens - bam, bai, [] - window": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,0b6ea9f0da1228252d9aef2d3b6f7f76" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,34f48d16fcdd61e44d812e29e02c77b8" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,34f48d16fcdd61e44d812e29e02c77b8" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,0b6ea9f0da1228252d9aef2d3b6f7f76" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:27.10647246" + }, + "homo_sapiens - bam, bai, []": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:30.449110281" + }, + "homo_sapiens - cram, crai, []": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + + ], + "regions_csi": [ + + ], + "regions_txt": [ + + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59" + ] + ], + "thresholds_bed": [ + + ], + "thresholds_csi": [ + + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:55:55.244274402" + }, + "homo_sapiens - bam, bai, bed - thresholds": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,fe70ae728cd10726c42a2bcd44adfc9d" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + ] + ], + "12": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "8": [ + + ], + "9": [ + + ], + "global_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "per_base_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa" + ] + ], + "per_base_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + ] + ], + "per_base_d4": [ + + ], + "quantized_bed": [ + + ], + "quantized_csi": [ + + ], + "regions_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz:md5,9ded0397623fda26a6a3514d6a0e2a2c" + ] + ], + "regions_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + ] + ], + "regions_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.region.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e" + ] + ], + "summary_txt": [ + [ + { + "id": "test", + "single_end": true + }, + "test.mosdepth.summary.txt:md5,96c037f769974b904beb53edc4f56d82" + ] + ], + "thresholds_bed": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz:md5,fe70ae728cd10726c42a2bcd44adfc9d" + ] + ], + "thresholds_csi": [ + [ + { + "id": "test", + "single_end": true + }, + "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + ] + ], + "versions": [ + "versions.yml:md5,333368078626c18a32eeb12299080cc9" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-17T14:56:49.888375978" + } +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/quantized.config b/modules/nf-core/mosdepth/tests/quantized.config new file mode 100644 index 00000000..63c55350 --- /dev/null +++ b/modules/nf-core/mosdepth/tests/quantized.config @@ -0,0 +1,3 @@ +process { + ext.args = "--quantize 0:1:4:100:200" +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/tags.yml b/modules/nf-core/mosdepth/tests/tags.yml new file mode 100644 index 00000000..5cd2e08e --- /dev/null +++ b/modules/nf-core/mosdepth/tests/tags.yml @@ -0,0 +1,2 @@ +mosdepth: + - "modules/nf-core/mosdepth/**" diff --git a/modules/nf-core/mosdepth/tests/threshold.config b/modules/nf-core/mosdepth/tests/threshold.config new file mode 100644 index 00000000..9b014ddf --- /dev/null +++ b/modules/nf-core/mosdepth/tests/threshold.config @@ -0,0 +1,3 @@ +process { + ext.args = "--thresholds 1,10,20,30" +} \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/window.config b/modules/nf-core/mosdepth/tests/window.config new file mode 100644 index 00000000..7a0f755c --- /dev/null +++ b/modules/nf-core/mosdepth/tests/window.config @@ -0,0 +1,3 @@ +process { + ext.args = "--by 100" +} \ No newline at end of file From e63e50eff8c93a45045323b69d6b533c7b6d3fd8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 16:12:47 +0100 Subject: [PATCH 017/557] prepared lr_somatif.nf for some later additions --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index ab52a4b3..eeb91ee5 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -114,7 +114,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) MINIMAP2_ALIGN.out.bam - | set { ch_minimap_bam } + .set { ch_minimap_bam } // TODO: Add post-alignment QC step here From d4515b89bf65a003b9a004386365928b6a546089 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 16:19:56 +0100 Subject: [PATCH 018/557] mosdepth add to module config --- conf/modules.config | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 1bf482bd..1eedb696 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -54,6 +54,15 @@ process { ] } + withName: '*MOSDEPTH' { + ext.args = { '' } + publishDir = [ + path: { "${params.outdir}/mosdepth" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + From 936228526831a26c92eaa228198a7bf3be5e9d5c Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 16:24:59 +0100 Subject: [PATCH 019/557] add changes to changelog and output md --- CHANGELOG.md | 1 + docs/output.md | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e45a60d..e9296baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ ### `Added` - cramino module - modkit pileup module +- mosdepth module ### `Fixed` diff --git a/docs/output.md b/docs/output.md index 58ee0202..d3222a79 100644 --- a/docs/output.md +++ b/docs/output.md @@ -15,6 +15,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files - [Modkit](#modkit) - Tool to process methylation data +- [Mosdepth](#mosdepth) - Tool to check the sequencing depth - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### MultiQC @@ -58,7 +59,23 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ -[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see , +[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see . + + +### Mosdepth +
+Output files + +- `mosdepth` + - `*.summary.txt'`: summary text file + - `*.global.dist.txt`: global information on sequencing depth file + - optionally outputs other files by regions. + +
+ +[Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . + + From fff5836c90bd5877e611ebb703bada7a90bbb418 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Feb 2025 16:45:48 +0100 Subject: [PATCH 020/557] readded modkit pileup --- modules.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules.json b/modules.json index 0d2375e1..f337d353 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "modkit/pileup": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "mosdepth": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", From ec63ef8507098abaef94236b192fc862655dab7b Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 16:55:50 +0100 Subject: [PATCH 021/557] install nf-core severus module --- modules.json | 13 +- modules/nf-core/severus/environment.yml | 7 + modules/nf-core/severus/main.nf | 89 ++++ modules/nf-core/severus/meta.yml | 217 +++++++++ modules/nf-core/severus/tests/main.nf.test | 208 +++++++++ .../nf-core/severus/tests/main.nf.test.snap | 435 ++++++++++++++++++ modules/nf-core/severus/tests/nextflow.config | 5 + modules/nf-core/severus/tests/tags.yml | 2 + 8 files changed, 972 insertions(+), 4 deletions(-) create mode 100644 modules/nf-core/severus/environment.yml create mode 100644 modules/nf-core/severus/main.nf create mode 100644 modules/nf-core/severus/meta.yml create mode 100644 modules/nf-core/severus/tests/main.nf.test create mode 100644 modules/nf-core/severus/tests/main.nf.test.snap create mode 100644 modules/nf-core/severus/tests/nextflow.config create mode 100644 modules/nf-core/severus/tests/tags.yml diff --git a/modules.json b/modules.json index f337d353..554b1abc 100644 --- a/modules.json +++ b/modules.json @@ -5,22 +5,22 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { - "modkit/pileup": { + "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", "installed_by": ["modules"] }, - "mosdepth": { + "minimap2/index": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", "installed_by": ["modules"] }, - "minimap2/align": { + "modkit/pileup": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", "installed_by": ["modules"] }, - "minimap2/index": { + "mosdepth": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", "installed_by": ["modules"] @@ -44,6 +44,11 @@ "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", "installed_by": ["modules"] + }, + "severus": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/severus/environment.yml b/modules/nf-core/severus/environment.yml new file mode 100644 index 00000000..6081c124 --- /dev/null +++ b/modules/nf-core/severus/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::severus=1.3 diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf new file mode 100644 index 00000000..171fcb84 --- /dev/null +++ b/modules/nf-core/severus/main.nf @@ -0,0 +1,89 @@ +process SEVERUS { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/severus:1.3--pyhdfd78af_0': + 'biocontainers/severus:1.3--pyhdfd78af_0' }" + + input: + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) + tuple val(meta2), path(bed) + + output: + tuple val(meta), path("${prefix}/severus.log") , emit: log + tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual + tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def control = control_input ? "--control-bam ${control_input}" : "" + def vntr_bed = bed ? "--vntr-bed ${bed}" : "" + def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" + """ + severus \\ + $args \\ + --threads $task.cpus \\ + --target-bam $target_input \\ + $vntr_bed \\ + $control \\ + $phasing_vcf \\ + --out-dir ${prefix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + severus: \$(severus --version) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + """ + mkdir -p ${prefix}/all_SVs/plots + mkdir -p ${prefix}/somatic_SVs/plots + + touch ${prefix}/severus_collaped_dup.bed + touch ${prefix}/severus.log + touch ${prefix}/severus_LOH.bed + touch ${prefix}/read_alignments + touch ${prefix}/read_ids.csv + touch ${prefix}/read_qual.txt + touch ${prefix}/breakpoints_double.csv + touch ${prefix}/all_SVs/severus_all.vcf + touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/all_SVs/breakpoints_clusters.tsv + touch ${prefix}/all_SVs/plots/severus_0.html + touch ${prefix}/all_SVs/plots/severus_1.html + touch ${prefix}/somatic_SVs/severus_somatic.vcf + touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv + touch ${prefix}/somatic_SVs/plots/severus_0.html + touch ${prefix}/somatic_SVs/plots/severus_1.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + severus: \$(severus --version) + END_VERSIONS + """ +} diff --git a/modules/nf-core/severus/meta.yml b/modules/nf-core/severus/meta.yml new file mode 100644 index 00000000..8ada3548 --- /dev/null +++ b/modules/nf-core/severus/meta.yml @@ -0,0 +1,217 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "severus" +description: Severus is a somatic structural variation (SV) caller for long reads + (both PacBio and ONT) +keywords: + - structural + - variation + - somatic + - germline + - long-read +tools: + - "severus": + description: "A tool for somatic structural variant calling using long reads" + homepage: "https://github.com/KolmogorovLab/Severus" + documentation: "https://github.com/KolmogorovLab/Severus" + tool_dev_url: "https://github.com/KolmogorovLab/Severus" + doi: "10.1101/2024.03.22.24304756" + licence: ["BSD-3-clause"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - target_input: + type: file + description: path to one or multiple target BAM/CRAM files (e.g. tumor, must + be indexed) + pattern: "*.{bam,cram}" + - target_index: + type: file + description: path to one or multiple target BAM/CRAM index files + pattern: "*.{bai,crai,csi}" + - control_input: + type: file + description: path to the control BAM/CRAM file (e.g. normal, must be indexed) + pattern: "*.{bam,cram}" + - control_index: + type: file + description: path to the control BAM/CRAM file index + pattern: "*.{bai,crai,csi}" + - vcf: + type: file + description: path to vcf file used for phasing (if using haplotype specific + SV calling + pattern: "*.{vcf,vcf.gz}" + - - meta2: + type: map + description: | + Groovy Map containing tandem repeat regions information + e.g. `[ id:'hg38']` + - bed: + type: file + description: path to bed file for tandem repeat regions (must be ordered) + pattern: "*.bed" +output: + - log: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus.log: + type: file + description: Severus log file + pattern: "${prefix}/severus.log" + - read_qual: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_qual.txt: + type: file + description: Severus read_qual file + pattern: "${prefix}/read_qual.txt" + - breakpoints_double: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/breakpoints_double.csv: + type: file + description: Severus breakpoints_double file + pattern: "${prefix}/breakpoints_double.csv" + - read_alignments: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_alignments: + type: file + description: read alignments file + pattern: "${prefix}/read_alignments" + - read_ids: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/read_ids.csv: + type: file + description: read IDs for support reads + pattern: "${prefix}/read_ids" + - collapsed_dup: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus_collaped_dup.bed: + type: file + description: a bed file with identified collapsed duplication regions + pattern: "${prefix}/severus_collaped_dup" + - loh: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/severus_LOH.bed: + type: file + description: a bed file with predicted LOH regions + pattern: "${prefix}/severus_LOH.bed" + - all_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/severus_all.vcf: + type: file + description: VCF file with all SVs (somatic + germline) + pattern: "${prefix}/all_SVs/severus_all.vcf" + - all_breakpoints_clusters_list: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/breakpoints_clusters_list.tsv: + type: file + description: Severus breakpoints clusters list file + pattern: "${prefix}/all_SVs/breakpoints_clusters_list.tsv" + - all_breakpoints_clusters: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/breakpoints_clusters.tsv: + type: file + description: Severus breakpoints clusters file + pattern: "${prefix}/all_SVs/breakpoints_clusters.tsv" + - all_plots: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/all_SVs/plots/severus_*.html: + type: file + description: Severus plots + pattern: "${prefix}/all_SVs/plots/*.html" + - somatic_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/severus_all.vcf: + type: file + description: VCF file with somatic SVs + pattern: "${prefix}/somatic_SVs/severus_all.vcf" + - somatic_breakpoints_clusters_list: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv: + type: file + description: Severus somatic breakpoints clusters list file + pattern: "${prefix}/somatic_SVs/breakpoints_clusters_list.tsv" + - somatic_breakpoints_clusters: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/breakpoints_clusters.tsv: + type: file + description: Severus somatic breakpoints clusters file + pattern: "${prefix}/somatic_SVs/breakpoints_clusters.tsv" + - somatic_plots: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}/somatic_SVs/plots/severus_*.html: + type: file + description: Severus somatic plots + pattern: "${prefix}/somatic_SVs/plots/*.html" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/severus/tests/main.nf.test b/modules/nf-core/severus/tests/main.nf.test new file mode 100644 index 00000000..2ec25e89 --- /dev/null +++ b/modules/nf-core/severus/tests/main.nf.test @@ -0,0 +1,208 @@ +nextflow_process { + + name "Test Process SEVERUS" + script "../main.nf" + process "SEVERUS" + + tag "modules" + tag "modules_nfcore" + tag "severus" + + test("homo_sapiens - [ bam, bai, [], [], [] ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + [], + [], + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + //path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, - lint fails because of emtpy md5sum + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, [] ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, vcf ], [[],[]]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf', checkIfExists: true), + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]") { + + config "./nextflow.config" + + when { + process { + + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf', checkIfExists: true), + ] + input[1] = [ + [ id:'bed'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.blacklist_intervals.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.log.get(0).get(1)).readLines().last().contains("Writing VCF"), + process.out.read_qual, + process.out.breakpoints_double, + path(process.out.all_vcf.get(0).get(1)).vcf.summary, + path(process.out.all_vcf.get(0).get(1)).vcf.variantsMD5, + process.out.all_breakpoints_clusters_list, + process.out.all_breakpoints_clusters, + process.out.somatic_vcf, + process.out.somatic_breakpoints_clusters_list, + process.out.somatic_breakpoints_clusters, + process.out.versions + ).match() } + ) + } + + } + + test("homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true), + [], + [], + [] + ] + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/severus/tests/main.nf.test.snap b/modules/nf-core/severus/tests/main.nf.test.snap new file mode 100644 index 00000000..28754a33 --- /dev/null +++ b/modules/nf-core/severus/tests/main.nf.test.snap @@ -0,0 +1,435 @@ +{ + "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d0428d5dc149f2b40e46e480809d7417" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,a0fdb9d522587e7b088b3a61fce99843" + ] + ], + "VcfFile [chromosomes=[], sampleCount=1, variantCount=0, phased=true, phasedAutodetect=true]", + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:18:01.020231375" + }, + "homo_sapiens - [ bam, bai, bam, bai, vcf ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:13.354543848" + }, + "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "severus.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "11": [ + + ], + "12": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "15": [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ], + "2": [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "read_alignments:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test" + }, + "read_ids.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test" + }, + "severus_collaped_dup.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test" + }, + "severus_LOH.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test" + }, + "severus_all.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_breakpoints_clusters": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_breakpoints_clusters_list": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "all_plots": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "all_vcf": [ + [ + { + "id": "test" + }, + "severus_all.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "breakpoints_double": [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "collapsed_dup": [ + [ + { + "id": "test" + }, + "severus_collaped_dup.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "severus.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "loh": [ + [ + { + "id": "test" + }, + "severus_LOH.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_alignments": [ + [ + { + "id": "test" + }, + "read_alignments:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_ids": [ + [ + { + "id": "test" + }, + "read_ids.csv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "read_qual": [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_breakpoints_clusters": [ + [ + { + "id": "test" + }, + "breakpoints_clusters.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_breakpoints_clusters_list": [ + [ + { + "id": "test" + }, + "breakpoints_clusters_list.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "somatic_plots": [ + [ + { + "id": "test" + }, + [ + "severus_0.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "severus_1.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "somatic_vcf": [ + + ], + "versions": [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:03:53.176564181" + }, + "homo_sapiens - [ bam, bai, bam, bai, [] ], [[],[]]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,e2b55013bcb77a0b738cdba485520f68" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:01.967892199" + }, + "homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]": { + "content": [ + false, + [ + [ + { + "id": "test" + }, + "read_qual.txt:md5,8ef1a36618e7f2cad39c79c9aed3cd64" + ] + ], + [ + [ + { + "id": "test" + }, + "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + ] + ], + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", + "7f6a6ca528a33bf3d41520971bcd00bb", + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-22T16:11:25.517633729" + } +} \ No newline at end of file diff --git a/modules/nf-core/severus/tests/nextflow.config b/modules/nf-core/severus/tests/nextflow.config new file mode 100644 index 00000000..1dae7a59 --- /dev/null +++ b/modules/nf-core/severus/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'SEVERUS' { + ext.args = '--min-sv-size 1 --min-mapq 0 --min-support 1 --TIN-ratio 1 --low-quality' + } +} diff --git a/modules/nf-core/severus/tests/tags.yml b/modules/nf-core/severus/tests/tags.yml new file mode 100644 index 00000000..d7e36658 --- /dev/null +++ b/modules/nf-core/severus/tests/tags.yml @@ -0,0 +1,2 @@ +severus: + - "modules/nf-core/severus/**" From e629ea83c64dc27ecf4f0d124faa120f81b8b286 Mon Sep 17 00:00:00 2001 From: MariosEft97 Date: Tue, 4 Feb 2025 17:03:06 +0100 Subject: [PATCH 022/557] fibertools-rs qc, predict-m6a and fire modules --- conf/modules.config | 27 ++++++ .../local/fibertoolsrs/fire/environment.yml | 7 ++ modules/local/fibertoolsrs/fire/main.nf | 90 +++++++++++++++++++ modules/local/fibertoolsrs/fire/meta.yml | 69 ++++++++++++++ .../fibertoolsrs/fire/tests/main.nf.test | 74 +++++++++++++++ .../fibertoolsrs/predictm6a/environment.yml | 7 ++ modules/local/fibertoolsrs/predictm6a/main.nf | 90 +++++++++++++++++++ .../local/fibertoolsrs/predictm6a/meta.yml | 69 ++++++++++++++ .../predictm6a/tests/main.nf.test | 74 +++++++++++++++ modules/local/fibertoolsrs/qc/environment.yml | 7 ++ modules/local/fibertoolsrs/qc/main.nf | 90 +++++++++++++++++++ modules/local/fibertoolsrs/qc/meta.yml | 69 ++++++++++++++ .../local/fibertoolsrs/qc/tests/main.nf.test | 74 +++++++++++++++ 13 files changed, 747 insertions(+) create mode 100644 modules/local/fibertoolsrs/fire/environment.yml create mode 100644 modules/local/fibertoolsrs/fire/main.nf create mode 100644 modules/local/fibertoolsrs/fire/meta.yml create mode 100644 modules/local/fibertoolsrs/fire/tests/main.nf.test create mode 100644 modules/local/fibertoolsrs/predictm6a/environment.yml create mode 100644 modules/local/fibertoolsrs/predictm6a/main.nf create mode 100644 modules/local/fibertoolsrs/predictm6a/meta.yml create mode 100644 modules/local/fibertoolsrs/predictm6a/tests/main.nf.test create mode 100644 modules/local/fibertoolsrs/qc/environment.yml create mode 100644 modules/local/fibertoolsrs/qc/main.nf create mode 100644 modules/local/fibertoolsrs/qc/meta.yml create mode 100644 modules/local/fibertoolsrs/qc/tests/main.nf.test diff --git a/conf/modules.config b/conf/modules.config index f0b0d55a..92835baf 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -27,4 +27,31 @@ process { ] } + withName: 'FIBERTOOLSRS_QC' { + ext.args = { params.autocorrelation ? "--acf" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/qc" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'FIBERTOOLSRS_PREDICTM6A' { + ext.args = { params.keep_kinetic_data ? "--keep" : '', params.keep_all_calls ? "--all-calls" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/predictm6a" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'FIBERTOOLSRS_FIRE' { + ext.args = { params.ont_data ? "--ont" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/fire" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } diff --git a/modules/local/fibertoolsrs/fire/environment.yml b/modules/local/fibertoolsrs/fire/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/fire/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf new file mode 100644 index 00000000..6733806c --- /dev/null +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -0,0 +1,90 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_FIRE { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + fire \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/fire/meta.yml b/modules/local/fibertoolsrs/fire/meta.yml new file mode 100644 index 00000000..a754c57b --- /dev/null +++ b/modules/local/fibertoolsrs/fire/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_fire" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ['MIT'] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/fire/tests/main.nf.test b/modules/local/fibertoolsrs/fire/tests/main.nf.test new file mode 100644 index 00000000..280ad8ce --- /dev/null +++ b/modules/local/fibertoolsrs/fire/tests/main.nf.test @@ -0,0 +1,74 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test fibertoolsrs/fire +nextflow_process { + + name "Test Process FIBERTOOLSRS_FIRE" + script "../main.nf" + process "FIBERTOOLSRS_FIRE" + + tag "modules" + tag "modules_" + tag "fibertoolsrs" + tag "fibertoolsrs/fire" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/modules/local/fibertoolsrs/predictm6a/environment.yml b/modules/local/fibertoolsrs/predictm6a/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf new file mode 100644 index 00000000..c58147d8 --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -0,0 +1,90 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_PREDICTM6A { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + predict-m6a \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/predictm6a/meta.yml b/modules/local/fibertoolsrs/predictm6a/meta.yml new file mode 100644 index 00000000..55ea7cca --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_predictm6a" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ['MIT'] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test b/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test new file mode 100644 index 00000000..0131559d --- /dev/null +++ b/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test @@ -0,0 +1,74 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test fibertoolsrs/predictm6a +nextflow_process { + + name "Test Process FIBERTOOLSRS_PREDICTM6A" + script "../main.nf" + process "FIBERTOOLSRS_PREDICTM6A" + + tag "modules" + tag "modules_" + tag "fibertoolsrs" + tag "fibertoolsrs/predictm6a" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/modules/local/fibertoolsrs/qc/environment.yml b/modules/local/fibertoolsrs/qc/environment.yml new file mode 100644 index 00000000..16e726f7 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fibertools-rs=0.6.2" diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf new file mode 100644 index 00000000..92367413 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -0,0 +1,90 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_QC { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + qc \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/qc/meta.yml b/modules/local/fibertoolsrs/qc/meta.yml new file mode 100644 index 00000000..c38e9b66 --- /dev/null +++ b/modules/local/fibertoolsrs/qc/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolsrs_qc" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolsrs": + ## TODO nf-core: Add a description and other details for the software below + description: "Mitchell Vollger's rust tools for fiberseq data." + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "" + licence: ['MIT'] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@MariosEft97" +maintainers: + - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/qc/tests/main.nf.test b/modules/local/fibertoolsrs/qc/tests/main.nf.test new file mode 100644 index 00000000..a63ba4ee --- /dev/null +++ b/modules/local/fibertoolsrs/qc/tests/main.nf.test @@ -0,0 +1,74 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test fibertoolsrs/qc +nextflow_process { + + name "Test Process FIBERTOOLSRS_QC" + script "../main.nf" + process "FIBERTOOLSRS_QC" + + tag "modules" + tag "modules_" + tag "fibertoolsrs" + tag "fibertoolsrs/qc" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} From c465926e2d7d0f2bad0d09c0b63e2ffe95e7c4aa Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 17:10:49 +0100 Subject: [PATCH 023/557] update module config and output md --- conf/modules.config | 9 +++++++++ docs/output.md | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 0307358c..f5d29871 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -77,6 +77,15 @@ process { ] } + withName: '*SEVERUS' { + ext.args = { '' } + publishDir = [ + path: { "${params.outdir}/severus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + diff --git a/docs/output.md b/docs/output.md index d3222a79..595120fe 100644 --- a/docs/output.md +++ b/docs/output.md @@ -16,6 +16,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files - [Modkit](#modkit) - Tool to process methylation data - [Mosdepth](#mosdepth) - Tool to check the sequencing depth +- [Severus](#severus) - Tool to call somatic and germline structural variants - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### MultiQC @@ -76,6 +77,22 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ [Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . +### Severus +
+Output files + +- `severus` + - `` + +
+ +[Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . + + + + + + From 61fcfcad328e9e18ca1fd4259299849a734aae49 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 17:17:00 +0100 Subject: [PATCH 024/557] add text output md --- docs/output.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 595120fe..ca1532f1 100644 --- a/docs/output.md +++ b/docs/output.md @@ -82,7 +82,9 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ Output files - `severus` - - `` + - `severus.log`: severus log file + - `read_qual.txt`: the read quality + - `breakpoints_double.csv`: the breakpoint file From 1d7b7473e6820d3f457b94a77a6245c199e8a599 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 4 Feb 2025 17:22:25 +0100 Subject: [PATCH 025/557] Adds ClairSTO module skeleton adds basic code for running clairSTO --- modules/local/clairsto/environment.yml | 7 ++ modules/local/clairsto/main.nf | 125 ++++++++++++++++++++++ modules/local/clairsto/meta.yml | 69 ++++++++++++ modules/local/clairsto/tests/main.nf.test | 45 ++++++++ 4 files changed, 246 insertions(+) create mode 100644 modules/local/clairsto/environment.yml create mode 100644 modules/local/clairsto/main.nf create mode 100644 modules/local/clairsto/meta.yml create mode 100644 modules/local/clairsto/tests/main.nf.test diff --git a/modules/local/clairsto/environment.yml b/modules/local/clairsto/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/clairsto/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf new file mode 100644 index 00000000..1696a6d2 --- /dev/null +++ b/modules/local/clairsto/main.nf @@ -0,0 +1,125 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process CLAIRSTO { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker://hkubal/clairs-to:v0.3.1': + 'hkubal/clairs-to:v0.3.1' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(tumour_bam) + path(ref) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*_somatic.vcf.gz"), emit: somatic_vcf + tuple val(meta), path("*_germline.vcf.gz"), emit: germline_vcf + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + // TODO : change to reflect the meta data information from Laurens + def platform = task.ext.platform ?: 'ont' + def output_dir = "${meta.id}_clairs_output" + + def SNV_VCF="${output_dir}/snv.vcf" + def INDEL_VCF="${output_dir}/indel.vcf" + def SOMATIC_VCF="${output_dir}/somatic.vcf" + def NONSOMATIC_VCF="${output_dir}/germline.vcf" + + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + /opt/bin/run_clairs_to \ + --tumor_bam_fn \ + --ref_fn ${ref} \ + --threads ${task.cpus} \ + --platform ${platform} \ + --output_dir ${output_dir} \ + --use_heterozygous_snp_in_normal_sample_and_normal_bam_for_intermediate_phasing True \ + --remove_intermediate_dir \ + --use_longphase_for_intermediate_phasing True \ + --use_longphase_for_intermediate_haplotagging True \ + --conda_prefix /opt/micromamba/envs/clairs-to + + # Extract header from snv.vcf (lines starting with '##' or the first line starting with '#') + awk '/^##/ {print} /^#CHROM/ {print; exit}' "$SNV_VCF" > header.vcf + + # Extract data (excluding headers) from both files + awk '!/^#/' "$SNV_VCF" > snv_data.tmp + awk '!/^#/' "$INDEL_VCF" > indel_data.tmp + + # Combine data + cat snv_data.tmp indel_data.tmp > combined_data.tmp + + # Split into somatic and non-somatic files based on 7th column containing "NonSomatic" + awk '$7 ~ /NonSomatic/' combined_data.tmp > nonsomatic_data.tmp + awk '$7 !~ /NonSomatic/' combined_data.tmp > somatic_data.tmp + + # Add header to output files + cat header.vcf nonsomatic_data.tmp > "$NONSOMATIC_VCF" + cat header.vcf somatic_data.tmp > "$SOMATIC_VCF" + + # Cleanup temporary files + rm header.vcf snv_data.tmp indel_data.tmp combined_data.tmp nonsomatic_data.tmp somatic_data.tmp + + # Zip the resulting files + gzip $NONSOMATIC_VCF $SOMATIC_VCF + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(/opt/bin/run_clairs --version | sed 's/ClairS version: //') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def output_dir = "${prefix}_clairs_output" + """ + mkdir -p ${output_dir} + touch ${output_dir}/output.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(/opt/bin/run_clairs --version | sed 's/ClairS version: //') + END_VERSIONS + """ +} diff --git a/modules/local/clairsto/meta.yml b/modules/local/clairsto/meta.yml new file mode 100644 index 00000000..462dde3b --- /dev/null +++ b/modules/local/clairsto/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clairsto" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "clairsto": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/clairsto/tests/main.nf.test b/modules/local/clairsto/tests/main.nf.test new file mode 100644 index 00000000..0b18e45d --- /dev/null +++ b/modules/local/clairsto/tests/main.nf.test @@ -0,0 +1,45 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test clairsto +nextflow_process { + + name "Test Process CLAIRSTO" + script "../main.nf" + process "CLAIRSTO" + + tag "modules" + tag "modules_" + tag "clairsto" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam), + file(/staging/leuven/stg_00096/references/GRCh38.alt-masked-V2-noALT/fasta/Homo_sapiens_assembly38_masked_noALT.fasta) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + From 2c1c66eefd2427bf1b0cb32eae0e09d90921f1f5 Mon Sep 17 00:00:00 2001 From: vsc36671 Date: Tue, 4 Feb 2025 17:25:57 +0100 Subject: [PATCH 026/557] Samplesheet fix --- conf/test.config | 2 +- .../utils_nfcore_lr_somatic_pipeline/main.nf | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/conf/test.config b/conf/test.config index 90d1e401..45b89ec2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,7 +26,7 @@ params { // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - input = '/staging/leuven/stg_00096/home/laulambr/hackaton_250204/lr_somatic/assets/samplesheet.csv' + input = '/staging/leuven/stg_00096/home/hackathon/samplesheet_test.csv' // Genome references genome = 'R64-1-1' } diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 09fc69e9..d3fd23b8 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -75,23 +75,28 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { - meta, bam_tumor, bam_normal -> + meta, bam_tumor, bam_normal, method, specs -> if (!bam_normal) { - return [ meta.id, meta + [ paired_data:false ], [ bam_tumor ] ] + return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ] ] } else { - return [ meta.id, meta + [ paired_data:true ], [ bam_tumor, bam_normal ] ] + return [ meta + [ paired_data:true, method:method, specs:specs ], [ bam_tumor ], [ bam_normal ] ] } } .groupTuple() + /* .map { samplesheet -> validateInputSamplesheet(samplesheet) } + */ .map { - meta, bams -> - return [ meta, bams.flatten() ] + meta, bam_tumor, bam_normal -> + // Flatten the nested lists + bam_tumor = bam_tumor.flatten() + bam_normal = bam_normal.flatten() + return [ meta, bam_tumor, bam_normal ] } + .view() .set { ch_samplesheet } - emit: samplesheet = ch_samplesheet versions = ch_versions @@ -161,7 +166,7 @@ def validateInputParameters() { // Validate channels from input samplesheet // def validateInputSamplesheet(input) { - def (metas, fastqs) = input[1..2] + def (metas, bams) = input[1..2] // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end def endedness_ok = metas.collect{ meta -> meta.single_end }.unique().size == 1 @@ -169,7 +174,7 @@ def validateInputSamplesheet(input) { error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") } - return [ metas[0], fastqs ] + return [ metas[0], bams ] } // // Get attribute from genome config file e.g. fasta From f467578c467a99ae2a50bb7ad62290fe02586d54 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 5 Feb 2025 10:17:36 +0100 Subject: [PATCH 027/557] Adds ClairS-TO output to ouput.md --- docs/output.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index fc35fed4..1045701d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -13,6 +13,7 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### MultiQC @@ -29,7 +30,27 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +### ClairS-TO + +
+Output files + +- `clairsto/` + - `germline.vcf.gz`: a VCF file containing germline SNP and indel calls + - `somatic.vcf.gz`: a VCF file containing somatic SNP and indel calls + - `logs`: directory containing log files for the ClairS-TO run + - `run_clairs_to.log`: a text file containing a summary of the ClairS-TO run + - `run_clairs_to.log.bak`: a text file containing the run command + +
+ +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see + +### Pipeline information
Output files From b3195898e8ceaafa32760341d4f70a4be5164bb9 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 5 Feb 2025 10:20:48 +0100 Subject: [PATCH 028/557] changes CHANGELOG do not contact alanis morrisette --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee035dca..d324b6d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` - +- ClairS-TO Module ### `Fixed` ### `Dependencies` From fac21febe445a2b67fd0acc78f60800e81d15171 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 5 Feb 2025 10:27:05 +0100 Subject: [PATCH 029/557] adds quick zipping fix forgot that the intial vcf files produced by clairsto are zipped --- modules/local/clairsto/main.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 1696a6d2..f2fe4457 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -52,7 +52,8 @@ process CLAIRSTO { // TODO : change to reflect the meta data information from Laurens def platform = task.ext.platform ?: 'ont' def output_dir = "${meta.id}_clairs_output" - + def SNV_VCFGZ="${output_dir}/snv.vcf.gz" + def INDEL_VCFGZ="${output_dir}/indel.vcf.gz" def SNV_VCF="${output_dir}/snv.vcf" def INDEL_VCF="${output_dir}/indel.vcf" def SOMATIC_VCF="${output_dir}/somatic.vcf" @@ -80,6 +81,9 @@ process CLAIRSTO { --use_longphase_for_intermediate_haplotagging True \ --conda_prefix /opt/micromamba/envs/clairs-to + # Unzip ;) + gunzip $SNV_VCFGZ $INDEL_VCFGZ + # Extract header from snv.vcf (lines starting with '##' or the first line starting with '#') awk '/^##/ {print} /^#CHROM/ {print; exit}' "$SNV_VCF" > header.vcf From b051c46a3c8070f742e8ecaf00bae2e03eed6b33 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:32:43 +0100 Subject: [PATCH 030/557] initial addition of minimap2 subworkflow --- subworkflows/local/prepare_reference_files.nf | 2 +- subworkflows/local/run_minimap2.nf | 37 +++++++++++++++++++ workflows/lr_somatic.nf | 4 +- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 subworkflows/local/run_minimap2.nf diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index c43775c1..05b4d6b9 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -1,5 +1,5 @@ // -// Creates gtfs to that add introns as features +// Prepare reference files (unzipping and adding index) // include { PIGZ_UNCOMPRESS as UNZIP_FASTA } from '../../modules/nf-core/pigz/uncompress/main' diff --git a/subworkflows/local/run_minimap2.nf b/subworkflows/local/run_minimap2.nf new file mode 100644 index 00000000..3e4fddb6 --- /dev/null +++ b/subworkflows/local/run_minimap2.nf @@ -0,0 +1,37 @@ +// +// Run minimap2 on tumour (and normal) ubams +// + +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_TUMOUR } from '../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_NORMAL } from '../modules/nf-core/minimap2/align/main' + +workflow RUN_MINIMAP2 { + take: + ch_cat_ubams + + main: + ch_versions = Channel.empty() + + // Check if sample is paired or not + if ch_cat_ubams.meta.paired { + ubam_normal = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, normal_bam ] } + ubam_tumor = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, tumor_bam ] } + + + MINIMAP2_ALIGN_TUMOUR( ubam_normal ) + .reads + .set { ch_align_tumour } + + MINIMAP2_ALIGN_NORMAL( ubam_tumor ) + .reads + .set { ch_align_normal } + + // Remake channel + ch_aligned = ch_align_tumour.merge( ch_align_normal ) + //TODO: check if this works + } else { + MINIMAP2_ALIGN_TUMOUR( ch_cat_ubams ) + .reads + .set { ch_aligned } + } +} \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index eeb91ee5..5dcfccf0 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -12,7 +12,6 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s include { SAMTOOLS_CAT as SAMTOOLS_CAT_TUMOUR } from '../modules/nf-core/samtools/cat/main' include { SAMTOOLS_CAT as SAMTOOLS_CAT_NORMAL } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -44,6 +43,9 @@ workflow LR_SOMATIC { // TODO: Split workflow here in paired/tumour-only? + // + // SUBWORKFLOW: + // // MODULE: Combine bam files from the same sample (TUMOUR ubams) // From 1c5b114b9772ef03ffeef8ea98187996dfa6a38f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:33:30 +0100 Subject: [PATCH 031/557] fixed asterix in modules.config --- conf/modules.config | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0307358c..1598f51c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,7 +18,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: '*MULTIQC' { + withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, @@ -27,7 +27,7 @@ process { ] } - withName: '*MINIMAP_ALIGN' { + withName: '.*:MINIMAP_ALIGN' { ext.args = { [ { "-ax map-ont" }, @@ -41,7 +41,7 @@ process { } - withName: '*CRAMINO_PRE' { + withName: '.*:CRAMINO_PRE' { ext.args = { '--ubam' } publishDir = [ path: { "${params.outdir}/cramino_ubam" }, @@ -50,7 +50,7 @@ process { ] } - withName: '*CRAMINO_POST' { + withName: '.*:CRAMINO_POST' { ext.args = { '' } publishDir = [ path: { "${params.outdir}/cramino_aln" }, @@ -59,7 +59,7 @@ process { ] } - withName: '*MODKIT_PILEUP' { + withName: '.*:MODKIT_PILEUP' { ext.args = { '' } publishDir = [ path: { "${params.outdir}/modkit_pileup" }, @@ -68,7 +68,7 @@ process { ] } - withName: '*MOSDEPTH' { + withName: '.*:MOSDEPTH' { ext.args = { '' } publishDir = [ path: { "${params.outdir}/mosdepth" }, From 7876cc493656d25b41db2ae8bb50f6a666dc1c20 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Wed, 5 Feb 2025 10:40:26 +0100 Subject: [PATCH 032/557] get rid of empty args --- conf/modules.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index f5d29871..9e684b6e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -78,7 +78,6 @@ process { } withName: '*SEVERUS' { - ext.args = { '' } publishDir = [ path: { "${params.outdir}/severus" }, mode: params.publish_dir_mode, From a20f4fccf93cd6e7c2a41383f20fcd02a7b2cc63 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 5 Feb 2025 10:44:03 +0100 Subject: [PATCH 033/557] Adds revio/ONT to modules.config for ClairSTO --- conf/modules.config | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0307358c..ecfd1ca1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,7 +17,6 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: '*MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ @@ -77,7 +76,21 @@ process { ] } - - + withName: 'CLAIRSTO_revio' { + ext.args = { "--platform hifi_revio"} + publishDir = [ + path: { "${params.outdir}/multiqc" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'CLAIRSTO_ont' { + ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} + publishDir = [ + path: { "${params.outdir}/multiqc" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } From 17afad7aad7d195b88c8498e8e99cedfaf1bac51 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 5 Feb 2025 10:47:42 +0100 Subject: [PATCH 034/557] adds slashes --- modules/local/clairsto/main.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index f2fe4457..c2fda8da 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -69,16 +69,16 @@ process CLAIRSTO { // TODO nf-core: Please replace the example samtools command below with your module's command // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ - /opt/bin/run_clairs_to \ - --tumor_bam_fn \ - --ref_fn ${ref} \ - --threads ${task.cpus} \ - --platform ${platform} \ - --output_dir ${output_dir} \ - --use_heterozygous_snp_in_normal_sample_and_normal_bam_for_intermediate_phasing True \ - --remove_intermediate_dir \ - --use_longphase_for_intermediate_phasing True \ - --use_longphase_for_intermediate_haplotagging True \ + /opt/bin/run_clairs_to \\ + --tumor_bam_fn \\ + --ref_fn ${ref} \\ + --threads ${task.cpus} \\ + --platform ${platform} \\ + --output_dir ${output_dir} \\ + --use_heterozygous_snp_in_normal_sample_and_normal_bam_for_intermediate_phasing True \\ + --remove_intermediate_dir \\ + --use_longphase_for_intermediate_phasing True \\ + --use_longphase_for_intermediate_haplotagging True \\ --conda_prefix /opt/micromamba/envs/clairs-to # Unzip ;) From c9046d50d893cc83c83e8408fb3b79e9dd5844be Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:53:28 +0100 Subject: [PATCH 035/557] added chr19 reference genome fasta --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 45b89ec2..a5448dfa 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,5 +28,5 @@ params { //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' input = '/staging/leuven/stg_00096/home/hackathon/samplesheet_test.csv' // Genome references - genome = 'R64-1-1' + fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' } From e6568293483e0bd66bfa18cce530b96757a99f86 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Wed, 5 Feb 2025 12:00:03 +0100 Subject: [PATCH 036/557] add min support severus --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 9e684b6e..544bd809 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -78,6 +78,7 @@ process { } withName: '*SEVERUS' { + ext.args = '--min-support 3' publishDir = [ path: { "${params.outdir}/severus" }, mode: params.publish_dir_mode, From b634c8141465bf4220d48d128227839a601cc37c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:21:27 +0100 Subject: [PATCH 037/557] added empty [] for normal bams in samplesheet channel --- subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index d3fd23b8..60332d40 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -77,7 +77,7 @@ workflow PIPELINE_INITIALISATION { .map { meta, bam_tumor, bam_normal, method, specs -> if (!bam_normal) { - return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ] ] + return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ], [] ] } else { return [ meta + [ paired_data:true, method:method, specs:specs ], [ bam_tumor ], [ bam_normal ] ] } @@ -95,7 +95,6 @@ workflow PIPELINE_INITIALISATION { bam_normal = bam_normal.flatten() return [ meta, bam_tumor, bam_normal ] } - .view() .set { ch_samplesheet } emit: samplesheet = ch_samplesheet From 628f89c4e3822dd8b2d434fccc1e577bdb257e03 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:22:13 +0100 Subject: [PATCH 038/557] added minimap2 subworkflow --- subworkflows/local/run_minimap2_align.nf | 53 ++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 subworkflows/local/run_minimap2_align.nf diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf new file mode 100644 index 00000000..5655d0b2 --- /dev/null +++ b/subworkflows/local/run_minimap2_align.nf @@ -0,0 +1,53 @@ +// +// Run minimap2 on tumour (and normal) ubams +// + +include { MINIMAP2_ALIGN } from '../../modules/nf-core/minimap2/align/main' + +workflow RUN_MINIMAP2_ALIGN { + take: + ch_ubams // channel: val(meta), [ bam_tumor, bam_normal ] or val(meta), [ bam_tumor ] + ch_minimap_index + + + main: + ch_versions = Channel.empty() + ch_aligned = Channel.empty() // Initialize ch_aligned + + // Extract all bam files from the channel, keeping it linked to metadata + ch_ubams + .flatMap { meta, tumor_bam, normal_bam -> + def meta_tumor = meta.clone() + meta_tumor.type = 'tumor' + def result = [[meta_tumor, tumor_bam]] + + if (normal_bam) { + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam] + } + + return result + } + .view() + .set { ch_restructured_ubams } + // Run minimap2 align on each bam file + MINIMAP2_ALIGN ( + ch_restructured_ubams, + ch_minimap_index, + true, + 'bai', + "", + "" + ) + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + ch_aligned = MINIMAP2_ALIGN.out.bam + + // Restructure back to original format + + + emit: + aligned = ch_aligned + versions = ch_versions +} From 0b3ddb6a8a7e9cc7e3927e2ddd1d341a4a7f03fe Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:22:23 +0100 Subject: [PATCH 039/557] added minimap2 params --- nextflow.config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index bcf75c6f..b16dbead 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,13 +18,19 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false + // minimap2 options + minimap2_ont_model = null + minimap2_pb_model = null + save_secondary_alignment = true + + // MultiQC options multiqc_config = null multiqc_title = null multiqc_logo = null max_multiqc_email_size = '25.MB' multiqc_methods_description = null - + // Boilerplate options outdir = null publish_dir_mode = 'copy' From f39ece5881f61ac8f2ed9f338b8b9f56e00f606c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:22:43 +0100 Subject: [PATCH 040/557] added prepare genomes and minimap2 to workflow --- workflows/lr_somatic.nf | 50 +++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 5dcfccf0..114ad833 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -9,10 +9,21 @@ include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pi include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +// +// IMPORT MODULES +// + include { SAMTOOLS_CAT as SAMTOOLS_CAT_TUMOUR } from '../modules/nf-core/samtools/cat/main' include { SAMTOOLS_CAT as SAMTOOLS_CAT_NORMAL } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +// +// IMPORT SUBWORKFLOWS +// + +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -28,19 +39,7 @@ workflow LR_SOMATIC { ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - // - // SUBWORKFLOW: Read in samplesheet, validate and stage input files - // - ch_samplesheet - .branch{ - meta, tumour -> - single: tumour.size() == 1 - return [ meta, tumour.flatten(), normal.flatten() ] // TODO: this probably doesnt work - multiple: tumour.size() > 1 - return [ meta, tumour.flatten(), normal.flatten() ] - } - .set { ch_ubams } - + // TODO: Split workflow here in paired/tumour-only? // @@ -50,6 +49,7 @@ workflow LR_SOMATIC { // MODULE: Combine bam files from the same sample (TUMOUR ubams) // // TODO: Ensure it only takes tumour bam here + /* SAMTOOLS_CAT_TUMOUR ( ch_ubams.multiple ) .reads .mix ( ch_ubams.single ) @@ -74,7 +74,7 @@ workflow LR_SOMATIC { // MODULE: CRAMINO // CRAMINO_PRE ( ) - +*/ // // SUBWORKFLOW: PREPARE_REFERENCE_FILES @@ -90,10 +90,6 @@ workflow LR_SOMATIC { // // MODULE: Run MINIMAP2_INDEX // - - // Create minimap2 index channel - - if (!params.skip_save_minimap2_index) { MINIMAP2_INDEX ( ch_fasta ) @@ -103,19 +99,15 @@ workflow LR_SOMATIC { } // - // MODULE: Run MINIMAP2_ALIGN + // SUBWORKFLOW: RUN_MINIMAP2_ALIGN // - MINIMAP2_ALIGN ( - ch_cat_ubams, - ch_minimap_index, - true, - 'bai', - "", - "" + RUN_MINIMAP2_ALIGN ( + ch_samplesheet, + ch_minimap_index ) - ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) - MINIMAP2_ALIGN.out.bam + ch_versions = ch_versions.mix(RUN_MINIMAP2_ALIGN.out.versions) + RUN_MINIMAP2_ALIGN.out.aligned .set { ch_minimap_bam } @@ -124,7 +116,7 @@ workflow LR_SOMATIC { // MODULE: CRAMINO // - CRAMINO_POST ( ) + //CRAMINO_POST ( ) // // Collate and save software versions From 0ec349a83ac59bc1b7ac17b1547b04a066246f48 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:23:12 +0100 Subject: [PATCH 041/557] removed old subworkflow --- subworkflows/local/run_minimap2.nf | 37 ------------------------------ 1 file changed, 37 deletions(-) delete mode 100644 subworkflows/local/run_minimap2.nf diff --git a/subworkflows/local/run_minimap2.nf b/subworkflows/local/run_minimap2.nf deleted file mode 100644 index 3e4fddb6..00000000 --- a/subworkflows/local/run_minimap2.nf +++ /dev/null @@ -1,37 +0,0 @@ -// -// Run minimap2 on tumour (and normal) ubams -// - -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_TUMOUR } from '../modules/nf-core/minimap2/align/main' -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_NORMAL } from '../modules/nf-core/minimap2/align/main' - -workflow RUN_MINIMAP2 { - take: - ch_cat_ubams - - main: - ch_versions = Channel.empty() - - // Check if sample is paired or not - if ch_cat_ubams.meta.paired { - ubam_normal = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, normal_bam ] } - ubam_tumor = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, tumor_bam ] } - - - MINIMAP2_ALIGN_TUMOUR( ubam_normal ) - .reads - .set { ch_align_tumour } - - MINIMAP2_ALIGN_NORMAL( ubam_tumor ) - .reads - .set { ch_align_normal } - - // Remake channel - ch_aligned = ch_align_tumour.merge( ch_align_normal ) - //TODO: check if this works - } else { - MINIMAP2_ALIGN_TUMOUR( ch_cat_ubams ) - .reads - .set { ch_aligned } - } -} \ No newline at end of file From ef284032ef24090d3c34423e0c5f5416b0fb8571 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:23:39 +0100 Subject: [PATCH 042/557] added method specific minimap2 options --- conf/modules.config | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1598f51c..9caefe55 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -27,10 +27,23 @@ process { ] } - withName: '.*:MINIMAP_ALIGN' { + withName: '.*:MINIMAP2_ALIGN_PB' { ext.args = { [ - { "-ax map-ont" }, + { params.minimap2_pb_model ? params.minimap2_pb_model : "map-hifi" }, + params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " + ].join(' ').trim() + ext.args4 = '-T "*"' + } + publishDir = [ + enabled: false + ] + } + + withName: '.*:MINIMAP2_ALIGN_ONT' { + ext.args = { + [ + { params.minimap2_ont_model ? params.minimap2_ont_model : "map-ont" }, params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " ].join(' ').trim() ext.args4 = '-T "*"' @@ -38,7 +51,6 @@ process { publishDir = [ enabled: false ] - } withName: '.*:CRAMINO_PRE' { From 53e47a69076152e33ced8d4668e8ec3c059f0718 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:50:13 +0100 Subject: [PATCH 043/557] finalized minimap2 subworkflow --- subworkflows/local/run_minimap2_align.nf | 45 ++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 5655d0b2..252d0bf0 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -2,7 +2,8 @@ // Run minimap2 on tumour (and normal) ubams // -include { MINIMAP2_ALIGN } from '../../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_PB } from '../../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/minimap2/align/main' workflow RUN_MINIMAP2_ALIGN { take: @@ -29,11 +30,18 @@ workflow RUN_MINIMAP2_ALIGN { return result } - .view() .set { ch_restructured_ubams } - // Run minimap2 align on each bam file - MINIMAP2_ALIGN ( - ch_restructured_ubams, + + // Split the channel into pacbio and ont + ch_split = ch_restructured_ubams + .branch { meta, bam -> + ont: meta.method == 'ont' + pb: meta.method == 'pb' + } + + // Run minimap2 on PacBio samples + MINIMAP2_ALIGN_PB ( + ch_split.pb, ch_minimap_index, true, 'bai', @@ -41,12 +49,29 @@ workflow RUN_MINIMAP2_ALIGN { "" ) - ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) - ch_aligned = MINIMAP2_ALIGN.out.bam + ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) + ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam + + // Run minimap2 on ONT samples + MINIMAP2_ALIGN_ONT ( + ch_split.ont, + ch_minimap_index, + true, + 'bai', + "", + "" + ) + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) + ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam + + // Mix back in together + ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) + + // TODO: Restructure back to normal if needed + // ch_aligned is now [[meta], [bam]] + // With meta consisting of [id, paired_data, method, specs, type] - // Restructure back to original format - - emit: aligned = ch_aligned versions = ch_versions From 23c44fdcddd92d1a85308f1f17e2bb9f0e9e3477 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:50:26 +0100 Subject: [PATCH 044/557] fixed samplesheet channel generation --- subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 60332d40..693676ec 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -95,7 +95,8 @@ workflow PIPELINE_INITIALISATION { bam_normal = bam_normal.flatten() return [ meta, bam_tumor, bam_normal ] } - .set { ch_samplesheet } + .set { ch_samplesheet } + emit: samplesheet = ch_samplesheet versions = ch_versions From 0fcb769d6a23283670cdaf1287077a9e66923856 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:50:46 +0100 Subject: [PATCH 045/557] added minimap2 and indexing in workflow --- workflows/lr_somatic.nf | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 114ad833..26a51143 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -40,11 +40,6 @@ workflow LR_SOMATIC { ch_multiqc_files = Channel.empty() - // TODO: Split workflow here in paired/tumour-only? - - // - // SUBWORKFLOW: - // // MODULE: Combine bam files from the same sample (TUMOUR ubams) // @@ -69,12 +64,12 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix (SAMTOOLS_CAT_NORMAL.out.versions.first().ifEmpty(null)) - // TODO: Add pre-alignment QC step here + // TODO: Add pre-alignment QC step here, maybe add a subworkflow with all pre-alignment QC together // // MODULE: CRAMINO // CRAMINO_PRE ( ) -*/ + */ // // SUBWORKFLOW: PREPARE_REFERENCE_FILES @@ -108,10 +103,10 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(RUN_MINIMAP2_ALIGN.out.versions) RUN_MINIMAP2_ALIGN.out.aligned - .set { ch_minimap_bam } - + .set { ch_minimap_bam } + // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] - // TODO: Add post-alignment QC step here + // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together // // MODULE: CRAMINO // From 22c389948aa3999444bf22a2ee18cd3e4303d382 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:51:04 +0100 Subject: [PATCH 046/557] added changes to changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9296baa..07741a4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - cramino module - modkit pileup module - mosdepth module +- minimap2/index module +- minimap2/align module +- pigz module +- samtools/cat module +- samtools faidx module ### `Fixed` From 13f88feadd0e786bb9588ce6c4496307abda8575 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:51:29 +0100 Subject: [PATCH 047/557] added process-specific minimap2 parameters --- conf/modules.config | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9caefe55..21a358df 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -30,11 +30,11 @@ process { withName: '.*:MINIMAP2_ALIGN_PB' { ext.args = { [ - { params.minimap2_pb_model ? params.minimap2_pb_model : "map-hifi" }, + params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " ].join(' ').trim() - ext.args4 = '-T "*"' } + ext.args4 = "-T '*'" publishDir = [ enabled: false ] @@ -43,11 +43,11 @@ process { withName: '.*:MINIMAP2_ALIGN_ONT' { ext.args = { [ - { params.minimap2_ont_model ? params.minimap2_ont_model : "map-ont" }, + params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-ont", params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " ].join(' ').trim() - ext.args4 = '-T "*"' } + ext.args4 = "-T '*'" publishDir = [ enabled: false ] @@ -56,7 +56,7 @@ process { withName: '.*:CRAMINO_PRE' { ext.args = { '--ubam' } publishDir = [ - path: { "${params.outdir}/cramino_ubam" }, + path: { "${params.outdir}/qc/cramino_ubam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -65,7 +65,7 @@ process { withName: '.*:CRAMINO_POST' { ext.args = { '' } publishDir = [ - path: { "${params.outdir}/cramino_aln" }, + path: { "${params.outdir}/qc/cramino_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -74,7 +74,7 @@ process { withName: '.*:MODKIT_PILEUP' { ext.args = { '' } publishDir = [ - path: { "${params.outdir}/modkit_pileup" }, + path: { "${params.outdir}/qc/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -83,13 +83,9 @@ process { withName: '.*:MOSDEPTH' { ext.args = { '' } publishDir = [ - path: { "${params.outdir}/mosdepth" }, + path: { "${params.outdir}/qc/mosdepth" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - - - } From 20916331f8c919558a2604b5c0a5aa8012cfb38c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:51:50 +0100 Subject: [PATCH 048/557] changed test config and samplesheet for easier identification what is going on --- assets/samplesheet.csv | 6 +++--- conf/test.config | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index dc42d351..e6f6efd2 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,4 +1,4 @@ sample,bam_tumor,bam_normal,method,specs -sample1_pb_paired,/path/to/sample1_tumor.bam,/path/to/sample1_normal.bam,pb,NA -sample1_ont_paired,/path/to/sample2_tumor.bam,/path/to/sample2_normal.bam,ont,R9 -sample1_ont_tumoronly,/path/to/sample3_tumor.bam,,ont,R10 \ No newline at end of file +sample1,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,ont,R10 +sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,pb,NA +sample3,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,,ont,R10 diff --git a/conf/test.config b/conf/test.config index a5448dfa..96b95fcc 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,7 +26,7 @@ params { // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - input = '/staging/leuven/stg_00096/home/hackathon/samplesheet_test.csv' + input = '/staging/leuven/stg_00104/pipelines/IntGenomicsLab-lr_somatic/assets/samplesheet.csv' // Genome references fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' } From b115595e4c19bf2fdeaa5839d8e7b879519b94f1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 16:42:47 +0100 Subject: [PATCH 049/557] restructured output dirs --- conf/modules.config | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index bcbe4040..1187f796 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,7 +28,6 @@ process { } withName: '.*:MINIMAP2_ALIGN_PB' { - ext.args = { [ params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , @@ -75,7 +74,7 @@ process { withName: '.*:MODKIT_PILEUP' { ext.args = { '' } publishDir = [ - path: { "${params.outdir}/qc/modkit_pileup" }, + path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -84,10 +83,11 @@ process { withName: '.*:FIBERTOOLSRS_QC' { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ - path: { "${params.outdir}/fibertoolsrs/qc" }, + path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } withName: '.*:MOSDEPTH' { publishDir = [ @@ -100,23 +100,25 @@ process { withName: 'FIBERTOOLSRS_PREDICTM6A' { ext.args = { params.keep_kinetic_data ? "--keep" : '', params.keep_all_calls ? "--all-calls" : '' } publishDir = [ - path: { "${params.outdir}/fibertoolsrs/predictm6a" }, + path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ - path: { "${params.outdir}/severus" }, + path: { "${params.outdir}/variants/severus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ - path: { "${params.outdir}/clairsto" }, + path: { "${params.outdir}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -125,18 +127,18 @@ process { withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } publishDir = [ - path: { "${params.outdir}/fibertoolsrs/fire" }, + path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ - path: { "${params.outdir}/clairsto" }, + path: { "${params.outdir}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - } From 23f85706b2df25f2694b977d0fbc60505c8acc9d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 11:16:25 +0100 Subject: [PATCH 050/557] fixed predictm6a ext.args --- conf/modules.config | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1187f796..3b71c95b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -13,7 +13,7 @@ process { publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, // Added closing brace here mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -54,7 +54,7 @@ process { } withName: '.*:CRAMINO_PRE' { - ext.args = { '--ubam' } + ext.args = '--ubam' publishDir = [ path: { "${params.outdir}/qc/cramino_ubam" }, mode: params.publish_dir_mode, @@ -63,7 +63,6 @@ process { } withName: '.*:CRAMINO_POST' { - ext.args = { '' } publishDir = [ path: { "${params.outdir}/qc/cramino_aln" }, mode: params.publish_dir_mode, @@ -72,7 +71,6 @@ process { } withName: '.*:MODKIT_PILEUP' { - ext.args = { '' } publishDir = [ path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, @@ -98,7 +96,12 @@ process { } withName: 'FIBERTOOLSRS_PREDICTM6A' { - ext.args = { params.keep_kinetic_data ? "--keep" : '', params.keep_all_calls ? "--all-calls" : '' } + ext.args = { + [ + params.keep_kinetic_data ? "--keep" : '', + params.keep_all_calls ? "--all-calls" : '' + ].join(' ').trim() + } publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, From 06d7dd954c328162e5d220a471f85db85216837d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 11:17:40 +0100 Subject: [PATCH 051/557] added TODO --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 3b71c95b..3040a7cc 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -128,7 +128,7 @@ process { } withName: '.*:FIBERTOOLSRS_FIRE' { - ext.args = { params.ont_data ? "--ont" : '' } + ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, From bc7da21ddd88ee07f077d513db94cf9dd10d947d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 11:20:58 +0100 Subject: [PATCH 052/557] changed test samplesheet input to always take the one in the projectdir/assets/samplesheet.csv --- conf/test.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 96b95fcc..b9d44c91 100644 --- a/conf/test.config +++ b/conf/test.config @@ -26,7 +26,7 @@ params { // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - input = '/staging/leuven/stg_00104/pipelines/IntGenomicsLab-lr_somatic/assets/samplesheet.csv' + input ="$projectDir/assets/samplesheet.csv" // Genome references - fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' + fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" } From d0ef1a63d0b3787ba12948b5534965d4ce1f087b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:01:02 +0100 Subject: [PATCH 053/557] added extra "sample" with replicate to test catting input --- assets/samplesheet.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index e6f6efd2..ceecd0db 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -2,3 +2,4 @@ sample,bam_tumor,bam_normal,method,specs sample1,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,ont,R10 sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,pb,NA sample3,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,,ont,R10 +sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19_rep2.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19_rep2.bam,pb,NA From 66d1d59a0c16484af2cb48e8f0c10c492054602f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:01:52 +0100 Subject: [PATCH 054/557] slight change to fix new channel structure --- subworkflows/local/run_minimap2_align.nf | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 252d0bf0..404bb0d3 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -7,33 +7,16 @@ include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/min workflow RUN_MINIMAP2_ALIGN { take: - ch_ubams // channel: val(meta), [ bam_tumor, bam_normal ] or val(meta), [ bam_tumor ] + ch_ubams // channel: val(meta), [ bam ] ch_minimap_index main: ch_versions = Channel.empty() ch_aligned = Channel.empty() // Initialize ch_aligned - - // Extract all bam files from the channel, keeping it linked to metadata - ch_ubams - .flatMap { meta, tumor_bam, normal_bam -> - def meta_tumor = meta.clone() - meta_tumor.type = 'tumor' - def result = [[meta_tumor, tumor_bam]] - - if (normal_bam) { - def meta_normal = meta.clone() - meta_normal.type = 'normal' - result << [meta_normal, normal_bam] - } - - return result - } - .set { ch_restructured_ubams } // Split the channel into pacbio and ont - ch_split = ch_restructured_ubams + ch_split = ch_ubams .branch { meta, bam -> ont: meta.method == 'ont' pb: meta.method == 'pb' From 45df3fb0252969bfec0750ac16e1a1233583c6b3 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:02:03 +0100 Subject: [PATCH 055/557] changed channel structure --- .../utils_nfcore_lr_somatic_pipeline/main.nf | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 693676ec..65ead345 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,28 +74,31 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { - meta, bam_tumor, bam_normal, method, specs -> - if (!bam_normal) { - return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ], [] ] - } else { - return [ meta + [ paired_data:true, method:method, specs:specs ], [ bam_tumor ], [ bam_normal ] ] - } + .map { meta, bam_tumor, bam_normal, method, specs -> + def paired_data = bam_normal ? true : false + def meta_info = meta + [ paired_data: paired_data, method: method, specs: specs ] + return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .groupTuple() - /* - .map { samplesheet -> - validateInputSamplesheet(samplesheet) + .map { meta, bam_tumor, bam_normal -> + [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } - */ - .map { - meta, bam_tumor, bam_normal -> - // Flatten the nested lists - bam_tumor = bam_tumor.flatten() - bam_normal = bam_normal.flatten() - return [ meta, bam_tumor, bam_normal ] + .flatMap { meta, tumor_bam, normal_bam -> + def meta_tumor = meta.clone() + meta_tumor.type = 'tumor' + def result = [[meta_tumor, tumor_bam]] + + if (normal_bam) { + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam] + } + + return result } - .set { ch_samplesheet } + .set { ch_samplesheet } + // Channel is now [[meta], [bam]] + // With meta consisting of [id, paired_data, method, specs, type] emit: samplesheet = ch_samplesheet From e5a9de5b1e622d59af5dca64d9bda61d2a17d318 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:02:17 +0100 Subject: [PATCH 056/557] changes for channel structure and adding samtools cat --- workflows/lr_somatic.nf | 42 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 26a51143..472df3ca 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -13,9 +13,8 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s // IMPORT MODULES // -include { SAMTOOLS_CAT as SAMTOOLS_CAT_TUMOUR } from '../modules/nf-core/samtools/cat/main' -include { SAMTOOLS_CAT as SAMTOOLS_CAT_NORMAL } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' // // IMPORT SUBWORKFLOWS @@ -41,30 +40,25 @@ workflow LR_SOMATIC { // - // MODULE: Combine bam files from the same sample (TUMOUR ubams) + // MODULE: Combine bam files from the same sample // - // TODO: Ensure it only takes tumour bam here - /* - SAMTOOLS_CAT_TUMOUR ( ch_ubams.multiple ) - .reads - .mix ( ch_ubams.single ) - .set { ch_cat_ubams } - - ch_versions = ch_versions.mix (SAMTOOLS_CAT_TUMOUR.out.versions.first().ifEmpty(null)) - // - // MODULE: Combine bam files from the same sample (NORMAL ubams) - // - // TODO: Ensure it only takes normal bam here - SAMTOOLS_CAT_NORMAL ( ch_ubams.multiple ) - .reads - .mix ( ch_ubams.single ) + // Take channels where there are multiple bam files in the list + + ch_split = ch_samplesheet + .branch { meta, bam -> + single: bam.size() == 1 + multiple: bam.size() > 1 + } + + SAMTOOLS_CAT ( ch_split.multiple ) + .bam + .mix ( ch_split.single ) .set { ch_cat_ubams } - - - ch_versions = ch_versions.mix (SAMTOOLS_CAT_NORMAL.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions.first().ifEmpty(null)) - // TODO: Add pre-alignment QC step here, maybe add a subworkflow with all pre-alignment QC together + /* + // TODO: Add pre-alignment QC step here, maybe add a subworkflow with all pre-alignment QC together if there will be more than CRAMINO // // MODULE: CRAMINO // @@ -97,7 +91,7 @@ workflow LR_SOMATIC { // SUBWORKFLOW: RUN_MINIMAP2_ALIGN // RUN_MINIMAP2_ALIGN ( - ch_samplesheet, + ch_cat_ubams, ch_minimap_index ) From abdf55dea2a257b04ee54be1a01e2327f364c5ef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:03:13 +0100 Subject: [PATCH 057/557] added changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78dcfed1..f203198e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - samtools faidx module ### `Fixed` +- New channel structure ### `Dependencies` From 9387cf9419fe74da38257cf4622f82127fd41ef9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:03:59 +0100 Subject: [PATCH 058/557] added samtools cat --- workflows/lr_somatic.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 472df3ca..e8728770 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -58,7 +58,8 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions.first().ifEmpty(null)) /* - // TODO: Add pre-alignment QC step here, maybe add a subworkflow with all pre-alignment QC together if there will be more than CRAMINO + // TODO: Add pre-alignment QC step here + // Maybe add a subworkflow with all pre-alignment QC together if there will be more than CRAMINO // // MODULE: CRAMINO // From 09d0aea84b93fcb7a13a3f91a7b065e5456496fe Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:56:31 +0100 Subject: [PATCH 059/557] added channel structure information as comment --- workflows/lr_somatic.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index e8728770..aee860ff 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -33,6 +33,8 @@ workflow LR_SOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input + // Channel format is [[meta], [bam]]. + // Where [meta] is [id, paired_data, method, specs, type] main: ch_versions = Channel.empty() From 67e2bda56baf0ad30cb2162024f95ff9d933b802 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 13:07:49 +0100 Subject: [PATCH 060/557] added some missing info in output.md and readme.md --- README.md | 2 +- docs/output.md | 67 +++++++++++++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 3b4672ea..ada563d7 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ nextflow run IntGenomicsLab/lr_somatic \ ## Credits -IntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pančíková, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/docs/output.md b/docs/output.md index dae79fe9..ecb81487 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,44 +12,20 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -- [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples +- [samtools/cat](#samtools_cat) - Concatenate replicates from the same sample +- [minimap2/index](#minimap2) - Creating minimap2 index +- [minimap2/align](#minimap2) - Aligning long-read samples to the reference genome - [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files - [Modkit](#modkit) - Tool to process methylation data - [Mosdepth](#mosdepth) - Tool to check the sequencing depth +- [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples - [Severus](#severus) - Tool to call somatic and germline structural variants +- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### MultiQC - -
-Output files - -- `multiqc/` - - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. - -
- -[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. - -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . - - -### ClairS-TO - -
-Output files - -- `clairsto/` - - `germline.vcf.gz`: a VCF file containing germline SNP and indel calls - - `somatic.vcf.gz`: a VCF file containing somatic SNP and indel calls - - `logs`: directory containing log files for the ClairS-TO run - - `run_clairs_to.log`: a text file containing a summary of the ClairS-TO run - - `run_clairs_to.log.bak`: a text file containing the run command +### samtools -
+### Minimap2 ### Cramino
@@ -91,6 +67,20 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ [Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . +### ClairS-TO + +
+Output files + +- `clairsto/` + - `germline.vcf.gz`: a VCF file containing germline SNP and indel calls + - `somatic.vcf.gz`: a VCF file containing somatic SNP and indel calls + - `logs`: directory containing log files for the ClairS-TO run + - `run_clairs_to.log`: a text file containing a summary of the ClairS-TO run + - `run_clairs_to.log.bak`: a text file containing the run command + +
+ ### Severus
Output files @@ -104,6 +94,21 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ [Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . +### MultiQC + +
+Output files + +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats. + +
+ +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . ### Pipeline information From e557c8b2d4b0859c3c34ef63e802b75381739d24 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 13:10:54 +0100 Subject: [PATCH 061/557] added .* to predictm6a in modules.config --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 3040a7cc..f18c78d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -95,7 +95,7 @@ process { ] } - withName: 'FIBERTOOLSRS_PREDICTM6A' { + withName: '.*:FIBERTOOLSRS_PREDICTM6A' { ext.args = { [ params.keep_kinetic_data ? "--keep" : '', From 6b5434009394e91982a0b7eef518b5e84fbfc718 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Thu, 6 Feb 2025 17:02:02 +0100 Subject: [PATCH 062/557] install samtools stats idxstats and flagstat modules --- .../nf-core/samtools/flagstat/environment.yml | 8 + modules/nf-core/samtools/flagstat/main.nf | 45 ++++++ modules/nf-core/samtools/flagstat/meta.yml | 55 +++++++ .../samtools/flagstat/tests/main.nf.test | 56 +++++++ .../samtools/flagstat/tests/main.nf.test.snap | 72 +++++++++ .../nf-core/samtools/flagstat/tests/tags.yml | 2 + .../nf-core/samtools/idxstats/environment.yml | 8 + modules/nf-core/samtools/idxstats/main.nf | 47 ++++++ modules/nf-core/samtools/idxstats/meta.yml | 55 +++++++ .../samtools/idxstats/tests/main.nf.test | 53 +++++++ .../samtools/idxstats/tests/main.nf.test.snap | 72 +++++++++ .../nf-core/samtools/idxstats/tests/tags.yml | 2 + .../nf-core/samtools/stats/environment.yml | 8 + modules/nf-core/samtools/stats/main.nf | 48 ++++++ modules/nf-core/samtools/stats/meta.yml | 66 ++++++++ .../nf-core/samtools/stats/tests/main.nf.test | 113 ++++++++++++++ .../samtools/stats/tests/main.nf.test.snap | 142 ++++++++++++++++++ modules/nf-core/samtools/stats/tests/tags.yml | 2 + 18 files changed, 854 insertions(+) create mode 100644 modules/nf-core/samtools/flagstat/environment.yml create mode 100644 modules/nf-core/samtools/flagstat/main.nf create mode 100644 modules/nf-core/samtools/flagstat/meta.yml create mode 100644 modules/nf-core/samtools/flagstat/tests/main.nf.test create mode 100644 modules/nf-core/samtools/flagstat/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/flagstat/tests/tags.yml create mode 100644 modules/nf-core/samtools/idxstats/environment.yml create mode 100644 modules/nf-core/samtools/idxstats/main.nf create mode 100644 modules/nf-core/samtools/idxstats/meta.yml create mode 100644 modules/nf-core/samtools/idxstats/tests/main.nf.test create mode 100644 modules/nf-core/samtools/idxstats/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/idxstats/tests/tags.yml create mode 100644 modules/nf-core/samtools/stats/environment.yml create mode 100644 modules/nf-core/samtools/stats/main.nf create mode 100644 modules/nf-core/samtools/stats/meta.yml create mode 100644 modules/nf-core/samtools/stats/tests/main.nf.test create mode 100644 modules/nf-core/samtools/stats/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/stats/tests/tags.yml diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf new file mode 100644 index 00000000..c23f3a5c --- /dev/null +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -0,0 +1,45 @@ +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + samtools \\ + flagstat \\ + --threads ${task.cpus} \\ + $bam \\ + > ${prefix}.flagstat + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.flagstat + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml new file mode 100644 index 00000000..cdc4c254 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -0,0 +1,55 @@ +name: samtools_flagstat +description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG + type +keywords: + - stats + - mapping + - counts + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" +output: + - flagstat: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.flagstat": + type: file + description: File containing samtools flagstat output + pattern: "*.{flagstat}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test b/modules/nf-core/samtools/flagstat/tests/main.nf.test new file mode 100644 index 00000000..3b648a37 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FLAGSTAT" + script "../main.nf" + process "SAMTOOLS_FLAGSTAT" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/flagstat" + + test("BAM") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("BAM - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap new file mode 100644 index 00000000..04c3852b --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "BAM - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:02:58.866491759" + }, + "BAM": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "1": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + "versions": [ + "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:02:47.383332837" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/flagstat/tests/tags.yml b/modules/nf-core/samtools/flagstat/tests/tags.yml new file mode 100644 index 00000000..2d2b7255 --- /dev/null +++ b/modules/nf-core/samtools/flagstat/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/flagstat: + - modules/nf-core/samtools/flagstat/** diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf new file mode 100644 index 00000000..e2bb6b20 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -0,0 +1,47 @@ +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + samtools \\ + idxstats \\ + --threads ${task.cpus-1} \\ + $bam \\ + > ${prefix}.idxstats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + touch ${prefix}.idxstats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml new file mode 100644 index 00000000..f0a6bcb2 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -0,0 +1,55 @@ +name: samtools_idxstats +description: Reports alignment summary statistics for a BAM/CRAM/SAM file +keywords: + - stats + - mapping + - counts + - chromosome + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" +output: + - idxstats: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.idxstats": + type: file + description: File containing samtools idxstats output + pattern: "*.{idxstats}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test b/modules/nf-core/samtools/idxstats/tests/main.nf.test new file mode 100644 index 00000000..5fd1fc78 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_process { + + name "Test Process SAMTOOLS_IDXSTATS" + script "../main.nf" + process "SAMTOOLS_IDXSTATS" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/idxstats" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("bam - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + }} diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap new file mode 100644 index 00000000..2cc89a3b --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:11:56.466856235" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "1": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + "versions": [ + "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:11:46.311550359" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/tests/tags.yml b/modules/nf-core/samtools/idxstats/tests/tags.yml new file mode 100644 index 00000000..d3057c61 --- /dev/null +++ b/modules/nf-core/samtools/idxstats/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/idxstats: + - modules/nf-core/samtools/idxstats/** diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/stats/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf new file mode 100644 index 00000000..4443948b --- /dev/null +++ b/modules/nf-core/samtools/stats/main.nf @@ -0,0 +1,48 @@ +process SAMTOOLS_STATS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input), path(input_index) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--reference ${fasta}" : "" + """ + samtools \\ + stats \\ + --threads ${task.cpus} \\ + ${reference} \\ + ${input} \\ + > ${prefix}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml new file mode 100644 index 00000000..77b020f7 --- /dev/null +++ b/modules/nf-core/samtools/stats/meta.yml @@ -0,0 +1,66 @@ +name: samtools_stats +description: Produces comprehensive statistics from SAM/BAM/CRAM file +keywords: + - statistics + - counts + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference file the CRAM was created with (optional) + pattern: "*.{fasta,fa}" +output: + - stats: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.stats": + type: file + description: File containing samtools stats output + pattern: "*.{stats}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" +maintainers: + - "@drpatelh" + - "@FriederikeHanssen" + - "@ramprasadn" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test b/modules/nf-core/samtools/stats/tests/main.nf.test new file mode 100644 index 00000000..5bc89309 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test @@ -0,0 +1,113 @@ +nextflow_process { + + name "Test Process SAMTOOLS_STATS" + script "../main.nf" + process "SAMTOOLS_STATS" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/stats" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } + + test("cram - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + {assert process.success}, + {assert snapshot(process.out).match()} + ) + } + } +} diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap new file mode 100644 index 00000000..df507be7 --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -0,0 +1,142 @@ +{ + "cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:16.767396182" + }, + "bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:29.721580274" + }, + "cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:29:53.567964304" + }, + "bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d53a2584376d78942839e9933a34d11b" + ] + ], + "1": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d53a2584376d78942839e9933a34d11b" + ] + ], + "versions": [ + "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T09:28:50.73610604" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/tests/tags.yml b/modules/nf-core/samtools/stats/tests/tags.yml new file mode 100644 index 00000000..7c28e30f --- /dev/null +++ b/modules/nf-core/samtools/stats/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/stats: + - modules/nf-core/samtools/stats/** From 9a533a484d0751d487199089d5de5010a2541350 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Thu, 6 Feb 2025 17:14:05 +0100 Subject: [PATCH 063/557] add modules.json with samtools stats flagstat and idxstats --- modules.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules.json b/modules.json index 554b1abc..aafb8511 100644 --- a/modules.json +++ b/modules.json @@ -45,6 +45,21 @@ "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", "installed_by": ["modules"] }, + "samtools/flagstat": { + "branch": "master", + "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", + "installed_by": ["modules"] + }, + "samtools/idxstats": { + "branch": "master", + "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", + "installed_by": ["modules"] + }, + "samtools/stats": { + "branch": "master", + "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", + "installed_by": ["modules"] + }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", From 487d8ff47df01c0747ca6d807055bdf0b803c537 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 6 Feb 2025 14:53:44 +0100 Subject: [PATCH 064/557] adds detailed output info/changes to modules conf for clairS-TO specifically --- conf/modules.config | 8 ++++++++ docs/output.md | 2 ++ 2 files changed, 10 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..250023d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -126,6 +126,14 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: 'CLAIRSTO_ont' { + ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} + publishDir = [ + path: { "${params.outdir}/variants/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args diff --git a/docs/output.md b/docs/output.md index ecb81487..a5dd9f3b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -27,6 +27,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ### Minimap2 +[ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . + ### Cramino
Output files From e4aba761c97ab24bef1f440b2d512a8d18100fde Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 6 Feb 2025 16:22:02 +0100 Subject: [PATCH 065/557] adds model options based on schema --- assets/schema_input.json | 4 ++-- modules/local/clairsto/main.nf | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index d9a225f2..b91612db 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -34,8 +34,8 @@ }, "specs": { "type": "string", - "enum": ["R9", "R10", "NA"], - "errorMessage": "Detailed of the used sequencing technology (R9 or R10) for ont and 'NA' for pb" + "enum": ["R9_4k", "R10_4k","R9_5k", "R10_5k", "NA"], + "errorMessage": "Detailed of the used sequencing technology (R9 or R10 at either 4khz or 5khz) for ont and 'NA' for pb" } }, "required": ["sample", "bam_tumor","method","specs"] diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index c2fda8da..e300ffcc 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -37,6 +37,8 @@ process CLAIRSTO { // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(tumour_bam) path(ref) + val specs + val method output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels @@ -49,9 +51,22 @@ process CLAIRSTO { task.ext.when == null || task.ext.when script: - // TODO : change to reflect the meta data information from Laurens - def platform = task.ext.platform ?: 'ont' def output_dir = "${meta.id}_clairs_output" + + // Contains ClairS-TO models appropriate for specs in the schema + def platformMap = [ + 'R9_4k': 'ont_r10_dorado_sup_4khz', + 'R10_4k': 'ont_r10_dorado_sup_4khz', + 'R9_5k': 'ont_r10_dorado_sup_5khz_ssrs', + 'R10_5k': 'ont_r10_dorado_sup_5khz_ssrs' + ] + + def platform = (params.method == 'pb') ? 'pb' : platformMap.get(params.specs) + + if (specs in ['R9_4k', 'R10_4k','R9_5k']) { + log.warn "Warning: ClairS-TO has no appropriate models for ${params.specs} defaulting to ${platform}" + } + def SNV_VCFGZ="${output_dir}/snv.vcf.gz" def INDEL_VCFGZ="${output_dir}/indel.vcf.gz" def SNV_VCF="${output_dir}/snv.vcf" From 84b3723e810103f801409346fc7e884e9a7949f6 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:33:30 +0100 Subject: [PATCH 066/557] fixed asterix in modules.config --- conf/modules.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 250023d3..de3465a6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -48,6 +48,8 @@ process { ].join(' ').trim() } ext.args4 = "-T '*'" + withName: '.*:CRAMINO_PRE' { + ext.args = { '--ubam' } publishDir = [ enabled: false ] @@ -63,6 +65,7 @@ process { } withName: '.*:CRAMINO_POST' { + ext.args = { '' } publishDir = [ path: { "${params.outdir}/qc/cramino_aln" }, mode: params.publish_dir_mode, @@ -71,6 +74,7 @@ process { } withName: '.*:MODKIT_PILEUP' { + ext.args = { '' } publishDir = [ path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, From 08c6837e9918970fd34296c7f30151c6ea4bcedd Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 17:10:49 +0100 Subject: [PATCH 067/557] update module config and output md --- conf/modules.config | 12 ------------ docs/output.md | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index de3465a6..f18c78d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -48,8 +48,6 @@ process { ].join(' ').trim() } ext.args4 = "-T '*'" - withName: '.*:CRAMINO_PRE' { - ext.args = { '--ubam' } publishDir = [ enabled: false ] @@ -65,7 +63,6 @@ process { } withName: '.*:CRAMINO_POST' { - ext.args = { '' } publishDir = [ path: { "${params.outdir}/qc/cramino_aln" }, mode: params.publish_dir_mode, @@ -74,7 +71,6 @@ process { } withName: '.*:MODKIT_PILEUP' { - ext.args = { '' } publishDir = [ path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, @@ -130,14 +126,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'CLAIRSTO_ont' { - ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} - publishDir = [ - path: { "${params.outdir}/variants/clairsto" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args diff --git a/docs/output.md b/docs/output.md index a5dd9f3b..8630909d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -27,8 +27,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ### Minimap2 -[ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . - ### Cramino
Output files @@ -125,4 +123,4 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. \ No newline at end of file From d2fc263c289d72f9513a9affec8537566eb44d93 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 16:42:47 +0100 Subject: [PATCH 068/557] restructured output dirs --- conf/modules.config | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..f3047ad0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -73,6 +73,7 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ path: { "${params.outdir}/methylation/modkit_pileup" }, +<<<<<<< HEAD mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -82,6 +83,8 @@ process { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, +======= +>>>>>>> 88a7193 (restructured output dirs) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -89,7 +92,11 @@ process { withName: '.*:MOSDEPTH' { publishDir = [ +<<<<<<< HEAD path: { "${params.outdir}/qc/mosdepth" }, +======= + path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, +>>>>>>> b115595 (restructured output dirs) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -118,6 +125,30 @@ process { ] } + withName: '.*:CLAIRSTO_revio' { + ext.args = { "--platform hifi_revio"} + publishDir = [ +<<<<<<< HEAD + path: { "${params.outdir}/variants/clairsto" }, +======= + path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, +>>>>>>> 88a7193 (restructured output dirs) + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] +<<<<<<< HEAD +======= + } + + withName: '.*:SEVERUS' { + ext.args = '--min-support 3' + publishDir = [ + path: { "${params.outdir}/variants/severus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ @@ -125,6 +156,7 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] +>>>>>>> b115595 (restructured output dirs) } withName: '.*:FIBERTOOLSRS_FIRE' { From e559edf3b8fc2d9c0dae2173cf81b8d66baf4e52 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 11:17:40 +0100 Subject: [PATCH 069/557] added TODO --- conf/modules.config | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f3047ad0..fa9c97e9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -92,11 +92,7 @@ process { withName: '.*:MOSDEPTH' { publishDir = [ -<<<<<<< HEAD path: { "${params.outdir}/qc/mosdepth" }, -======= - path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, ->>>>>>> b115595 (restructured output dirs) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -114,6 +110,7 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] +<<<<<<< HEAD } withName: '.*:SEVERUS' { @@ -138,6 +135,8 @@ process { ] <<<<<<< HEAD ======= +======= +>>>>>>> e3bf2d3 (added TODO) } withName: '.*:SEVERUS' { @@ -156,7 +155,6 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] ->>>>>>> b115595 (restructured output dirs) } withName: '.*:FIBERTOOLSRS_FIRE' { From b6945ccc9daced5407c1b8ce48f26b0db25a3564 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 13:07:49 +0100 Subject: [PATCH 070/557] added some missing info in output.md and readme.md --- docs/output.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/output.md b/docs/output.md index 8630909d..992fbe91 100644 --- a/docs/output.md +++ b/docs/output.md @@ -67,6 +67,11 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 28d7f81 (added some missing info in output.md and readme.md) ### ClairS-TO
@@ -80,6 +85,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - `run_clairs_to.log.bak`: a text file containing the run command
+<<<<<<< HEAD +======= +>>>>>>> 67e2bda (added some missing info in output.md and readme.md) +>>>>>>> 28d7f81 (added some missing info in output.md and readme.md) ### Severus
@@ -95,6 +104,23 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . ### MultiQC +<<<<<<< HEAD +======= + +
+Output files + +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats. + +
+ +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . +>>>>>>> 28d7f81 (added some missing info in output.md and readme.md)
Output files From 41b26694842b46d33513404665b4f372cf9b3aae Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 6 Feb 2025 14:53:44 +0100 Subject: [PATCH 071/557] adds detailed output info/changes to modules conf for clairS-TO specifically --- conf/modules.config | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index fa9c97e9..0907de27 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -151,7 +151,19 @@ process { withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ +<<<<<<< HEAD path: { "${params.outdir}/variants/clairsto" }, +======= + path: { "${params.outdir}/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'CLAIRSTO_ont' { + ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} + publishDir = [ + path: { "${params.outdir}/clairsto" }, +>>>>>>> f8e7484 (adds detailed output info/changes to modules conf) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From eebf28c30527df78dfebc20fa463c02c8715a5e3 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 6 Feb 2025 14:53:44 +0100 Subject: [PATCH 072/557] adds detailed output info/changes to modules conf for clairS-TO specifically --- conf/modules.config | 44 +------------------------------------------- docs/output.md | 2 ++ 2 files changed, 3 insertions(+), 43 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0907de27..e20a0163 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -73,7 +73,6 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ path: { "${params.outdir}/methylation/modkit_pileup" }, -<<<<<<< HEAD mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -83,8 +82,6 @@ process { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, -======= ->>>>>>> 88a7193 (restructured output dirs) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -110,7 +107,6 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] -<<<<<<< HEAD } withName: '.*:SEVERUS' { @@ -125,45 +121,7 @@ process { withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ -<<<<<<< HEAD path: { "${params.outdir}/variants/clairsto" }, -======= - path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, ->>>>>>> 88a7193 (restructured output dirs) - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] -<<<<<<< HEAD -======= -======= ->>>>>>> e3bf2d3 (added TODO) - } - - withName: '.*:SEVERUS' { - ext.args = '--min-support 3' - publishDir = [ - path: { "${params.outdir}/variants/severus" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:CLAIRSTO_revio' { - ext.args = { "--platform hifi_revio"} - publishDir = [ -<<<<<<< HEAD - path: { "${params.outdir}/variants/clairsto" }, -======= - path: { "${params.outdir}/clairsto" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: 'CLAIRSTO_ont' { - ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} - publishDir = [ - path: { "${params.outdir}/clairsto" }, ->>>>>>> f8e7484 (adds detailed output info/changes to modules conf) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -186,4 +144,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} +} \ No newline at end of file diff --git a/docs/output.md b/docs/output.md index 992fbe91..12ddd9bb 100644 --- a/docs/output.md +++ b/docs/output.md @@ -27,6 +27,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d ### Minimap2 +[ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . + ### Cramino
Output files From ca2470d26901fd27b997732165e41baa08ceff07 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:32:43 +0100 Subject: [PATCH 073/557] initial addition of minimap2 subworkflow --- subworkflows/local/run_minimap2.nf | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 subworkflows/local/run_minimap2.nf diff --git a/subworkflows/local/run_minimap2.nf b/subworkflows/local/run_minimap2.nf new file mode 100644 index 00000000..3e4fddb6 --- /dev/null +++ b/subworkflows/local/run_minimap2.nf @@ -0,0 +1,37 @@ +// +// Run minimap2 on tumour (and normal) ubams +// + +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_TUMOUR } from '../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_NORMAL } from '../modules/nf-core/minimap2/align/main' + +workflow RUN_MINIMAP2 { + take: + ch_cat_ubams + + main: + ch_versions = Channel.empty() + + // Check if sample is paired or not + if ch_cat_ubams.meta.paired { + ubam_normal = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, normal_bam ] } + ubam_tumor = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, tumor_bam ] } + + + MINIMAP2_ALIGN_TUMOUR( ubam_normal ) + .reads + .set { ch_align_tumour } + + MINIMAP2_ALIGN_NORMAL( ubam_tumor ) + .reads + .set { ch_align_normal } + + // Remake channel + ch_aligned = ch_align_tumour.merge( ch_align_normal ) + //TODO: check if this works + } else { + MINIMAP2_ALIGN_TUMOUR( ch_cat_ubams ) + .reads + .set { ch_aligned } + } +} \ No newline at end of file From 769b634e766cbd856d741e2a2c62f11b6e78c234 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 10:53:28 +0100 Subject: [PATCH 074/557] added chr19 reference genome fasta --- conf/test.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/test.config b/conf/test.config index b9d44c91..f875e014 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,5 +28,9 @@ params { //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' input ="$projectDir/assets/samplesheet.csv" // Genome references +<<<<<<< HEAD fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" +======= + fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' +>>>>>>> b3b9851 (added chr19 reference genome fasta) } From 04c47be18a5e068bf46d5f309ef5efdc82b0cd1a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:21:27 +0100 Subject: [PATCH 075/557] added empty [] for normal bams in samplesheet channel --- conf/test.config | 4 ---- .../local/utils_nfcore_lr_somatic_pipeline/main.nf | 11 +++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/conf/test.config b/conf/test.config index f875e014..93873a1b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,9 +28,5 @@ params { //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' input ="$projectDir/assets/samplesheet.csv" // Genome references -<<<<<<< HEAD - fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" -======= fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' ->>>>>>> b3b9851 (added chr19 reference genome fasta) } diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 65ead345..e5908976 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,10 +74,13 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method, specs -> - def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, method: method, specs: specs ] - return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] + .map { + meta, bam_tumor, bam_normal, method, specs -> + if (!bam_normal) { + return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ], [] ] + } else { + return [ meta + [ paired_data:true, method:method, specs:specs ], [ bam_tumor ], [ bam_normal ] ] + } } .groupTuple() .map { meta, bam_tumor, bam_normal -> From bb9b63ed1e269a7dccb81ef1a590050f95472ba0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:22:13 +0100 Subject: [PATCH 076/557] added minimap2 subworkflow --- subworkflows/local/run_minimap2_align.nf | 50 ++++++++++-------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 404bb0d3..64c5fdcc 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -2,19 +2,17 @@ // Run minimap2 on tumour (and normal) ubams // -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_PB } from '../../modules/nf-core/minimap2/align/main' -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN } from '../../modules/nf-core/minimap2/align/main' workflow RUN_MINIMAP2_ALIGN { take: - ch_ubams // channel: val(meta), [ bam ] + ch_ubams // channel: val(meta), [ bam_tumor, bam_normal ] or val(meta), [ bam_tumor ] ch_minimap_index main: ch_versions = Channel.empty() - ch_aligned = Channel.empty() // Initialize ch_aligned - + ch_aligned = Channel.empty() // Initialize ch_aligned // Split the channel into pacbio and ont ch_split = ch_ubams .branch { meta, bam -> @@ -22,22 +20,18 @@ workflow RUN_MINIMAP2_ALIGN { pb: meta.method == 'pb' } - // Run minimap2 on PacBio samples - MINIMAP2_ALIGN_PB ( - ch_split.pb, - ch_minimap_index, - true, - 'bai', - "", - "" - ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) - ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam - - // Run minimap2 on ONT samples - MINIMAP2_ALIGN_ONT ( - ch_split.ont, + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam] + } + + return result + } + .view() + .set { ch_restructured_ubams } + // Run minimap2 align on each bam file + MINIMAP2_ALIGN ( + ch_restructured_ubams, ch_minimap_index, true, 'bai', @@ -45,16 +39,12 @@ workflow RUN_MINIMAP2_ALIGN { "" ) - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) - ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam - - // Mix back in together - ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) - - // TODO: Restructure back to normal if needed - // ch_aligned is now [[meta], [bam]] - // With meta consisting of [id, paired_data, method, specs, type] + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + ch_aligned = MINIMAP2_ALIGN.out.bam + // Restructure back to original format + + emit: aligned = ch_aligned versions = ch_versions From cf0690cf565a3c5d541c7e1b3e61b706eaea9eca Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:22:43 +0100 Subject: [PATCH 077/557] added prepare genomes and minimap2 to workflow --- workflows/lr_somatic.nf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index aee860ff..67d346bf 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -23,6 +23,13 @@ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' +// +// IMPORT SUBWORKFLOWS +// + +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -102,10 +109,6 @@ workflow LR_SOMATIC { RUN_MINIMAP2_ALIGN.out.aligned .set { ch_minimap_bam } // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] - - // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together - // - // MODULE: CRAMINO // //CRAMINO_POST ( ) From 155dedb17e6a2698017a2ac93dddd5a8692f1ebb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 13:23:12 +0100 Subject: [PATCH 078/557] removed old subworkflow --- subworkflows/local/run_minimap2.nf | 37 ------------------------------ 1 file changed, 37 deletions(-) delete mode 100644 subworkflows/local/run_minimap2.nf diff --git a/subworkflows/local/run_minimap2.nf b/subworkflows/local/run_minimap2.nf deleted file mode 100644 index 3e4fddb6..00000000 --- a/subworkflows/local/run_minimap2.nf +++ /dev/null @@ -1,37 +0,0 @@ -// -// Run minimap2 on tumour (and normal) ubams -// - -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_TUMOUR } from '../modules/nf-core/minimap2/align/main' -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_NORMAL } from '../modules/nf-core/minimap2/align/main' - -workflow RUN_MINIMAP2 { - take: - ch_cat_ubams - - main: - ch_versions = Channel.empty() - - // Check if sample is paired or not - if ch_cat_ubams.meta.paired { - ubam_normal = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, normal_bam ] } - ubam_tumor = ch_cat_ubams.map{ meta, tumor_bam, normal_bam -> [ meta, tumor_bam ] } - - - MINIMAP2_ALIGN_TUMOUR( ubam_normal ) - .reads - .set { ch_align_tumour } - - MINIMAP2_ALIGN_NORMAL( ubam_tumor ) - .reads - .set { ch_align_normal } - - // Remake channel - ch_aligned = ch_align_tumour.merge( ch_align_normal ) - //TODO: check if this works - } else { - MINIMAP2_ALIGN_TUMOUR( ch_cat_ubams ) - .reads - .set { ch_aligned } - } -} \ No newline at end of file From bcd5ab31737f374ffcbcdc4cd1200bb0d1886a2f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:50:13 +0100 Subject: [PATCH 079/557] finalized minimap2 subworkflow --- subworkflows/local/run_minimap2_align.nf | 45 ++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 64c5fdcc..2cc707c6 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -2,7 +2,8 @@ // Run minimap2 on tumour (and normal) ubams // -include { MINIMAP2_ALIGN } from '../../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_PB } from '../../modules/nf-core/minimap2/align/main' +include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/minimap2/align/main' workflow RUN_MINIMAP2_ALIGN { take: @@ -27,11 +28,18 @@ workflow RUN_MINIMAP2_ALIGN { return result } - .view() .set { ch_restructured_ubams } - // Run minimap2 align on each bam file - MINIMAP2_ALIGN ( - ch_restructured_ubams, + + // Split the channel into pacbio and ont + ch_split = ch_restructured_ubams + .branch { meta, bam -> + ont: meta.method == 'ont' + pb: meta.method == 'pb' + } + + // Run minimap2 on PacBio samples + MINIMAP2_ALIGN_PB ( + ch_split.pb, ch_minimap_index, true, 'bai', @@ -39,12 +47,29 @@ workflow RUN_MINIMAP2_ALIGN { "" ) - ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) - ch_aligned = MINIMAP2_ALIGN.out.bam + ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) + ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam + + // Run minimap2 on ONT samples + MINIMAP2_ALIGN_ONT ( + ch_split.ont, + ch_minimap_index, + true, + 'bai', + "", + "" + ) + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) + ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam + + // Mix back in together + ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) + + // TODO: Restructure back to normal if needed + // ch_aligned is now [[meta], [bam]] + // With meta consisting of [id, paired_data, method, specs, type] - // Restructure back to original format - - emit: aligned = ch_aligned versions = ch_versions From fa8baec91053c8b159fd84531ab367e70673263f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:51:29 +0100 Subject: [PATCH 080/557] added process-specific minimap2 parameters --- conf/modules.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index e20a0163..15c6b21d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -72,6 +72,7 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ +<<<<<<< HEAD path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -82,6 +83,9 @@ process { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, +======= + path: { "${params.outdir}/qc/modkit_pileup" }, +>>>>>>> c9d28a8 (added process-specific minimap2 parameters) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 9eafb0b8f7fea8e2f4b74238d91e8cf532a5c70f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Feb 2025 15:51:50 +0100 Subject: [PATCH 081/557] changed test config and samplesheet for easier identification what is going on --- conf/modules.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 15c6b21d..e20a0163 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -72,7 +72,6 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ -<<<<<<< HEAD path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -83,9 +82,6 @@ process { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, -======= - path: { "${params.outdir}/qc/modkit_pileup" }, ->>>>>>> c9d28a8 (added process-specific minimap2 parameters) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From eb6fa1e13153456ed0c52526381595901c072327 Mon Sep 17 00:00:00 2001 From: MariosEft97 Date: Tue, 4 Feb 2025 17:03:06 +0100 Subject: [PATCH 082/557] fibertools-rs qc, predict-m6a and fire modules --- conf/modules.config | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index e20a0163..44c42436 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -109,33 +109,55 @@ process { ] } +<<<<<<< HEAD withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ path: { "${params.outdir}/variants/severus" }, +======= + withName: 'FIBERTOOLSRS_QC' { + ext.args = { params.autocorrelation ? "--acf" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/qc" }, +>>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } +<<<<<<< HEAD withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ path: { "${params.outdir}/variants/clairsto" }, +======= + withName: 'FIBERTOOLSRS_PREDICTM6A' { + ext.args = { params.keep_kinetic_data ? "--keep" : '', params.keep_all_calls ? "--all-calls" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/predictm6a" }, +>>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } +<<<<<<< HEAD withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, +======= + withName: 'FIBERTOOLSRS_FIRE' { + ext.args = { params.ont_data ? "--ont" : '' } + publishDir = [ + path: { "${params.outdir}/fibertoolsrs/fire" }, +>>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } +<<<<<<< HEAD withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ @@ -144,4 +166,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} +======= +} +>>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) From fa0763e67fa1010614f8839dbf99493336d22b42 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 4 Feb 2025 16:55:50 +0100 Subject: [PATCH 083/557] install nf-core severus module --- conf/modules.config | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 44c42436..f18c78d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -109,55 +109,33 @@ process { ] } -<<<<<<< HEAD withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ path: { "${params.outdir}/variants/severus" }, -======= - withName: 'FIBERTOOLSRS_QC' { - ext.args = { params.autocorrelation ? "--acf" : '' } - publishDir = [ - path: { "${params.outdir}/fibertoolsrs/qc" }, ->>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -<<<<<<< HEAD withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ path: { "${params.outdir}/variants/clairsto" }, -======= - withName: 'FIBERTOOLSRS_PREDICTM6A' { - ext.args = { params.keep_kinetic_data ? "--keep" : '', params.keep_all_calls ? "--all-calls" : '' } - publishDir = [ - path: { "${params.outdir}/fibertoolsrs/predictm6a" }, ->>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -<<<<<<< HEAD withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, -======= - withName: 'FIBERTOOLSRS_FIRE' { - ext.args = { params.ont_data ? "--ont" : '' } - publishDir = [ - path: { "${params.outdir}/fibertoolsrs/fire" }, ->>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -<<<<<<< HEAD withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ @@ -167,6 +145,3 @@ process { ] } } -======= -} ->>>>>>> eafd718 (fibertools-rs qc, predict-m6a and fire modules) From b81f34768c59f309320a33e17e24248c7b9eaf30 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 11:20:58 +0100 Subject: [PATCH 084/557] changed test samplesheet input to always take the one in the projectdir/assets/samplesheet.csv --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 93873a1b..b9d44c91 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,5 +28,5 @@ params { //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' input ="$projectDir/assets/samplesheet.csv" // Genome references - fasta = '/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa' + fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" } From 3af40f146f75450dfc99689d58f71e1d46342838 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 6 Feb 2025 12:02:03 +0100 Subject: [PATCH 085/557] changed channel structure --- .../local/utils_nfcore_lr_somatic_pipeline/main.nf | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index e5908976..65ead345 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,13 +74,10 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { - meta, bam_tumor, bam_normal, method, specs -> - if (!bam_normal) { - return [ meta + [ paired_data:false, method:method, specs:specs ], [ bam_tumor ], [] ] - } else { - return [ meta + [ paired_data:true, method:method, specs:specs ], [ bam_tumor ], [ bam_normal ] ] - } + .map { meta, bam_tumor, bam_normal, method, specs -> + def paired_data = bam_normal ? true : false + def meta_info = meta + [ paired_data: paired_data, method: method, specs: specs ] + return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .groupTuple() .map { meta, bam_tumor, bam_normal -> From d20e80a0721a672e25a81c7e228a32385912eaa7 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 6 Feb 2025 14:53:44 +0100 Subject: [PATCH 086/557] adds detailed output info/changes to modules conf for clairS-TO specifically --- conf/modules.config | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..b0fe4561 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -121,7 +121,19 @@ process { withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ +<<<<<<< HEAD path: { "${params.outdir}/variants/clairsto" }, +======= + path: { "${params.outdir}/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'CLAIRSTO_ont' { + ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} + publishDir = [ + path: { "${params.outdir}/clairsto" }, +>>>>>>> f8e7484 (adds detailed output info/changes to modules conf) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 99c9b0ffe8aad5cf2b1e23d50211858b71fe8b82 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 7 Feb 2025 10:07:56 +0100 Subject: [PATCH 087/557] rebases clairsto --- conf/modules.config | 12 ------------ subworkflows/local/run_minimap2_align.nf | 23 ++++------------------- workflows/lr_somatic.nf | 13 +++++-------- 3 files changed, 9 insertions(+), 39 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b0fe4561..f18c78d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -121,19 +121,7 @@ process { withName: '.*:CLAIRSTO_revio' { ext.args = { "--platform hifi_revio"} publishDir = [ -<<<<<<< HEAD path: { "${params.outdir}/variants/clairsto" }, -======= - path: { "${params.outdir}/clairsto" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: 'CLAIRSTO_ont' { - ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} - publishDir = [ - path: { "${params.outdir}/clairsto" }, ->>>>>>> f8e7484 (adds detailed output info/changes to modules conf) mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 2cc707c6..cd288925 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -7,31 +7,16 @@ include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/min workflow RUN_MINIMAP2_ALIGN { take: - ch_ubams // channel: val(meta), [ bam_tumor, bam_normal ] or val(meta), [ bam_tumor ] + ch_ubams // channel: val(meta), [ bam ] ch_minimap_index main: ch_versions = Channel.empty() - ch_aligned = Channel.empty() // Initialize ch_aligned - // Split the channel into pacbio and ont - ch_split = ch_ubams - .branch { meta, bam -> - ont: meta.method == 'ont' - pb: meta.method == 'pb' - } - - def meta_normal = meta.clone() - meta_normal.type = 'normal' - result << [meta_normal, normal_bam] - } - - return result - } - .set { ch_restructured_ubams } + ch_aligned = Channel.empty() // Initialize ch_aligned // Split the channel into pacbio and ont - ch_split = ch_restructured_ubams + ch_split = ch_ubams .branch { meta, bam -> ont: meta.method == 'ont' pb: meta.method == 'pb' @@ -73,4 +58,4 @@ workflow RUN_MINIMAP2_ALIGN { emit: aligned = ch_aligned versions = ch_versions -} +} \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 67d346bf..49282a4e 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -23,13 +23,6 @@ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' -// -// IMPORT SUBWORKFLOWS -// - -include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' -include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -109,6 +102,10 @@ workflow LR_SOMATIC { RUN_MINIMAP2_ALIGN.out.aligned .set { ch_minimap_bam } // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] + + // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together + // + // MODULE: CRAMINO // //CRAMINO_POST ( ) @@ -174,4 +171,4 @@ workflow LR_SOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ +*/ \ No newline at end of file From d4ba21e75d14f40ebba3c2f2d429edfb9b0cd1e9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 10:58:04 +0100 Subject: [PATCH 088/557] fixed naming issue to avoid same names --- conf/modules.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..bd55001b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,6 +28,7 @@ process { } withName: '.*:MINIMAP2_ALIGN_PB' { + ext.prefix = { "${meta.id}_mapped" } //TODO: fix this ext.args = { [ params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , @@ -41,6 +42,7 @@ process { } withName: '.*:MINIMAP2_ALIGN_ONT' { + ext.prefix = { "${meta.id}_mapped" } //TODO: fix this ext.args = { [ params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-ont", From 49ab70d98255be74f9f70414a6f39254821df5f0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:00:38 +0100 Subject: [PATCH 089/557] added publishdir to samtools stats/flagstats/idxstats --- conf/modules.config | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index bd55001b..13b60b39 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,7 +28,7 @@ process { } withName: '.*:MINIMAP2_ALIGN_PB' { - ext.prefix = { "${meta.id}_mapped" } //TODO: fix this + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , @@ -42,7 +42,7 @@ process { } withName: '.*:MINIMAP2_ALIGN_ONT' { - ext.prefix = { "${meta.id}_mapped" } //TODO: fix this + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-ont", @@ -146,4 +146,13 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} + + withName: '.*:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/samtools/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } From 72143753a6cfb0ce4f305b5c242043e0b2488005 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:01:59 +0100 Subject: [PATCH 090/557] added samtools stats subworkflow --- .../nf-core/bam_stats_samtools/main.nf | 32 ++ .../nf-core/bam_stats_samtools/meta.yml | 43 +++ .../bam_stats_samtools/tests/main.nf.test | 188 ++++++++++ .../tests/main.nf.test.snap | 350 ++++++++++++++++++ .../nf-core/bam_stats_samtools/tests/tags.yml | 2 + 5 files changed, 615 insertions(+) create mode 100644 subworkflows/nf-core/bam_stats_samtools/main.nf create mode 100644 subworkflows/nf-core/bam_stats_samtools/meta.yml create mode 100644 subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test create mode 100644 subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/bam_stats_samtools/tests/tags.yml diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf new file mode 100644 index 00000000..44d4c010 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -0,0 +1,32 @@ +// +// Run SAMtools stats, flagstat and idxstats +// + +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' + +workflow BAM_STATS_SAMTOOLS { + take: + ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [ val(meta), path(fasta) ] + + main: + ch_versions = Channel.empty() + + SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) + + SAMTOOLS_FLAGSTAT ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) + + SAMTOOLS_IDXSTATS ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) + + emit: + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] + + versions = ch_versions // channel: [ path(versions.yml) ] +} diff --git a/subworkflows/nf-core/bam_stats_samtools/meta.yml b/subworkflows/nf-core/bam_stats_samtools/meta.yml new file mode 100644 index 00000000..809bf736 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/meta.yml @@ -0,0 +1,43 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: bam_stats_samtools +description: Produces comprehensive statistics from SAM/BAM/CRAM file +keywords: + - statistics + - counts + - bam + - sam + - cram +components: + - samtools/stats + - samtools/idxstats + - samtools/flagstat +input: + - ch_bam_bai: + description: | + The input channel containing the BAM/CRAM and it's index + Structure: [ val(meta), path(bam), path(bai) ] + - ch_fasta: + description: | + Reference genome fasta file + Structure: [ path(fasta) ] +output: + - stats: + description: | + File containing samtools stats output + Structure: [ val(meta), path(stats) ] + - flagstat: + description: | + File containing samtools flagstat output + Structure: [ val(meta), path(flagstat) ] + - idxstats: + description: | + File containing samtools idxstats output + Structure: [ val(meta), path(idxstats)] + - versions: + description: | + Files containing software versions + Structure: [ path(versions.yml) ] +authors: + - "@drpatelh" +maintainers: + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test new file mode 100644 index 00000000..76e7a40a --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -0,0 +1,188 @@ +nextflow_workflow { + + name "Test Workflow BAM_STATS_SAMTOOLS" + script "../main.nf" + workflow "BAM_STATS_SAMTOOLS" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "bam_stats_samtools" + tag "subworkflows/bam_stats_samtools" + tag "samtools" + tag "samtools/flagstat" + tag "samtools/idxstats" + tag "samtools/stats" + + test("test_bam_stats_samtools_single_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram") { + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.flagstat, + workflow.out.idxstats, + workflow.out.stats, + workflow.out.versions).match() } + ) + } + } + + test ("test_bam_stats_samtools_single_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("test_bam_stats_samtools_paired_end_cram - stub") { + + options "-stub" + + when { + workflow { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap new file mode 100644 index 00000000..8ca22526 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -0,0 +1,350 @@ +{ + "test_bam_stats_samtools_paired_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:35.660286921" + }, + "test_bam_stats_samtools_single_end - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:24.220305512" + }, + "test_bam_stats_samtools_paired_end_cram - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ], + "flagstat": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "idxstats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:54.206770141" + }, + "test_bam_stats_samtools_single_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,2191911d72575a2358b08b1df64ccb53" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,613e048487662c694aa4a2f73ca96a20" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,291bb2393ec947140d12d42c2795b222" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:07:49.731645858" + }, + "test_bam_stats_samtools_paired_end": { + "content": [ + [ + [ + { + "id": "test", + "single_end": true + }, + "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], + [ + [ + { + "id": "test", + "single_end": true + }, + "test.stats:md5,8140d69cdedd77570ca1d7618a744e16" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:01.421996172" + }, + "test_bam_stats_samtools_paired_end_cram": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,a53f3d26e2e9851f7d528442bbfe9781" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,e179601fa7b8ebce81ac3765206f6c15" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,1622856127bafd6cdbadee9cd64ec9b7" + ] + ], + [ + "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", + "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", + "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:08:12.640915756" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml new file mode 100644 index 00000000..ec2f2d68 --- /dev/null +++ b/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/bam_stats_samtools: + - subworkflows/nf-core/bam_stats_samtools/** From 6edb65d1b1d1b0e5e97369bd6e1106b65891853c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:02:34 +0100 Subject: [PATCH 091/557] added subworkflow to modules.json --- modules.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules.json b/modules.json index 554b1abc..c320d11f 100644 --- a/modules.json +++ b/modules.json @@ -54,6 +54,11 @@ }, "subworkflows": { "nf-core": { + "bam_stats_samtools": { + "branch": "master", + "git_sha": "763d4b5c05ffda3ac1ac969dc67f7458cfb2eb1d", + "installed_by": ["subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", From 04b2785825a72b82a2d11a9a42bcaac460227c9e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:03:00 +0100 Subject: [PATCH 092/557] also emit index required for samtools idxstats --- subworkflows/local/run_minimap2_align.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index 404bb0d3..e5061fff 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -13,7 +13,6 @@ workflow RUN_MINIMAP2_ALIGN { main: ch_versions = Channel.empty() - ch_aligned = Channel.empty() // Initialize ch_aligned // Split the channel into pacbio and ont ch_split = ch_ubams @@ -21,7 +20,7 @@ workflow RUN_MINIMAP2_ALIGN { ont: meta.method == 'ont' pb: meta.method == 'pb' } - + // Run minimap2 on PacBio samples MINIMAP2_ALIGN_PB ( ch_split.pb, @@ -34,7 +33,9 @@ workflow RUN_MINIMAP2_ALIGN { ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam - + ch_index_pb = MINIMAP2_ALIGN_PB.out.index + + // Run minimap2 on ONT samples MINIMAP2_ALIGN_ONT ( ch_split.ont, @@ -47,15 +48,14 @@ workflow RUN_MINIMAP2_ALIGN { ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam + ch_index_ont = MINIMAP2_ALIGN_ONT.out.index // Mix back in together ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) - - // TODO: Restructure back to normal if needed - // ch_aligned is now [[meta], [bam]] - // With meta consisting of [id, paired_data, method, specs, type] + ch_index = ch_index_pb.mix(ch_index_ont) emit: aligned = ch_aligned + index = ch_index versions = ch_versions } From df207a661d7876f7eb06285f4cf9d9cfc9428b8c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:03:25 +0100 Subject: [PATCH 093/557] added bam_stats_samtools subworkflow and mix files into multiqc --- workflows/lr_somatic.nf | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index aee860ff..acd95b8b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -22,6 +22,7 @@ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -57,7 +58,7 @@ workflow LR_SOMATIC { .bam .mix ( ch_split.single ) .set { ch_cat_ubams } - ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions) /* // TODO: Add pre-alignment QC step here @@ -110,6 +111,17 @@ workflow LR_SOMATIC { //CRAMINO_POST ( ) + // + // SUBWORKFLOW: BAM_STATS_SAMTOOLS + // + BAM_STATS_SAMTOOLS ( + ch_minimap_bam.join(RUN_MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_fasta + ) + + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + + // // Collate and save software versions // @@ -134,11 +146,11 @@ workflow LR_SOMATIC { Channel.fromPath(params.multiqc_logo, checkIfExists: true) : Channel.empty() - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( + ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) @@ -152,7 +164,12 @@ workflow LR_SOMATIC { sort: true ) ) - + + // Collect MultiQC files + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + + ch_multiqc_files.view() MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), From 408269180f7f2b77649ba84f973c71737c0d041d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:07:52 +0100 Subject: [PATCH 094/557] updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f203198e..f9942498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,9 +17,11 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - pigz module - samtools/cat module - samtools faidx module +- bam_stats_samtools subworkflow ### `Fixed` - New channel structure +- No longer possible to have duplicated naming after samtools cat ### `Dependencies` From 84540a1b0195b99ad6ec98b260a7635f61134880 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:27:47 +0100 Subject: [PATCH 095/557] changed from minimap2 branching to one minimap2 module --- conf/modules.config | 18 +++--------------- workflows/lr_somatic.nf | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..7f672a79 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -27,23 +27,11 @@ process { ] } - withName: '.*:MINIMAP2_ALIGN_PB' { + withName: '.*:MINIMAP2_ALIGN' { ext.args = { [ - params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , - params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " - ].join(' ').trim() - } - ext.args4 = "-T '*'" - publishDir = [ - enabled: false - ] - } - - withName: '.*:MINIMAP2_ALIGN_ONT' { - ext.args = { - [ - params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-ont", + "$meta.method == 'pb'" ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-lr:hq" ), params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " ].join(' ').trim() } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index aee860ff..bfb07c80 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -12,16 +12,14 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s // // IMPORT MODULES // - include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' // // IMPORT SUBWORKFLOWS // - include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' -include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -91,17 +89,20 @@ workflow LR_SOMATIC { } // - // SUBWORKFLOW: RUN_MINIMAP2_ALIGN + // MODULE: MINIMAP2_ALIGN // - RUN_MINIMAP2_ALIGN ( + MINIMAP2_ALIGN ( ch_cat_ubams, - ch_minimap_index + ch_minimap_index, + true, + 'bai', + "", + "" ) - ch_versions = ch_versions.mix(RUN_MINIMAP2_ALIGN.out.versions) - RUN_MINIMAP2_ALIGN.out.aligned + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } - // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together // From f21d9a8f8ca01142bc61e09f1ea92fd81aad4a83 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:33:58 +0100 Subject: [PATCH 096/557] added minimap2 pb/ont selection in modules.config and updated workflow --- conf/modules.config | 22 --------- subworkflows/local/run_minimap2_align.nf | 61 ------------------------ workflows/lr_somatic.nf | 2 +- 3 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 subworkflows/local/run_minimap2_align.nf diff --git a/conf/modules.config b/conf/modules.config index a43d5907..cf48df85 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -27,33 +27,11 @@ process { ] } -<<<<<<< HEAD withName: '.*:MINIMAP2_ALIGN' { ext.args = { [ "$meta.method == 'pb'" ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-lr:hq" ), -======= - withName: '.*:MINIMAP2_ALIGN_PB' { - ext.prefix = { "${meta.id}_mapped" } - ext.args = { - [ - params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , - params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " - ].join(' ').trim() - } - ext.args4 = "-T '*'" - publishDir = [ - enabled: false - ] - } - - withName: '.*:MINIMAP2_ALIGN_ONT' { - ext.prefix = { "${meta.id}_mapped" } - ext.args = { - [ - params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-ont", ->>>>>>> 95a04dce801d24deb9fb0e452bbd016c18dc7cfa params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " ].join(' ').trim() } diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf deleted file mode 100644 index e5061fff..00000000 --- a/subworkflows/local/run_minimap2_align.nf +++ /dev/null @@ -1,61 +0,0 @@ -// -// Run minimap2 on tumour (and normal) ubams -// - -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_PB } from '../../modules/nf-core/minimap2/align/main' -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/minimap2/align/main' - -workflow RUN_MINIMAP2_ALIGN { - take: - ch_ubams // channel: val(meta), [ bam ] - ch_minimap_index - - - main: - ch_versions = Channel.empty() - - // Split the channel into pacbio and ont - ch_split = ch_ubams - .branch { meta, bam -> - ont: meta.method == 'ont' - pb: meta.method == 'pb' - } - - // Run minimap2 on PacBio samples - MINIMAP2_ALIGN_PB ( - ch_split.pb, - ch_minimap_index, - true, - 'bai', - "", - "" - ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) - ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam - ch_index_pb = MINIMAP2_ALIGN_PB.out.index - - - // Run minimap2 on ONT samples - MINIMAP2_ALIGN_ONT ( - ch_split.ont, - ch_minimap_index, - true, - 'bai', - "", - "" - ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) - ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam - ch_index_ont = MINIMAP2_ALIGN_ONT.out.index - - // Mix back in together - ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) - ch_index = ch_index_pb.mix(ch_index_ont) - - emit: - aligned = ch_aligned - index = ch_index - versions = ch_versions -} diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index b6213384..789b2f74 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -120,7 +120,7 @@ workflow LR_SOMATIC { // SUBWORKFLOW: BAM_STATS_SAMTOOLS // BAM_STATS_SAMTOOLS ( - ch_minimap_bam.join(RUN_MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel ch_fasta ) From 9be5d4f53e9ac29febc01084b4f9364c40df913f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:35:01 +0100 Subject: [PATCH 097/557] resolved conflict --- workflows/lr_somatic.nf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 789b2f74..00f0a9c1 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -20,11 +20,7 @@ include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' // IMPORT SUBWORKFLOWS // include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' -<<<<<<< HEAD -======= -include { RUN_MINIMAP2_ALIGN } from '../subworkflows/local/run_minimap2_align' include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' ->>>>>>> 95a04dce801d24deb9fb0e452bbd016c18dc7cfa /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 0daa77a297a7b770014347bb1817e25d93c36a92 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:36:19 +0100 Subject: [PATCH 098/557] readded naming fix --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index cf48df85..66b4aa13 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,6 +28,7 @@ process { } withName: '.*:MINIMAP2_ALIGN' { + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ "$meta.method == 'pb'" ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : From 0f9ea5c4c0ca8b5fbac607a833ded831c5ee9bf7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:47:56 +0100 Subject: [PATCH 099/557] flipped save secondary alignments --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 66b4aa13..beca5f8f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -32,8 +32,8 @@ process { ext.args = { [ "$meta.method == 'pb'" ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : - ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-lr:hq" ), - params.save_secondary_alignment == false ? "--secondary=no " : "--secondary=yes " + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-lr:hq " ), + params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() } ext.args4 = "-T '*'" From 4a4570b5994913c8cef5e1bcfec74beb441a049d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:49:11 +0100 Subject: [PATCH 100/557] restructured minimap2, removed subworkflow added one process --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 00f0a9c1..fc809f7e 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -170,7 +170,6 @@ workflow LR_SOMATIC { ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files.view() MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), From a924a0992cff75431fd335aceb6eda8ea45718c7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 11:50:14 +0100 Subject: [PATCH 101/557] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9942498..e898f113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ ### `Fixed` - New channel structure - No longer possible to have duplicated naming after samtools cat +- restructured minimap2 ### `Dependencies` From 27127bb645ea8408009a39708af7c295573ea096 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 13:38:41 +0100 Subject: [PATCH 102/557] restructured output dirs --- conf/modules.config | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index beca5f8f..6febe2d9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -45,7 +45,7 @@ process { withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' publishDir = [ - path: { "${params.outdir}/qc/cramino_ubam" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_ubam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -53,7 +53,7 @@ process { withName: '.*:CRAMINO_POST' { publishDir = [ - path: { "${params.outdir}/qc/cramino_aln" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -61,7 +61,7 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ - path: { "${params.outdir}/methylation/modkit_pileup" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -70,7 +70,7 @@ process { withName: '.*:FIBERTOOLSRS_QC' { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/fibertoolsrs" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -78,7 +78,7 @@ process { withName: '.*:MOSDEPTH' { publishDir = [ - path: { "${params.outdir}/qc/mosdepth" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/mosdepth" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -92,7 +92,7 @@ process { ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -101,7 +101,7 @@ process { withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ - path: { "${params.outdir}/variants/severus" }, + path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -119,7 +119,7 @@ process { withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -128,7 +128,7 @@ process { withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ - path: { "${params.outdir}/variants/clairsto" }, + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From e71a7d182ffd8e9a72b012bc49cebc774b06a93d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 14:10:10 +0100 Subject: [PATCH 103/557] quick fix to minimap2 ext args --- conf/modules.config | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6febe2d9..0b6836b8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -31,8 +31,8 @@ process { ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - "$meta.method == 'pb'" ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : - ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax map-lr:hq " ), + meta.method == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() } @@ -45,7 +45,7 @@ process { withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_ubam" }, + path: { "${params.outdir}/qc/cramino_ubam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -53,7 +53,7 @@ process { withName: '.*:CRAMINO_POST' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_aln" }, + path: { "${params.outdir}/qc/cramino_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -61,7 +61,7 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/modkit_pileup" }, + path: { "${params.outdir}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -70,7 +70,7 @@ process { withName: '.*:FIBERTOOLSRS_QC' { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/fibertoolsrs" }, + path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -78,7 +78,7 @@ process { withName: '.*:MOSDEPTH' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/mosdepth" }, + path: { "${params.outdir}/qc/mosdepth" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -92,7 +92,7 @@ process { ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, + path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -101,7 +101,7 @@ process { withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/severus" }, + path: { "${params.outdir}/variants/severus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -119,7 +119,7 @@ process { withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, + path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -128,7 +128,7 @@ process { withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/clairsto" }, + path: { "${params.outdir}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From a0ad44ccf7be679b2d6bd47a6248115b620e8574 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 7 Feb 2025 15:04:49 +0100 Subject: [PATCH 104/557] changed output paths --- conf/modules.config | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0b6836b8..98a541ea 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -45,7 +45,7 @@ process { withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' publishDir = [ - path: { "${params.outdir}/qc/cramino_ubam" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_ubam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -53,7 +53,7 @@ process { withName: '.*:CRAMINO_POST' { publishDir = [ - path: { "${params.outdir}/qc/cramino_aln" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -61,7 +61,7 @@ process { withName: '.*:MODKIT_PILEUP' { publishDir = [ - path: { "${params.outdir}/methylation/modkit_pileup" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -70,7 +70,7 @@ process { withName: '.*:FIBERTOOLSRS_QC' { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/qc" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/fibertoolsrs" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -78,7 +78,7 @@ process { withName: '.*:MOSDEPTH' { publishDir = [ - path: { "${params.outdir}/qc/mosdepth" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/mosdepth" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -92,7 +92,7 @@ process { ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/predictm6a" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -101,7 +101,7 @@ process { withName: '.*:SEVERUS' { ext.args = '--min-support 3' publishDir = [ - path: { "${params.outdir}/variants/severus" }, + path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -119,7 +119,7 @@ process { withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ - path: { "${params.outdir}/methylation/fibertoolsrs/fire" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -128,7 +128,7 @@ process { withName: '.*:CLAIRSTO_ont' { ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} publishDir = [ - path: { "${params.outdir}/variants/clairsto" }, + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 03bd11acbd30e12d4b27d16268841d018dbb970f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 7 Feb 2025 15:24:15 +0100 Subject: [PATCH 105/557] changes samplesheet to include specs --- assets/samplesheet.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index ceecd0db..62229825 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ sample,bam_tumor,bam_normal,method,specs -sample1,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,ont,R10 +sample1,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,ont,R10_5k sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,pb,NA -sample3,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,,ont,R10 +sample3,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,,ont,R10_4k sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19_rep2.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19_rep2.bam,pb,NA From 64e0dae1e304afcfdf726b33719b860762218040 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 7 Feb 2025 15:26:32 +0100 Subject: [PATCH 106/557] Makes Clairsto work properly --- conf/modules.config | 14 ++---- modules/local/clairsto/main.nf | 59 +++++------------------- subworkflows/local/run_clair.nf | 0 subworkflows/local/run_minimap2_align.nf | 7 ++- workflows/lr_somatic.nf | 10 ++++ 5 files changed, 30 insertions(+), 60 deletions(-) create mode 100644 subworkflows/local/run_clair.nf diff --git a/conf/modules.config b/conf/modules.config index f18c78d3..a1568b1c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,6 +28,7 @@ process { } withName: '.*:MINIMAP2_ALIGN_PB' { + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" , @@ -118,15 +119,6 @@ process { ] } - withName: '.*:CLAIRSTO_revio' { - ext.args = { "--platform hifi_revio"} - publishDir = [ - path: { "${params.outdir}/variants/clairsto" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args publishDir = [ @@ -136,8 +128,8 @@ process { ] } - withName: '.*:CLAIRSTO_ont' { - ext.args = { "--platform ont_r10_dorado_sup_5khz_ssrs"} + withName: '.*:CLAIRSTO' { + ext.args = {meta.method == 'pb' ? "${meta.method}" : "${meta.specs}"} publishDir = [ path: { "${params.outdir}/variants/clairsto" }, mode: params.publish_dir_mode, diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index e300ffcc..61926847 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -35,15 +35,14 @@ process CLAIRSTO { // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf // TODO nf-core: Where applicable please provide/convert compressed files as input/output // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(tumour_bam) - path(ref) - val specs - val method + tuple val(meta), path(tumor_bam), path(tumor_bai) + tuple val(meta2), path(ref) + tuple val(meta3), path(ref_index) output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*_somatic.vcf.gz"), emit: somatic_vcf - tuple val(meta), path("*_germline.vcf.gz"), emit: germline_vcf + tuple val(meta), path("*snv.vcf.gz"), emit: somatic_vcf + tuple val(meta), path("*indel.vcf.gz"), emit: germline_vcf // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions @@ -51,7 +50,7 @@ process CLAIRSTO { task.ext.when == null || task.ext.when script: - def output_dir = "${meta.id}_clairs_output" + def method = task.ext.args ?: '' // Contains ClairS-TO models appropriate for specs in the schema def platformMap = [ @@ -61,19 +60,13 @@ process CLAIRSTO { 'R10_5k': 'ont_r10_dorado_sup_5khz_ssrs' ] - def platform = (params.method == 'pb') ? 'pb' : platformMap.get(params.specs) + // if method meta data is pb, default to the revio model else go to the map + def platform = (method == 'pb') ? 'hifi_revio_ssrs' : platformMap.get(method.toString().trim(), method) - if (specs in ['R9_4k', 'R10_4k','R9_5k']) { - log.warn "Warning: ClairS-TO has no appropriate models for ${params.specs} defaulting to ${platform}" + if (method.toString().trim() in ['R9_4k','R9_5k']) { + log.warn "Warning: ClairS-TO has no appropriate models for ${method} defaulting to ${platform}" } - def SNV_VCFGZ="${output_dir}/snv.vcf.gz" - def INDEL_VCFGZ="${output_dir}/indel.vcf.gz" - def SNV_VCF="${output_dir}/snv.vcf" - def INDEL_VCF="${output_dir}/indel.vcf" - def SOMATIC_VCF="${output_dir}/somatic.vcf" - def NONSOMATIC_VCF="${output_dir}/germline.vcf" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 // If the software is unable to output a version number on the command-line then it can be manually specified // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf @@ -85,43 +78,15 @@ process CLAIRSTO { // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ /opt/bin/run_clairs_to \\ - --tumor_bam_fn \\ + --tumor_bam_fn ${tumor_bam} \\ --ref_fn ${ref} \\ --threads ${task.cpus} \\ --platform ${platform} \\ - --output_dir ${output_dir} \\ - --use_heterozygous_snp_in_normal_sample_and_normal_bam_for_intermediate_phasing True \\ --remove_intermediate_dir \\ + --output_dir . \\ --use_longphase_for_intermediate_phasing True \\ --use_longphase_for_intermediate_haplotagging True \\ --conda_prefix /opt/micromamba/envs/clairs-to - - # Unzip ;) - gunzip $SNV_VCFGZ $INDEL_VCFGZ - - # Extract header from snv.vcf (lines starting with '##' or the first line starting with '#') - awk '/^##/ {print} /^#CHROM/ {print; exit}' "$SNV_VCF" > header.vcf - - # Extract data (excluding headers) from both files - awk '!/^#/' "$SNV_VCF" > snv_data.tmp - awk '!/^#/' "$INDEL_VCF" > indel_data.tmp - - # Combine data - cat snv_data.tmp indel_data.tmp > combined_data.tmp - - # Split into somatic and non-somatic files based on 7th column containing "NonSomatic" - awk '$7 ~ /NonSomatic/' combined_data.tmp > nonsomatic_data.tmp - awk '$7 !~ /NonSomatic/' combined_data.tmp > somatic_data.tmp - - # Add header to output files - cat header.vcf nonsomatic_data.tmp > "$NONSOMATIC_VCF" - cat header.vcf somatic_data.tmp > "$SOMATIC_VCF" - - # Cleanup temporary files - rm header.vcf snv_data.tmp indel_data.tmp combined_data.tmp nonsomatic_data.tmp somatic_data.tmp - - # Zip the resulting files - gzip $NONSOMATIC_VCF $SOMATIC_VCF cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/run_clair.nf b/subworkflows/local/run_clair.nf new file mode 100644 index 00000000..e69de29b diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf index cd288925..df949d17 100644 --- a/subworkflows/local/run_minimap2_align.nf +++ b/subworkflows/local/run_minimap2_align.nf @@ -34,6 +34,7 @@ workflow RUN_MINIMAP2_ALIGN { ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam + ch_index_pb = MINIMAP2_ALIGN_PB.out.index // Run minimap2 on ONT samples MINIMAP2_ALIGN_ONT ( @@ -47,10 +48,11 @@ workflow RUN_MINIMAP2_ALIGN { ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam - + ch_index_ont = MINIMAP2_ALIGN_ONT.out.index + // Mix back in together ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) - + ch_index = ch_index_pb.mix(ch_index_ont) // TODO: Restructure back to normal if needed // ch_aligned is now [[meta], [bam]] // With meta consisting of [id, paired_data, method, specs, type] @@ -58,4 +60,5 @@ workflow RUN_MINIMAP2_ALIGN { emit: aligned = ch_aligned versions = ch_versions + index = ch_index } \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 49282a4e..b2e81742 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -15,6 +15,7 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { CLAIRSTO } from '../modules/local/clairsto/main' // // IMPORT SUBWORKFLOWS @@ -101,6 +102,13 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(RUN_MINIMAP2_ALIGN.out.versions) RUN_MINIMAP2_ALIGN.out.aligned .set { ch_minimap_bam } + + + CLAIRSTO ( + ch_minimap_bam.join(RUN_MINIMAP2_ALIGN.out.index), + ch_fasta, + ch_fai + ) // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together @@ -165,6 +173,8 @@ workflow LR_SOMATIC { emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] + + } /* From 42aad43e0b1f45fc1cc86ee01884efcf57a9cfce Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 7 Feb 2025 15:38:26 +0100 Subject: [PATCH 107/557] adds merge fixes --- docs/output.md | 12 ----- subworkflows/local/run_minimap2_align.nf | 64 ------------------------ 2 files changed, 76 deletions(-) delete mode 100644 subworkflows/local/run_minimap2_align.nf diff --git a/docs/output.md b/docs/output.md index 12ddd9bb..e6b76632 100644 --- a/docs/output.md +++ b/docs/output.md @@ -69,11 +69,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 28d7f81 (added some missing info in output.md and readme.md) ### ClairS-TO
@@ -87,10 +82,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - `run_clairs_to.log.bak`: a text file containing the run command
-<<<<<<< HEAD -======= ->>>>>>> 67e2bda (added some missing info in output.md and readme.md) ->>>>>>> 28d7f81 (added some missing info in output.md and readme.md) ### Severus
@@ -106,8 +97,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . ### MultiQC -<<<<<<< HEAD -=======
Output files @@ -122,7 +111,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . ->>>>>>> 28d7f81 (added some missing info in output.md and readme.md)
Output files diff --git a/subworkflows/local/run_minimap2_align.nf b/subworkflows/local/run_minimap2_align.nf deleted file mode 100644 index df949d17..00000000 --- a/subworkflows/local/run_minimap2_align.nf +++ /dev/null @@ -1,64 +0,0 @@ -// -// Run minimap2 on tumour (and normal) ubams -// - -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_PB } from '../../modules/nf-core/minimap2/align/main' -include { MINIMAP2_ALIGN as MINIMAP2_ALIGN_ONT } from '../../modules/nf-core/minimap2/align/main' - -workflow RUN_MINIMAP2_ALIGN { - take: - ch_ubams // channel: val(meta), [ bam ] - ch_minimap_index - - - main: - ch_versions = Channel.empty() - ch_aligned = Channel.empty() // Initialize ch_aligned - - // Split the channel into pacbio and ont - ch_split = ch_ubams - .branch { meta, bam -> - ont: meta.method == 'ont' - pb: meta.method == 'pb' - } - - // Run minimap2 on PacBio samples - MINIMAP2_ALIGN_PB ( - ch_split.pb, - ch_minimap_index, - true, - 'bai', - "", - "" - ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_PB.out.versions) - ch_aligned_pb = MINIMAP2_ALIGN_PB.out.bam - ch_index_pb = MINIMAP2_ALIGN_PB.out.index - - // Run minimap2 on ONT samples - MINIMAP2_ALIGN_ONT ( - ch_split.ont, - ch_minimap_index, - true, - 'bai', - "", - "" - ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN_ONT.out.versions) - ch_aligned_ont = MINIMAP2_ALIGN_ONT.out.bam - ch_index_ont = MINIMAP2_ALIGN_ONT.out.index - - // Mix back in together - ch_aligned = ch_aligned_pb.mix(ch_aligned_ont) - ch_index = ch_index_pb.mix(ch_index_ont) - // TODO: Restructure back to normal if needed - // ch_aligned is now [[meta], [bam]] - // With meta consisting of [id, paired_data, method, specs, type] - - emit: - aligned = ch_aligned - versions = ch_versions - index = ch_index -} \ No newline at end of file From ac6d4cea90df8c183ee936f2394bb41783f907bc Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Fri, 7 Feb 2025 16:28:25 +0100 Subject: [PATCH 108/557] add cramino to the main lr_somatic.nf workflow --- workflows/lr_somatic.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 410fff30..bf79977b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -16,6 +16,7 @@ include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { CLAIRSTO } from '../modules/local/clairsto/main' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' // // IMPORT SUBWORKFLOWS @@ -64,9 +65,9 @@ workflow LR_SOMATIC { // Maybe add a subworkflow with all pre-alignment QC together if there will be more than CRAMINO // // MODULE: CRAMINO - // - CRAMINO_PRE ( ) */ + CRAMINO_PRE ( ch_cat_ubams ) + // // SUBWORKFLOW: PREPARE_REFERENCE_FILES @@ -119,7 +120,7 @@ workflow LR_SOMATIC { // MODULE: CRAMINO // - //CRAMINO_POST ( ) + CRAMINO_POST ( ch_minimap_bam ) // // SUBWORKFLOW: BAM_STATS_SAMTOOLS From 4a4996a700070c9d63611c834a7d14d5e6b13ee3 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Fri, 7 Feb 2025 16:31:20 +0100 Subject: [PATCH 109/557] bump cramino to 0.16.0 --- modules/local/cramino/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index ac32e102..f5588440 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -4,8 +4,8 @@ process CRAMINO { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cramino:0.15.0--h3dc2dae_1': - 'biocontainers/cramino:0.15.0--h3dc2dae_1' }" + 'https://depot.galaxyproject.org/singularity/cramino:0.16.0--h3dc2dae_0': + 'biocontainers/cramino:0.16.0--h3dc2dae_0' }" input: tuple val(meta), path(bam) From 533dc415e1cf02924cb063f485226dfc62db74e0 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Fri, 7 Feb 2025 16:43:13 +0100 Subject: [PATCH 110/557] add versions channels cramino --- workflows/lr_somatic.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index bf79977b..f23c7ee0 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -67,6 +67,8 @@ workflow LR_SOMATIC { // MODULE: CRAMINO */ CRAMINO_PRE ( ch_cat_ubams ) + + ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) // @@ -121,6 +123,8 @@ workflow LR_SOMATIC { // CRAMINO_POST ( ch_minimap_bam ) + + ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) // // SUBWORKFLOW: BAM_STATS_SAMTOOLS From 65f08340252467da4b379ca9636c0924b81c683b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 10 Feb 2025 10:25:05 +0100 Subject: [PATCH 111/557] updated test data --- assets/samplesheet.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 62229825..d104aad5 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ sample,bam_tumor,bam_normal,method,specs -sample1,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,ont,R10_5k -sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19.bam,pb,NA -sample3,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19.bam,,ont,R10_4k -sample2,/staging/leuven/stg_00096/home/hackathon/test_data_LH/tumor_chr19_rep2.bam,/staging/leuven/stg_00096/home/hackathon/test_data_LH/normal_chr19_rep2.bam,pb,NA +sample1,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,ont,R10_5k +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb,NA +sample3,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,,ont,R10_4k +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb,NA From 2adb4c20bfaa3c40a6400df816a5b726834feeb9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 10 Feb 2025 10:27:05 +0100 Subject: [PATCH 112/557] changed clairs-to process label --- modules/local/clairsto/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 61926847..2d958655 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -17,7 +17,7 @@ process CLAIRSTO { tag "$meta.id" - label 'process_single' + label 'process_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). From 56803e21416d926f5de5c4b42dea33a4a825ddb2 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Mon, 10 Feb 2025 11:17:29 +0100 Subject: [PATCH 113/557] add mosdepth to workflow --- CHANGELOG.md | 1 + conf/modules.config | 1 + workflows/lr_somatic.nf | 17 +++++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e898f113..8a5f0bee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - samtools/cat module - samtools faidx module - bam_stats_samtools subworkflow +mosdepth added to workflow ### `Fixed` - New channel structure diff --git a/conf/modules.config b/conf/modules.config index a3a9f395..1d2ccb7a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -77,6 +77,7 @@ process { } withName: '.*:MOSDEPTH' { + ext.args = { '-n -x' } publishDir = [ path: { "${params.outdir}/${meta.id}/${meta.type}/qc/mosdepth" }, mode: params.publish_dir_mode, diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index f23c7ee0..eca7c1f3 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -17,6 +17,7 @@ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { CLAIRSTO } from '../modules/local/clairsto/main' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' // // IMPORT SUBWORKFLOWS @@ -125,6 +126,22 @@ workflow LR_SOMATIC { CRAMINO_POST ( ch_minimap_bam ) ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + + + + + // + // Module: MOSDEPTH + // + + // prepare mosdepth input channel: we need to specify compulsory path to bed as well + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index).map{ meta, bam, bai -> [meta, bam, bai, []]}.set{ch_mosdepth_in} + + MOSDEPTH ( ch_mosdepth_in, + ch_fasta ) + + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + // // SUBWORKFLOW: BAM_STATS_SAMTOOLS From 94b19c77c0481a9c32708246511f84545e3a4900 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 11 Feb 2025 10:40:32 +0100 Subject: [PATCH 114/557] install longphase/phase and longphase/tag modules --- modules.json | 16 +- .../longphase/haplotag/environment.yml | 7 + modules/nf-core/longphase/haplotag/main.nf | 66 ++++++ modules/nf-core/longphase/haplotag/meta.yml | 94 ++++++++ .../longphase/haplotag/tests/main.nf.test | 202 ++++++++++++++++++ .../haplotag/tests/main.nf.test.snap | 159 ++++++++++++++ .../longphase/haplotag/tests/nextflow.config | 5 + .../nf-core/longphase/haplotag/tests/tags.yml | 2 + .../nf-core/longphase/phase/environment.yml | 9 + modules/nf-core/longphase/phase/main.nf | 69 ++++++ modules/nf-core/longphase/phase/meta.yml | 84 ++++++++ .../longphase/phase/tests/main.nf.test | 157 ++++++++++++++ .../longphase/phase/tests/main.nf.test.snap | 134 ++++++++++++ .../longphase/phase/tests/nextflow.config | 5 + .../nf-core/longphase/phase/tests/tags.yml | 2 + 15 files changed, 1008 insertions(+), 3 deletions(-) create mode 100644 modules/nf-core/longphase/haplotag/environment.yml create mode 100644 modules/nf-core/longphase/haplotag/main.nf create mode 100644 modules/nf-core/longphase/haplotag/meta.yml create mode 100644 modules/nf-core/longphase/haplotag/tests/main.nf.test create mode 100644 modules/nf-core/longphase/haplotag/tests/main.nf.test.snap create mode 100644 modules/nf-core/longphase/haplotag/tests/nextflow.config create mode 100644 modules/nf-core/longphase/haplotag/tests/tags.yml create mode 100644 modules/nf-core/longphase/phase/environment.yml create mode 100644 modules/nf-core/longphase/phase/main.nf create mode 100644 modules/nf-core/longphase/phase/meta.yml create mode 100644 modules/nf-core/longphase/phase/tests/main.nf.test create mode 100644 modules/nf-core/longphase/phase/tests/main.nf.test.snap create mode 100644 modules/nf-core/longphase/phase/tests/nextflow.config create mode 100644 modules/nf-core/longphase/phase/tests/tags.yml diff --git a/modules.json b/modules.json index 459e2f02..631cdca5 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,16 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "longphase/haplotag": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, + "longphase/phase": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", @@ -48,17 +58,17 @@ "samtools/flagstat": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "severus": { "branch": "master", diff --git a/modules/nf-core/longphase/haplotag/environment.yml b/modules/nf-core/longphase/haplotag/environment.yml new file mode 100644 index 00000000..65c58ba3 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::longphase=1.7.3 diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf new file mode 100644 index 00000000..86ba0592 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -0,0 +1,66 @@ +process LONGPHASE_HAPLOTAG { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/longphase:1.7.3--hf5e1c6e_0': + 'biocontainers/longphase:1.7.3--hf5e1c6e_0' }" + + input: + tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + + """ + longphase \\ + haplotag \\ + $args \\ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ + --snp-file ${snps} \\ + --bam ${bam} \\ + ${sv_file} \\ + ${mod_file} + + if [ -f "${prefix}.out" ]; then + mv ${prefix}.out ${prefix}.log + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = args.contains('--cram') ? "cram" : "bam" + def log = args.contains('--log') ? "touch ${prefix}.log" : '' + """ + touch ${prefix}.${suffix} + ${log} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/longphase/haplotag/meta.yml b/modules/nf-core/longphase/haplotag/meta.yml new file mode 100644 index 00000000..d2f2ec8d --- /dev/null +++ b/modules/nf-core/longphase/haplotag/meta.yml @@ -0,0 +1,94 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "longphase_haplotag" +description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, + small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +keywords: + - haplotag + - long-read + - genomics +tools: + - "longphase": + description: "LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms." + homepage: "https://github.com/twolinin/longphase" + documentation: "https://github.com/twolinin/longphase" + tool_dev_url: "https://github.com/twolinin/longphase" + doi: "10.1093/bioinformatics/btac058" + licence: ["GPL v3"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file + pattern: "*.{bam,cram}" + - bai: + type: file + description: Index of sorted BAM/CRAM file + pattern: "*.{bai,crai,csi}" + - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" + - svs: + type: file + description: VCF file with SVs + pattern: "*.{vcf,vcf.gz}" + - mods: + type: file + description: modcall-generated VCF with modifications + pattern: "*.{vcf,vcf.gz}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fai: + type: file + description: Reference fai index + pattern: "*.fai" +output: + - bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.{bam,cram}": + type: file + description: BAM file with haplotagged reads + pattern: "*.bam" + - log: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.log": + type: file + description: Log file + pattern: "*.log" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test b/modules/nf-core/longphase/haplotag/tests/main.nf.test new file mode 100644 index 00000000..c80133c6 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test @@ -0,0 +1,202 @@ +nextflow_process { + + name "Test Process LONGPHASE_HAPLOTAG" + script "../main.nf" + process "LONGPHASE_HAPLOTAG" + + tag "modules" + tag "modules_nfcore" + tag "longphase" + tag "longphase/haplotag" + + test("[ bam, bai, snps, [], [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), + bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - log & cram") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + process.out.log, + bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getHeader()[2..5], + bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), + bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), + ).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai -stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - log & cram -stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap new file mode 100644 index 00000000..3cf35dc3 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap @@ -0,0 +1,159 @@ +{ + "[ bam, bai, snps, [], [] ], fasta, fai - log & cram -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + "bam": [ + [ + { + "id": "test" + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-08-09T09:40:30.738831707" + }, + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:chr22\tLN:40001", + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:12:34.848038423" + }, + "[ bam, bai, snps, [], [] ], fasta, fai -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-08-09T09:40:20.836809553" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + "@HD\tVN:1.6\tSO:coordinate", + "@SQ\tSN:chr22\tLN:40001", + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:39:33.50395694" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - log & cram": { + "content": [ + [ + "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + ], + [ + [ + { + "id": "test" + }, + "test.log:md5,6203f10696f4b0909f0d327c021df773" + ] + ], + [ + "@RG\tID:test\tSM:test", + "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + ], + "721264eb2824a3146b331f2532d10180" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-25T09:45:54.254102844" + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/haplotag/tests/nextflow.config b/modules/nf-core/longphase/haplotag/tests/nextflow.config new file mode 100644 index 00000000..d50498b2 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'LONGPHASE_HAPLOTAG' { + ext.args = '--log --cram' + } +} diff --git a/modules/nf-core/longphase/haplotag/tests/tags.yml b/modules/nf-core/longphase/haplotag/tests/tags.yml new file mode 100644 index 00000000..117e16a5 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/tests/tags.yml @@ -0,0 +1,2 @@ +longphase/haplotag: + - "modules/nf-core/longphase/haplotag/**" diff --git a/modules/nf-core/longphase/phase/environment.yml b/modules/nf-core/longphase/phase/environment.yml new file mode 100644 index 00000000..068a22cd --- /dev/null +++ b/modules/nf-core/longphase/phase/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::htslib=1.20 + - bioconda::longphase=1.7.3 diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf new file mode 100644 index 00000000..f121f4b6 --- /dev/null +++ b/modules/nf-core/longphase/phase/main.nf @@ -0,0 +1,69 @@ +process LONGPHASE_PHASE { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': + 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" + + input: + tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + + def bamList = [] + for (file in bam) { + bamList.add("-b") + bamList.add(file) + } + """ + longphase \\ + phase \\ + $args \\ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ + --snp-file ${snps} \\ + ${bamList.join(" ")} \\ + ${sv_file} \\ + ${mod_file} \\ + + bgzip \\ + --threads $task.cpus \\ + $args2 \\ + ${prefix}.vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | bgzip -c > ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +} diff --git a/modules/nf-core/longphase/phase/meta.yml b/modules/nf-core/longphase/phase/meta.yml new file mode 100644 index 00000000..823645d4 --- /dev/null +++ b/modules/nf-core/longphase/phase/meta.yml @@ -0,0 +1,84 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "longphase_phase" +description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, + small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +keywords: + - phase + - long-read + - genomics +tools: + - "longphase": + description: "LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms." + homepage: "https://github.com/twolinin/longphase" + documentation: "https://github.com/twolinin/longphase" + tool_dev_url: "https://github.com/twolinin/longphase" + doi: "10.1093/bioinformatics/btac058" + licence: ["GPL v3"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - bam: + type: file + description: Sorted BAM/CRAM file(s) + pattern: "*.{bam,cram}" + - bai: + type: file + description: Index of sorted BAM/CRAM file(s) + pattern: "*.{bai,crai,csi}" + - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" + - svs: + type: file + description: VCF file with SVs + pattern: "*.{vcf,vcf.gz}" + - mods: + type: file + description: modcall-generated VCF with modifications + pattern: "*.{vcf,vcf.gz}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fasta: + type: file + description: Reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'hg38' ]` + - fai: + type: file + description: Reference fai index + pattern: "*.fai" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.vcf.gz": + type: file + description: Compressed VCF file with phased variants + pattern: "*.vcf.gz" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@fellen31" +maintainers: + - "@fellen31" diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test b/modules/nf-core/longphase/phase/tests/main.nf.test new file mode 100644 index 00000000..3e303312 --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/main.nf.test @@ -0,0 +1,157 @@ +nextflow_process { + + name "Test Process LONGPHASE_PHASE" + script "../main.nf" + process "LONGPHASE_PHASE" + + tag "modules" + tag "modules_nfcore" + tag "longphase" + tag "longphase/phase" + config "./nextflow.config" + + test("[ bam, bai, snps, [], [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test2.sorted.bam.bai', checkIfExists: true) + ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("[ bam, bai, snps, [], [] ], fasta, fai - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test.snap b/modules/nf-core/longphase/phase/tests/main.nf.test.snap new file mode 100644 index 00000000..8a38c1ca --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/main.nf.test.snap @@ -0,0 +1,134 @@ +{ + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T12:14:04.269956432" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:37:16.921910004" + }, + "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-10-04T13:37:23.41768963" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-07-22T12:15:40.296227382" + } +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/tests/nextflow.config b/modules/nf-core/longphase/phase/tests/nextflow.config new file mode 100644 index 00000000..317f040a --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'LONGPHASE_PHASE' { + ext.args = '--ont' + } +} diff --git a/modules/nf-core/longphase/phase/tests/tags.yml b/modules/nf-core/longphase/phase/tests/tags.yml new file mode 100644 index 00000000..260a0d08 --- /dev/null +++ b/modules/nf-core/longphase/phase/tests/tags.yml @@ -0,0 +1,2 @@ +longphase/phase: + - "modules/nf-core/longphase/phase/**" From c2e869bbc898bfcc5b048a19941cfc45e21a7239 Mon Sep 17 00:00:00 2001 From: Alexandra Pancikova Date: Tue, 11 Feb 2025 11:01:34 +0100 Subject: [PATCH 115/557] update docs to add info on longphase --- CHANGELOG.md | 3 ++- docs/output.md | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a5f0bee..4b09d339 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - samtools/cat module - samtools faidx module - bam_stats_samtools subworkflow -mosdepth added to workflow +- mosdepth added to workflow +- add longphase/tag and longphase/phase modules ### `Fixed` - New channel structure diff --git a/docs/output.md b/docs/output.md index e6b76632..d4a8110f 100644 --- a/docs/output.md +++ b/docs/output.md @@ -22,6 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Severus](#severus) - Tool to call somatic and germline structural variants - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [Longphase](#longphase) - Phase the variants into haplotype blocks ### samtools @@ -96,6 +97,18 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . +### Longphase +
+Output files + +TODO - add description ot output file +- `longphase/` + +
+ +[Longphase](https://github.com/twolinin/longphase) isa tool to phase your input variant calls and haplotag your bam. To see more, see . + + ### MultiQC
From 6ac0d7519a2be412eed3cb088f13dff77ff3053d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 15:55:55 +0100 Subject: [PATCH 116/557] added ascat module --- modules/nf-core/ascat/environment.yml | 8 ++ modules/nf-core/ascat/main.nf | 200 ++++++++++++++++++++++++++ modules/nf-core/ascat/meta.yml | 165 +++++++++++++++++++++ 3 files changed, 373 insertions(+) create mode 100644 modules/nf-core/ascat/environment.yml create mode 100644 modules/nf-core/ascat/main.nf create mode 100644 modules/nf-core/ascat/meta.yml diff --git a/modules/nf-core/ascat/environment.yml b/modules/nf-core/ascat/environment.yml new file mode 100644 index 00000000..c5cfc59e --- /dev/null +++ b/modules/nf-core/ascat/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ascat=3.1.1 + - bioconda::cancerit-allelecount=4.3.0 diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf new file mode 100644 index 00000000..8aeb9847 --- /dev/null +++ b/modules/nf-core/ascat/main.nf @@ -0,0 +1,200 @@ +process ASCAT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': + 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" + + input: + tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) + path(allele_files) + path(loci_files) + path(bed_file) // optional + path(fasta) // optional + path(gc_file) // optional + path(rt_file) // optional + + output: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def gender = args.gender ? "$args.gender" : "NULL" + def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" + def purity = args.purity ? "$args.purity" : "NULL" + def ploidy = args.ploidy ? "$args.ploidy" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" + + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" + def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" + def min_base_qual_arg = args.min_base_qual ? ",min_base_qual = $args.min_base_qual" : "" + def min_map_qual_arg = args.min_map_qual ? ",min_map_qual = $args.min_map_qual" : "" + def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + + """ + #!/usr/bin/env Rscript + library(RColorBrewer) + library(ASCAT) + options(bitmapType='cairo') + + #build prefixes: + allele_path = normalizePath("$allele_files") + allele_prefix = paste0(allele_path, "/", "$allele_files", "_chr") + + loci_path = normalizePath("$loci_files") + loci_prefix = paste0(loci_path, "/", "$loci_files", "_chr") + + #prepare from BAM files + ascat.prepareHTS( + tumourseqfile = "$input_tumor", + normalseqfile = "$input_normal", + tumourname = paste0("$prefix", ".tumour"), + normalname = paste0("$prefix", ".normal"), + allelecounter_exe = "alleleCounter", + alleles.prefix = allele_prefix, + loci.prefix = loci_prefix, + gender = "$gender", + genomeVersion = "$genomeVersion", + nthreads = $task.cpus + $minCounts_arg + $bed_file_arg + $chrom_names_arg + $min_base_qual_arg + $min_map_qual_arg + $fasta_arg + $skip_allele_counting_tumour_arg + $skip_allele_counting_normal_arg, + seed = 42 + ) + + + #Load the data + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), + Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender" + ) + + #Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) + + # optional LogRCorrection + if("$gc_input" != "NULL") { + gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") + + if("$rt_input" != "NULL"){ + rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) + } + else { + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) + } + } + + #Segment the data + ascat.bc = ascat.aspcf(ascat.bc, seed=42) + + #Plot the segmented data + ascat.plotSegmentedData(ascat.bc) + + #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers + #If psi and rho are manually set: + if (!is.null($purity) && !is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) + } else if(!is.null($purity) && is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) + } else if(!is.null($ploidy) && is.null($purity)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) + } else { + ascat.output <- ascat.runAscat(ascat.bc, gamma=1) + } + + #Extract metrics from ASCAT profiles + QC = ascat.metrics(ascat.bc,ascat.output) + + #Write out segmented regions (including regions with one copy of each allele) + write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out CNVs in bed format + cnvs=ascat.output[["segments"]][2:6] + write.table(cnvs, file=paste0("$prefix",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) + + #Write out purity and ploidy info + summary <- tryCatch({ + matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { + # error handler picks up where error was generated + print(paste("Could not find optimal solution: ",err)) + return(matrix(c(0,0),nrow=1,ncol=2,byrow = TRUE)) + } + ) + colnames(summary) <- c("AberrantCellFraction","Ploidy") + write.table(summary, file=paste0("$prefix",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) + + write.table(QC, file=paste0("$prefix", ".metrics.txt"), sep="\t", quote=F, row.names=F) + + # version export + f <- file("versions.yml","w") + alleleCounter_version = system(paste("alleleCounter --version"), intern = T) + ascat_version = sessionInfo()\$otherPkgs\$ASCAT\$Version + writeLines(paste0('"', "$task.process", '"', ":"), f) + writeLines(paste(" alleleCounter:", alleleCounter_version), f) + writeLines(paste(" ascat:", ascat_version), f) + close(f) + + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.germline.png + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.tumour.png + echo stub > ${prefix}.before_correction.test.tumour.germline.png + echo stub > ${prefix}.before_correction.test.tumour.tumour.png + echo stub > ${prefix}.cnvs.txt + echo stub > ${prefix}.metrics.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr21.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt + echo stub > ${prefix}.purityploidy.txt + echo stub > ${prefix}.segments.txt + echo stub > ${prefix}.tumour.ASPCF.png + echo stub > ${prefix}.tumour.sunrise.png + echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt + echo stub > ${prefix}.tumour_alleleFrequencies_chr22.txt + echo stub > ${prefix}.tumour_normalBAF.txt + echo stub > ${prefix}.tumour_normalLogR.txt + echo stub > ${prefix}.tumour_tumourBAF.txt + echo stub > ${prefix}.tumour_tumourLogR.txt + + echo "${task.process}:" > versions.yml + echo ' alleleCounter: 4.3.0' >> versions.yml + echo ' ascat: 3.0.0' >> versions.yml + + """ + + +} diff --git a/modules/nf-core/ascat/meta.yml b/modules/nf-core/ascat/meta.yml new file mode 100644 index 00000000..db7c9292 --- /dev/null +++ b/modules/nf-core/ascat/meta.yml @@ -0,0 +1,165 @@ +name: ascat +description: copy number profiles of tumour cells. +keywords: + - bam + - copy number + - cram +tools: + - ascat: + description: ASCAT is a method to derive copy number profiles of tumour cells, + accounting for normal cell admixture and tumour aneuploidy. ASCAT infers tumour + purity (the fraction of tumour cells) and ploidy (the amount of DNA per tumour + cell), expressed as multiples of haploid genomes from SNP array or massively + parallel sequencing data, and calculates whole-genome allele-specific copy number + profiles (the number of copies of both parental alleles for all SNP loci across + the genome). + documentation: https://github.com/VanLoo-lab/ascat/tree/master/man + tool_dev_url: https://github.com/VanLoo-lab/ascat + doi: "10.1093/bioinformatics/btaa538" + licence: ["GPL v3"] + identifier: biotools:ascat +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_normal: + type: file + description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation For + modifying chromosome notation in bam files please follow + https://josephcckuo.wordpress.com/2016/11/17/modify-chromosome-notation-in-bam-file/. + pattern: "*.{bam,cram}" + - index_normal: + type: file + description: index for normal_bam/cram + pattern: "*.{bai,crai}" + - input_tumor: + type: file + description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation + pattern: "*.{bam,cram}" + - index_tumor: + type: file + description: index for tumor_bam/cram + pattern: "*.{bai,crai}" + - - allele_files: + type: file + description: allele files for ASCAT WGS. Can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + - - loci_files: + type: file + description: loci files for ASCAT WGS. Loci files without chromosome notation + can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + Make sure the chromosome notation matches the bam/cram input files. To add + the chromosome notation to loci files (hg19/hg38) if necessary, you can run + this command `if [[ $(samtools view | head -n1 | cut -f3)\" + == *\"chr\"* ]]; then for i in {1..22} X; do sed -i 's/^/chr/' G1000_loci_hg19_chr_${i}.txt; + done; fi` + - - bed_file: + type: file + description: Bed file for ASCAT WES (optional, but recommended for WES) + - - fasta: + type: file + description: Reference fasta file (optional) + - - gc_file: + type: file + description: GC correction file (optional) - Used to do logR correction of the + tumour sample(s) with genomic GC content + - - rt_file: + type: file + description: replication timing correction file (optional, provide only in combination + with gc_file) +output: + - allelefreqs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*alleleFrequencies_chr*.txt": + type: file + description: Files containing allee frequencies per chromosome + pattern: "*{alleleFrequencies_chr*.txt}" + - bafs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*BAF.txt": + type: file + description: BAF file + - cnvs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*cnvs.txt": + type: file + description: CNV file + - logrs: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*LogR.txt": + type: file + description: LogR file + - metrics: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*metrics.txt": + type: file + description: File containing quality metrics + pattern: "*.{metrics.txt}" + - png: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*png": + type: file + description: ASCAT plots + pattern: "*.{png}" + - purityploidy: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*purityploidy.txt": + type: file + description: File with purity and ploidy data + pattern: "*.{purityploidy.txt}" + - segments: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*segments.txt": + type: file + description: File with segments data + pattern: "*.{segments.txt}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@aasNGC" + - "@lassefolkersen" + - "@FriederikeHanssen" + - "@maxulysse" + - "@SusiJo" +maintainers: + - "@aasNGC" + - "@lassefolkersen" + - "@FriederikeHanssen" + - "@maxulysse" + - "@SusiJo" From 01a631a84c4ab0fa107fbbea167b445581903db2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 15:56:08 +0100 Subject: [PATCH 117/557] added ascat module --- modules.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index 459e2f02..79c15bea 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,11 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "ascat": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] + }, "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", @@ -48,17 +53,17 @@ "samtools/flagstat": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["modules"] + "installed_by": ["bam_stats_samtools"] }, "severus": { "branch": "master", From 0c61423a6e452c1cee49c0d2d5431f5924570308 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 15:56:18 +0100 Subject: [PATCH 118/557] added ascat params --- conf/modules.config | 13 +++++++++++++ nextflow.config | 8 ++++++++ workflows/lr_somatic.nf | 15 +++++++++------ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1d2ccb7a..f93a6f3e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -126,6 +126,19 @@ process { ] } + withName : '.*:ASCAT' { + ext.args = { [ + "gender": meta.sex, + "genomeVersion": params.ascat_genome, + "purity": params.ascat_purity, + "ploidy": params.ascat_ploidy, + "minCounts": params.ascat_min_counts, + "chrom_names": meta.sex == 'XX' ? "c(1:22, 'X')" : "c(1:22, 'X', 'Y')", //TODO: Adjust this based on how we define it in samplesheet + "min_base_qual": params.ascat_min_base_qual, + "min_map_qual": params.ascat_min_map_qual + ] } + } + withName: '.*:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}" } publishDir = [ diff --git a/nextflow.config b/nextflow.config index b16dbead..a2d62901 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,6 +23,14 @@ params { minimap2_pb_model = null save_secondary_alignment = true + // ASCAT options + ascat_ploidy = null // default value for ASCAT + ascat_min_base_qual = 20 // default value for ASCAT + ascat_min_counts = 10 // default value for ASCAT + ascat_min_map_qual = 10 // default value for ASCAT long read + ascat_purity = null // default value for ASCAT + ascat_genome = "CHM13" //TODO: Probably later can replace this once igenomes gets updated + // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // MultiQC options multiqc_config = null diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index eca7c1f3..398bcaec 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -12,12 +12,15 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { CLAIRSTO } from '../modules/local/clairsto/main' -include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' -include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' -include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { CLAIRSTO } from '../modules/local/clairsto/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' + // // IMPORT SUBWORKFLOWS From ce7df2e754d82fb4f41eef76e02139253804d6ef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 16:08:52 +0100 Subject: [PATCH 119/557] added ASCAT params --- conf/modules.config | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f93a6f3e..5d3ae3c9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -126,6 +126,16 @@ process { ] } + withName: '.*:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}" } + publishDir = [ + path: { "${params.outdir}/${meta.id}/${meta.type}/qc/samtools/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + withName : '.*:ASCAT' { ext.args = { [ "gender": meta.sex, @@ -138,13 +148,4 @@ process { "min_map_qual": params.ascat_min_map_qual ] } } - - withName: '.*:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}" } - publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/samtools/" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } + \ No newline at end of file From 1a1f4de42daa474cfa7507638a06548a78ee7dc0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 16:12:30 +0100 Subject: [PATCH 120/557] added more ASCAT params --- nextflow.config | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index a2d62901..054f8555 100644 --- a/nextflow.config +++ b/nextflow.config @@ -29,8 +29,12 @@ params { ascat_min_counts = 10 // default value for ASCAT ascat_min_map_qual = 10 // default value for ASCAT long read ascat_purity = null // default value for ASCAT - ascat_genome = "CHM13" //TODO: Probably later can replace this once igenomes gets updated + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version + // and allele/loci files. For now they need to be specified + ascat_allele_files = null + ascat_loci_files = null + ascat_genome = "CHM13" // MultiQC options multiqc_config = null From 4f63b9c4daf2058463b8522a5bec07b14a4234f5 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:36:12 +0100 Subject: [PATCH 121/557] added unzip module for ascat files --- modules.json | 8 +- modules/nf-core/unzip/environment.yml | 7 ++ modules/nf-core/unzip/main.nf | 49 ++++++++++++ modules/nf-core/unzip/meta.yml | 46 +++++++++++ modules/nf-core/unzip/tests/main.nf.test | 54 +++++++++++++ modules/nf-core/unzip/tests/main.nf.test.snap | 76 +++++++++++++++++++ modules/nf-core/unzip/tests/tags.yml | 2 + 7 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/unzip/environment.yml create mode 100644 modules/nf-core/unzip/main.nf create mode 100644 modules/nf-core/unzip/meta.yml create mode 100644 modules/nf-core/unzip/tests/main.nf.test create mode 100644 modules/nf-core/unzip/tests/main.nf.test.snap create mode 100644 modules/nf-core/unzip/tests/tags.yml diff --git a/modules.json b/modules.json index 79c15bea..7a7057f9 100644 --- a/modules.json +++ b/modules.json @@ -8,7 +8,8 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/ascat/ascat.diff" }, "minimap2/align": { "branch": "master", @@ -69,6 +70,11 @@ "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", "installed_by": ["modules"] + }, + "unzip": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/unzip/environment.yml b/modules/nf-core/unzip/environment.yml new file mode 100644 index 00000000..24615895 --- /dev/null +++ b/modules/nf-core/unzip/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::p7zip=16.02 diff --git a/modules/nf-core/unzip/main.nf b/modules/nf-core/unzip/main.nf new file mode 100644 index 00000000..a0c02109 --- /dev/null +++ b/modules/nf-core/unzip/main.nf @@ -0,0 +1,49 @@ +process UNZIP { + tag "$archive" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/p7zip:16.02' : + 'biocontainers/p7zip:16.02' }" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + 7za \\ + x \\ + -o"${prefix}"/ \\ + $args \\ + $archive + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + mkdir "${prefix}" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/unzip/meta.yml b/modules/nf-core/unzip/meta.yml new file mode 100644 index 00000000..426fccb7 --- /dev/null +++ b/modules/nf-core/unzip/meta.yml @@ -0,0 +1,46 @@ +name: unzip +description: Unzip ZIP archive files +keywords: + - unzip + - decompression + - zip + - archiving +tools: + - unzip: + description: p7zip is a quick port of 7z.exe and 7za.exe (command line version + of 7zip, see www.7-zip.org) for Unix. + homepage: https://sourceforge.net/projects/p7zip/ + documentation: https://sourceforge.net/projects/p7zip/ + tool_dev_url: https://sourceforge.net/projects/p7zip" + licence: ["LGPL-2.1-or-later"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: ZIP file + pattern: "*.zip" +output: + - unzipped_archive: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}/: + type: directory + description: Directory contents of the unzipped archive + pattern: "${archive.baseName}/" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@jfy133" +maintainers: + - "@jfy133" diff --git a/modules/nf-core/unzip/tests/main.nf.test b/modules/nf-core/unzip/tests/main.nf.test new file mode 100644 index 00000000..238b68d8 --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process UNZIP" + script "../main.nf" + process "UNZIP" + + tag "modules" + tag "modules_nfcore" + tag "unzip" + + test("generic [tar] [tar_gz]") { + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("generic [tar] [tar_gz] stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/unzip/tests/main.nf.test.snap b/modules/nf-core/unzip/tests/main.nf.test.snap new file mode 100644 index 00000000..cdd2ab16 --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test.snap @@ -0,0 +1,76 @@ +{ + "generic [tar] [tar_gz] stub": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:37.11550986" + }, + "generic [tar] [tar_gz]": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:25.120242571" + } +} \ No newline at end of file diff --git a/modules/nf-core/unzip/tests/tags.yml b/modules/nf-core/unzip/tests/tags.yml new file mode 100644 index 00000000..7f5647e1 --- /dev/null +++ b/modules/nf-core/unzip/tests/tags.yml @@ -0,0 +1,2 @@ +unzip: + - "modules/nf-core/unzip/**" From 2d8aca8bfbc7a64ba7fefca949330c1f6bb7facd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:39:41 +0100 Subject: [PATCH 122/557] added ascat file prep to subworkflow --- subworkflows/local/prepare_reference_files.nf | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 05b4d6b9..0322361b 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -4,10 +4,18 @@ include { PIGZ_UNCOMPRESS as UNZIP_FASTA } from '../../modules/nf-core/pigz/uncompress/main' include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' +include { UNZIP as UNZIP_ALLELES } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_GC } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_LOCI } from '../../modules/nf-core/unzip/main' +include { UNZIP as UNZIP_RT } from '../../modules/nf-core/unzip/main' workflow PREPARE_REFERENCE_FILES { take: fasta + ascat_alleles + ascat_loci + ascat_loci_gc + ascat_loci_rt main: ch_versions = Channel.empty() @@ -24,15 +32,54 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } - + // // MODULE: Index the fasta // SAMTOOLS_FAIDX( ch_prepared_fasta, [ [:], "$projectDir/assets/dummy_file.txt" ]) ch_prepared_fai = SAMTOOLS_FAIDX.out.fai + + // + // Prepare ASCAT files + // + + // prepare ascat and controlfreec reference files + if (!ascat_alleles) allele_files = Channel.empty() + else if (ascat_alleles.endsWith(".zip")) { + UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + allele_files = UNZIP_ALLELES.out.unzipped_archive.map{ it[1] } + versions = versions.mix(UNZIP_ALLELES.out.versions) + } else allele_files = Channel.fromPath(ascat_alleles).collect() + + if (!ascat_loci) loci_files = Channel.empty() + else if (ascat_loci.endsWith(".zip")) { + UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + loci_files = UNZIP_LOCI.out.unzipped_archive.map{ it[1] } + versions = versions.mix(UNZIP_LOCI.out.versions) + } else loci_files = Channel.fromPath(ascat_loci).collect() + + if (!ascat_loci_gc) gc_file = Channel.value([]) + else if (ascat_loci_gc.endsWith(".zip")) { + UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + gc_file = UNZIP_GC.out.unzipped_archive.map{ it[1] } + versions = versions.mix(UNZIP_GC.out.versions) + } else gc_file = Channel.fromPath(ascat_loci_gc).collect() + + if (!ascat_loci_rt) rt_file = Channel.value([]) + else if (ascat_loci_rt.endsWith(".zip")) { + UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + rt_file = UNZIP_RT.out.unzipped_archive.map{ it[1] } + versions = versions.mix(UNZIP_RT.out.versions) + } else rt_file = Channel.fromPath(ascat_loci_rt).collect() emit: prepped_fasta = ch_prepared_fasta prepped_fai = ch_prepared_fai + + allele_files + loci_files + gc_file + rt_file + versions = ch_versions } \ No newline at end of file From 66aa3c63d6832ebea02444915ed4be85cb73ee5f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:40:44 +0100 Subject: [PATCH 123/557] added ascat params --- nextflow.config | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/nextflow.config b/nextflow.config index 054f8555..cd3d6513 100644 --- a/nextflow.config +++ b/nextflow.config @@ -24,17 +24,20 @@ params { save_secondary_alignment = true // ASCAT options - ascat_ploidy = null // default value for ASCAT - ascat_min_base_qual = 20 // default value for ASCAT - ascat_min_counts = 10 // default value for ASCAT - ascat_min_map_qual = 10 // default value for ASCAT long read - ascat_purity = null // default value for ASCAT + ascat_ploidy = null + ascat_min_base_qual = 20 + ascat_min_counts = 10 + ascat_min_map_qual = 10 + ascat_purity = null + ascat_longread_bins = 1000 //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version - // and allele/loci files. For now they need to be specified - ascat_allele_files = null - ascat_loci_files = null + // and allele/loci(/gc/rt) files. For now they need to be specified ascat_genome = "CHM13" + ascat_allele_files = null // Zip file with allele files + ascat_loci_files = null // Zip file with loci files + ascat_gc_files = null // Optional: most likely not needed for long read (zip file) + ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) // MultiQC options multiqc_config = null From e34126acabafff604cf2c80e8e8823bafa504b74 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:41:17 +0100 Subject: [PATCH 124/557] add ascat args --- conf/modules.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 5d3ae3c9..85e82b41 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -145,7 +145,9 @@ process { "minCounts": params.ascat_min_counts, "chrom_names": meta.sex == 'XX' ? "c(1:22, 'X')" : "c(1:22, 'X', 'Y')", //TODO: Adjust this based on how we define it in samplesheet "min_base_qual": params.ascat_min_base_qual, - "min_map_qual": params.ascat_min_map_qual + "min_map_qual": params.ascat_min_map_qual, + "longread_bins": params.ascat_longread_bins, + "allele_counter_flags": "-f 0" ] } } \ No newline at end of file From bffcfc2bb93f5a69c88c0ff4a051d145500b2987 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:41:35 +0100 Subject: [PATCH 125/557] changed ascat module and added .diff --- modules/nf-core/ascat/ascat.diff | 31 +++++++++++++++++++++++++++++++ modules/nf-core/ascat/main.nf | 8 +++++--- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 modules/nf-core/ascat/ascat.diff diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff new file mode 100644 index 00000000..dc6043aa --- /dev/null +++ b/modules/nf-core/ascat/ascat.diff @@ -0,0 +1,31 @@ +Changes in component 'nf-core/ascat' +'modules/nf-core/ascat/meta.yml' is unchanged +Changes in 'ascat/main.nf': +--- modules/nf-core/ascat/main.nf ++++ modules/nf-core/ascat/main.nf +@@ -48,7 +48,11 @@ + def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" +- ++ ++ def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" ++ def normal_name = input_normal ? ",normalname = $prefix.normal" : "" ++ def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" ++ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + """ + #!/usr/bin/env Rscript + library(RColorBrewer) +@@ -65,9 +69,7 @@ + #prepare from BAM files + ascat.prepareHTS( + tumourseqfile = "$input_tumor", +- normalseqfile = "$input_normal", + tumourname = paste0("$prefix", ".tumour"), +- normalname = paste0("$prefix", ".normal"), + allelecounter_exe = "alleleCounter", + alleles.prefix = allele_prefix, + loci.prefix = loci_prefix, + +'modules/nf-core/ascat/environment.yml' is unchanged +************************************************************ diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 8aeb9847..b7502d3c 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -48,7 +48,11 @@ process ASCAT { def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" - + + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" + def normal_name = input_normal ? ",normalname = $prefix.normal" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) @@ -65,9 +69,7 @@ process ASCAT { #prepare from BAM files ascat.prepareHTS( tumourseqfile = "$input_tumor", - normalseqfile = "$input_normal", tumourname = paste0("$prefix", ".tumour"), - normalname = paste0("$prefix", ".normal"), allelecounter_exe = "alleleCounter", alleles.prefix = allele_prefix, loci.prefix = loci_prefix, From b8d872d953f00b199126e37739a7405e06d01336 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Feb 2025 17:44:03 +0100 Subject: [PATCH 126/557] added ASCAT reference channels --- workflows/lr_somatic.nf | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 398bcaec..41a207bd 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -84,6 +84,13 @@ workflow LR_SOMATIC { ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + // ASCAT files + allele_files = PREPARE_REFERENCE_FILES.out.allele_files + loci_files = PREPARE_REFERENCE_FILES.out.loci_files + gc_file = PREPARE_REFERENCE_FILES.out.gc_file + rt_file = PREPARE_REFERENCE_FILES.out.rt_file + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) // @@ -156,6 +163,20 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + // + // MODULE: ASCAT + // + + ASCAT ( + // input channel, + params.allele_files, + params.loci_files, + [:], + [:], + [:], + [:] + ) + // // Collate and save software versions From e88367231e67d133ee747576bb2f5d1da03686f4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 21 Feb 2025 10:15:39 +0100 Subject: [PATCH 127/557] Overhauls metadata and adds Clair3 --- assets/samplesheet.csv | 10 +- assets/schema_input.json | 9 +- conf/modules.config | 15 ++- modules/local/clairsto/main.nf | 27 +++--- modules/local/metaextract/environment.yml | 7 ++ modules/local/metaextract/main.nf | 91 +++++++++++++++++++ modules/local/metaextract/meta.yml | 69 ++++++++++++++ modules/local/metaextract/tests/main.nf.test | 73 +++++++++++++++ .../utils_nfcore_lr_somatic_pipeline/main.nf | 8 +- workflows/lr_somatic.nf | 22 ++++- 10 files changed, 298 insertions(+), 33 deletions(-) create mode 100644 modules/local/metaextract/environment.yml create mode 100644 modules/local/metaextract/main.nf create mode 100644 modules/local/metaextract/meta.yml create mode 100644 modules/local/metaextract/tests/main.nf.test diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index d104aad5..c3c9854b 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ -sample,bam_tumor,bam_normal,method,specs -sample1,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,ont,R10_5k -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb,NA -sample3,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,,ont,R10_4k -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb,NA +sample,bam_tumor,bam_normal,platform +sample1,//staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted_50k.bam,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted_50k.bam,pb +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb diff --git a/assets/schema_input.json b/assets/schema_input.json index b91612db..7514df9d 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -27,17 +27,12 @@ "pattern": "^\\S+\\.bam$", "errorMessage": "Bam file of normal sample must be provided, cannot contain spaces and must have extension '.bam'" }, - "method": { + "platform": { "type": "string", "enum": ["pb", "ont"], "errorMessage": "Method must be one of the following: 'pb' or 'ont'" }, - "specs": { - "type": "string", - "enum": ["R9_4k", "R10_4k","R9_5k", "R10_5k", "NA"], - "errorMessage": "Detailed of the used sequencing technology (R9 or R10 at either 4khz or 5khz) for ont and 'NA' for pb" - } }, - "required": ["sample", "bam_tumor","method","specs"] + "required": ["sample", "bam_tumor","platform"] } } diff --git a/conf/modules.config b/conf/modules.config index 1d2ccb7a..eac0845c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -31,7 +31,7 @@ process { ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - meta.method == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() @@ -109,7 +109,7 @@ process { } withName: '.*:FIBERTOOLSRS_FIRE' { - ext.args = { params.ont_data ? "--ont" : '' } //TODO: this won't work. Need to import this module twice with different args + ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args publishDir = [ path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, @@ -118,7 +118,7 @@ process { } withName: '.*:CLAIRSTO' { - ext.args = {meta.method == 'pb' ? "${meta.method}" : "${meta.specs}"} + ext.args = { } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, @@ -134,4 +134,13 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*:METAEXTRACT' { + ext.args = { } + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/metaextract" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } +} \ No newline at end of file diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 2d958655..8a93172f 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -50,21 +50,24 @@ process CLAIRSTO { task.ext.when == null || task.ext.when script: - def method = task.ext.args ?: '' - + def platform = meta.platform // Contains ClairS-TO models appropriate for specs in the schema - def platformMap = [ - 'R9_4k': 'ont_r10_dorado_sup_4khz', - 'R10_4k': 'ont_r10_dorado_sup_4khz', - 'R9_5k': 'ont_r10_dorado_sup_5khz_ssrs', - 'R10_5k': 'ont_r10_dorado_sup_5khz_ssrs' + def modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs' ] // if method meta data is pb, default to the revio model else go to the map - def platform = (method == 'pb') ? 'hifi_revio_ssrs' : platformMap.get(method.toString().trim(), method) - - if (method.toString().trim() in ['R9_4k','R9_5k']) { - log.warn "Warning: ClairS-TO has no appropriate models for ${method} defaulting to ${platform}" + def model = (meta.basecall_model == 'hifi') ? 'hifi_revio_ssrs' : modelMap.get(meta.basecall_model.toString().trim()) + if (model.toString().trim() in modelMap.keySet() || model.toString().trim() == 'hifi') { + model = 'r1041_e82_400bps_sup_v500' + log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" + } + else { + log.info "Using ${model} model for ClairS-TO" } // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 @@ -81,7 +84,7 @@ process CLAIRSTO { --tumor_bam_fn ${tumor_bam} \\ --ref_fn ${ref} \\ --threads ${task.cpus} \\ - --platform ${platform} \\ + --platform ${model} \\ --remove_intermediate_dir \\ --output_dir . \\ --use_longphase_for_intermediate_phasing True \\ diff --git a/modules/local/metaextract/environment.yml b/modules/local/metaextract/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/metaextract/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf new file mode 100644 index 00000000..9a242627 --- /dev/null +++ b/modules/local/metaextract/main.nf @@ -0,0 +1,91 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process METAEXTRACT { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + //tuple val(meta), + //tuple path('*.csv'), path('*.json'), emit: new_meta + tuple val(meta), stdout + // TODO nf-core: List additional required output channels/values here + //path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + //def method = task.ext.args ?: '' + //def pac_flag = (meta.method == 'pb') ? 'T' : 'F' + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + if [ "$meta.method" = "ont" ]; then + basecall_model=\$(samtools view -H ${bam} | awk -F'basecall_model=' '{print \$2}' | awk '{print \$1}'| tr -d '[:space:]') + echo "\$basecall_model" + else + echo "hifi" + fi + cat <<-END_VERSIONS > versions.yml + "${task.process}": + metaextract: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + metaextract: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ +} diff --git a/modules/local/metaextract/meta.yml b/modules/local/metaextract/meta.yml new file mode 100644 index 00000000..b26bf98b --- /dev/null +++ b/modules/local/metaextract/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "metaextract" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "metaextract": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/metaextract/tests/main.nf.test b/modules/local/metaextract/tests/main.nf.test new file mode 100644 index 00000000..8cae2607 --- /dev/null +++ b/modules/local/metaextract/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test metaextract +nextflow_process { + + name "Test Process METAEXTRACT" + script "../main.nf" + process "METAEXTRACT" + + tag "modules" + tag "modules_" + tag "metaextract" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 65ead345..6666086d 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,14 +74,14 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method, specs -> + .map { meta, bam_tumor, bam_normal, method -> def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, method: method, specs: specs ] + def meta_info = meta + [ paired_data: paired_data, platform: method] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } - .groupTuple() + //.groupTuple() .map { meta, bam_tumor, bam_normal -> - [ meta, bam_tumor.flatten(), bam_normal.flatten() ] + [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } .flatMap { meta, tumor_bam, normal_bam -> def meta_tumor = meta.clone() diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index eca7c1f3..a76bfcd8 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -14,10 +14,11 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s // include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { CLAIRSTO } from '../modules/local/clairsto/main' +include { CLAIR3 } from '../modules/local/clair3/main' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { METAEXTRACT } from '../modules/local/metaextract/main' // // IMPORT SUBWORKFLOWS @@ -48,6 +49,22 @@ workflow LR_SOMATIC { // // Take channels where there are multiple bam files in the list + //tst.view() + // METAEXTRACT(ch_samplesheet) | view { message -> "I say... $message" } + basecall_meta = METAEXTRACT(ch_samplesheet) + + ch_samplesheet + .join(basecall_meta) + .map{ meta, bam, meta_ext -> + def meta_new = meta + [ basecall_model: meta_ext] + return[ meta_new, bam ] + } + .groupTuple() + .map { meta, bam -> + [ meta, bam.flatten()] + } + .view() + .set{ch_samplesheet} ch_split = ch_samplesheet .branch { meta, bam -> @@ -111,7 +128,8 @@ workflow LR_SOMATIC { .set { ch_minimap_bam } - CLAIRSTO ( + + CLAIR3 ( ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), ch_fasta, ch_fai From 3a165f9dc8598963348b6a46840c4c8e758f1ccf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 24 Feb 2025 09:42:16 +0100 Subject: [PATCH 128/557] removed some TODOs --- workflows/lr_somatic.nf | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 41a207bd..11b864d7 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -51,7 +51,6 @@ workflow LR_SOMATIC { // // Take channels where there are multiple bam files in the list - ch_split = ch_samplesheet .branch { meta, bam -> single: bam.size() == 1 @@ -64,12 +63,10 @@ workflow LR_SOMATIC { .set { ch_cat_ubams } ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions) - /* - // TODO: Add pre-alignment QC step here - // Maybe add a subworkflow with all pre-alignment QC together if there will be more than CRAMINO // // MODULE: CRAMINO - */ + // + CRAMINO_PRE ( ch_cat_ubams ) ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) @@ -128,7 +125,6 @@ workflow LR_SOMATIC { ) // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] - // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together // // MODULE: CRAMINO // From dd43bd2b532fad15277c5e78e51a29b7d5bf80b3 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 24 Feb 2025 10:11:22 +0100 Subject: [PATCH 129/557] add reminder to include input channel for ASCAT --- workflows/lr_somatic.nf | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 11b864d7..30d5fb08 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -44,7 +44,6 @@ workflow LR_SOMATIC { ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - // // MODULE: Combine bam files from the same sample @@ -71,7 +70,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) - // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // @@ -132,9 +130,6 @@ workflow LR_SOMATIC { CRAMINO_POST ( ch_minimap_bam ) ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) - - - // // Module: MOSDEPTH @@ -148,7 +143,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(MOSDEPTH.out.versions) - // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // @@ -162,7 +156,7 @@ workflow LR_SOMATIC { // // MODULE: ASCAT // - + //TODO: Reformat input channel and add that to ASCAT -- then test ASCAT ( // input channel, params.allele_files, From 3e5db460bcba87a5a6c7c4485f35ec7ef1c6bc2a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 24 Feb 2025 10:12:53 +0100 Subject: [PATCH 130/557] added wakhan module --- modules/local/wakhan/environment.yml | 7 ++ modules/local/wakhan/main.nf | 91 +++++++++++++++++++++++++ modules/local/wakhan/meta.yml | 69 +++++++++++++++++++ modules/local/wakhan/tests/main.nf.test | 73 ++++++++++++++++++++ 4 files changed, 240 insertions(+) create mode 100644 modules/local/wakhan/environment.yml create mode 100644 modules/local/wakhan/main.nf create mode 100644 modules/local/wakhan/meta.yml create mode 100644 modules/local/wakhan/tests/main.nf.test diff --git a/modules/local/wakhan/environment.yml b/modules/local/wakhan/environment.yml new file mode 100644 index 00000000..a1450d1b --- /dev/null +++ b/modules/local/wakhan/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::wakhan=0.1.1" diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf new file mode 100644 index 00000000..f0d32f91 --- /dev/null +++ b/modules/local/wakhan/main.nf @@ -0,0 +1,91 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process WAKHAN { + tag "$meta.id" + label 'process_medium' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE': + 'biocontainers/YOUR-TOOL-HERE' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + samtools \\ + sort \\ + $args \\ + -@ $task.cpus \\ + -o ${prefix}.bam \\ + -T $prefix \\ + $bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wakhan: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wakhan: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ +} diff --git a/modules/local/wakhan/meta.yml b/modules/local/wakhan/meta.yml new file mode 100644 index 00000000..0d0cc2aa --- /dev/null +++ b/modules/local/wakhan/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "wakhan" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "wakhan": + ## TODO nf-core: Add a description and other details for the software below + description: "A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads" + homepage: "None" + documentation: "None" + tool_dev_url: "None" + doi: "" + licence: ['MIT'] + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@ljwharbers" +maintainers: + - "@ljwharbers" diff --git a/modules/local/wakhan/tests/main.nf.test b/modules/local/wakhan/tests/main.nf.test new file mode 100644 index 00000000..e483da03 --- /dev/null +++ b/modules/local/wakhan/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test wakhan +nextflow_process { + + name "Test Process WAKHAN" + script "../main.nf" + process "WAKHAN" + + tag "modules" + tag "modules_" + tag "wakhan" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} From 02301454a9555f9188c1c074a4f90ba0fd21d6a0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Feb 2025 10:16:37 +0100 Subject: [PATCH 131/557] adds phasing and haplotagging --- conf/modules.config | 8 ++ modules/local/clair3/environment.yml | 7 + modules/local/clair3/main.nf | 116 +++++++++++++++++ modules/local/clair3/meta.yml | 69 ++++++++++ modules/local/clair3/tests/main.nf.test | 73 +++++++++++ subworkflows/local/run_clair.nf | 11 ++ subworkflows/local/run_clair3.nf | 0 workflows/lr_somatic.nf | 162 +++++++++++++++++++++++- 8 files changed, 440 insertions(+), 6 deletions(-) create mode 100644 modules/local/clair3/environment.yml create mode 100644 modules/local/clair3/main.nf create mode 100644 modules/local/clair3/meta.yml create mode 100644 modules/local/clair3/tests/main.nf.test create mode 100644 subworkflows/local/run_clair3.nf diff --git a/conf/modules.config b/conf/modules.config index eac0845c..8c7cc870 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -143,4 +143,12 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:LONGPHASE_PHASE' { + ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/longphase_phase" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } \ No newline at end of file diff --git a/modules/local/clair3/environment.yml b/modules/local/clair3/environment.yml new file mode 100644 index 00000000..e1a7b846 --- /dev/null +++ b/modules/local/clair3/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::clair3=1.0.10" diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf new file mode 100644 index 00000000..49e682a9 --- /dev/null +++ b/modules/local/clair3/main.nf @@ -0,0 +1,116 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process CLAIR3 { + tag "$meta.id" + label 'process_high' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker://hkubal/clair3:v1.0.10': + 'hkubal/clair3:v1.0.10' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam), path(bam_bai) + tuple val(meta2), path(ref) + tuple val(meta3), path(ref_index) + + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("merge_output.vcf.gz"), emit: germline_vcf + + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + ] + def model = (meta.basecall_model.toString().trim() == 'hifi') ? 'hifi' : modelMap.get(meta.basecall_model.toString().trim()) + def platform = (meta.platform == "pb")? "hifi" : "ont" + + if (model.toString().trim() in modelMap.keySet() || model.toString().trim() == 'pb') { + model = 'r1041_e82_400bps_sup_v500' + log.warn "Warning: ClairS-TO has no appropriate models for ${method} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" + } + else { + log.info "Using ${model} model for Clair3" + } + + + + + + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + /opt/bin/run_clair3.sh \\ + --bam_fn=${bam} \\ + --ref_fn=${ref} \\ + --threads=${task.cpus} \\ + --platform="${platform}" \\ + --model_path="/opt/models/${model}" \\ + --use_longphase_for_intermediate_phasing \\ + --output . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clair3: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clair3: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ +} diff --git a/modules/local/clair3/meta.yml b/modules/local/clair3/meta.yml new file mode 100644 index 00000000..99457104 --- /dev/null +++ b/modules/local/clair3/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clair3" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "clair3": + ## TODO nf-core: Add a description and other details for the software below + description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≤30-fold of ONT data (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment as input for deep-learning based long-read small variant calling. Clair3 is simple and modular for easy deployment and integration." + homepage: "None" + documentation: "None" + tool_dev_url: "None" + doi: "" + licence: ['BSD-3-clause'] + identifier: biotools:clair3 + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/clair3/tests/main.nf.test b/modules/local/clair3/tests/main.nf.test new file mode 100644 index 00000000..72e44827 --- /dev/null +++ b/modules/local/clair3/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test clair3 +nextflow_process { + + name "Test Process CLAIR3" + script "../main.nf" + process "CLAIR3" + + tag "modules" + tag "modules_" + tag "clair3" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/subworkflows/local/run_clair.nf b/subworkflows/local/run_clair.nf index e69de29b..801d8809 100644 --- a/subworkflows/local/run_clair.nf +++ b/subworkflows/local/run_clair.nf @@ -0,0 +1,11 @@ +include { CLAIRSTO } from '../modules/local/clairsto/main' +include { CLAIRS } from '../modules/local/clairs/main' + +workflow RUN_SOMATIC_CLAIR { + take: + ch_bams + + main: + + +} \ No newline at end of file diff --git a/subworkflows/local/run_clair3.nf b/subworkflows/local/run_clair3.nf new file mode 100644 index 00000000..e69de29b diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index a76bfcd8..88da7727 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -12,9 +12,14 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { CLAIR3 } from '../modules/local/clair3/main' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { CLAIR3 } from '../modules/local/clair3/main' +include { LONGPHASE_PHASE } from '../modules/nf-core/longphase/phase/main' +include { LONGPHASE_HAPLOTAG } from '../modules/nf-core/longphase/haplotag/main' +include { SEVERUS } from '../modules/nf-core/longphase/haplotag/main' + + include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' @@ -49,7 +54,6 @@ workflow LR_SOMATIC { // // Take channels where there are multiple bam files in the list - //tst.view() // METAEXTRACT(ch_samplesheet) | view { message -> "I say... $message" } basecall_meta = METAEXTRACT(ch_samplesheet) @@ -63,7 +67,6 @@ workflow LR_SOMATIC { .map { meta, bam -> [ meta, bam.flatten()] } - .view() .set{ch_samplesheet} ch_split = ch_samplesheet @@ -127,13 +130,160 @@ workflow LR_SOMATIC { MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } + + // Need to join the tumor and normal information back together + // since both bams need to be phased on the normal clair3 output + // if it exists + ch_minimap_bam + .join(MINIMAP2_ALIGN.out.index) + .map{ meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model + ] + def bam_check = bam ? bam : [] + return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai]] + } + .groupTuple() + .branch {meta, bams, bais -> + paired: meta.paired_data + tumor_only : !meta.paired_data + } + .set{reformat_samples} + + // for the paired samples, only send the normal to CLAIR3 + reformat_samples.paired + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + return [meta, normal_bam, normal_bai] + } + .set{clair3_reformat_paired} + // for the tumor only, send the tumor sample to CLAIR3 + reformat_samples.tumor_only + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, tumor_bam, tumor_bai] + } + .mix(clair3_reformat_paired) + .set{clair3_reformat_samples} + // FORMAT IS [ meta, normal_bam, normal_bai] + // (except if its tumor only) CLAIR3 ( - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), + clair3_reformat_samples, + ch_fasta, + ch_fai + ) + + // Now we need to join the germline snps to the tumor and normal samples + reformat_samples.paired + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + + return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] + } + .set{paired_samples} + + reformat_samples.tumor_only + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, [], tumor_bam, [], tumor_bai] + } + .mix(paired_samples) + .join(CLAIR3.out.germline_vcf) + .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, germline_vcf -> + def meta_tumor = meta.clone() + meta_tumor.type = 'tumor' + def result = [[meta_tumor, tumor_bam, tumor_bai, germline_vcf]] + + if (normal_bam) { + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam, normal_bai, germline_vcf] + } + return result + } + .map{ meta, bam, bai, snps -> + def snvs = [] + def mods = [] + return [ meta, bam, bai, snps, snvs, mods] + } + .set{longphase_reformat} + // FORMAT IS [ meta, bam, bai, snps, [], [] ] + + LONGPHASE_PHASE( + longphase_reformat, ch_fasta, ch_fai ) + + longphase_reformat + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, bam, bai, snps, snvs, mods, phased_snps -> + return[meta, bam, bai,phased_snps, snvs, mods] + } + .set{longphase_reformat} + // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] + + LONGPHASE_HAPLOTAG( + longphase_reformat, + ch_fasta, + ch_fai + ) + + longphase_reformat + .join(LONGPHASE_HAPLOTAG.out.bam) + .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam-> + return[meta, hap_bam, bai, phased_snps] + } + .map{ meta, hap_bam, bai, vcf -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model + ] + def bam_check = hap_bam ? hap_bam : [] + return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai], vcf] + } + .groupTuple() + .branch {meta, bams, bais, vcf-> + paired: meta.paired_data + tumor_only : !meta.paired_data + } + .set{severus_reformat} + + severus_reformat.paired + .map { meta, bams, bais, vcf -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + + return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf ] + } + .set{paired_samples} + + severus_reformat.tumor_only + .map{meta, bam, bai, vcf-> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta,tumor_bam, tumor_bai, [], [], vcf] + } + .mix(paired_samples) + .set{severus_reformat} + // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + + + + // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] // TODO: Add post-alignment QC step here, maybe add a subworkflow with all post-alignment QC together From 2684ae2241e6a9dd050b620437e23d04c59e6962 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 24 Feb 2025 13:10:18 +0100 Subject: [PATCH 132/557] added wakhan params and config settings --- conf/modules.config | 13 ++++++++++++- nextflow.config | 7 +++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 85e82b41..ddcc9863 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -139,7 +139,7 @@ process { withName : '.*:ASCAT' { ext.args = { [ "gender": meta.sex, - "genomeVersion": params.ascat_genome, + "genomeVersion": params.genome_name, "purity": params.ascat_purity, "ploidy": params.ascat_ploidy, "minCounts": params.ascat_min_counts, @@ -150,4 +150,15 @@ process { "allele_counter_flags": "-f 0" ] } } + + withName : '.*:WAKHAN' { + ext.args = { + [ + "--genome-name ${meta.id}", + "--out-dir-plots ./", + "--centromere ${params.centromere}", + "--genome-name ${params.genome_name}" + ].join(' ').trim() + } + } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index cd3d6513..26dba315 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,12 +33,15 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - ascat_genome = "CHM13" + genome_name = "CHM13" ascat_allele_files = null // Zip file with allele files ascat_loci_files = null // Zip file with loci files ascat_gc_files = null // Optional: most likely not needed for long read (zip file) ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) - + + // WAKHAN options + centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" + // MultiQC options multiqc_config = null multiqc_title = null From 9873d0af84382b69583ed93373cefc198276f809 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Feb 2025 13:33:00 +0100 Subject: [PATCH 133/557] Adds Severus SV calling --- conf/test.config | 4 + modules.json | 5 + .../nf-core/samtools/index/environment.yml | 8 + modules/nf-core/samtools/index/main.nf | 49 ++++ modules/nf-core/samtools/index/meta.yml | 71 +++++ .../samtools/index/tests/csi.nextflow.config | 7 + .../nf-core/samtools/index/tests/main.nf.test | 140 ++++++++++ .../samtools/index/tests/main.nf.test.snap | 250 ++++++++++++++++++ modules/nf-core/samtools/index/tests/tags.yml | 2 + modules/nf-core/severus/main.nf | 4 +- nextflow.config | 3 + workflows/lr_somatic.nf | 93 +++++-- 12 files changed, 608 insertions(+), 28 deletions(-) create mode 100644 modules/nf-core/samtools/index/environment.yml create mode 100644 modules/nf-core/samtools/index/main.nf create mode 100644 modules/nf-core/samtools/index/meta.yml create mode 100644 modules/nf-core/samtools/index/tests/csi.nextflow.config create mode 100644 modules/nf-core/samtools/index/tests/main.nf.test create mode 100644 modules/nf-core/samtools/index/tests/main.nf.test.snap create mode 100644 modules/nf-core/samtools/index/tests/tags.yml diff --git a/conf/test.config b/conf/test.config index b9d44c91..b3fd7799 100644 --- a/conf/test.config +++ b/conf/test.config @@ -29,4 +29,8 @@ params { input ="$projectDir/assets/samplesheet.csv" // Genome references fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" + pon_file = "/staging/leuven/stg_00096/home/hackathon/PoN_1000G_chm13.tsv.gz" + bed_file = "/staging/leuven/stg_00096/home/hackathon/chm13.bed" + //PON_file = "https://github.com/KolmogorovLab/Severus/raw/main/pon/PoN_1000G_chm13.tsv.gz" + //bed_file = "https://github.com/KolmogorovLab/Severus/raw/main/vntrs/chm13.bed" } diff --git a/modules.json b/modules.json index 631cdca5..57beae5a 100644 --- a/modules.json +++ b/modules.json @@ -65,6 +65,11 @@ "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", "installed_by": ["bam_stats_samtools"] }, + "samtools/index": { + "branch": "master", + "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", + "installed_by": ["modules"] + }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 00000000..62054fc9 --- /dev/null +++ b/modules/nf-core/samtools/index/environment.yml @@ -0,0 +1,8 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf new file mode 100644 index 00000000..31175610 --- /dev/null +++ b/modules/nf-core/samtools/index/main.nf @@ -0,0 +1,49 @@ +process SAMTOOLS_INDEX { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : + 'biocontainers/samtools:1.21--h50ea8bc_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + samtools \\ + index \\ + -@ ${task.cpus-1} \\ + $args \\ + $input + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def extension = file(input).getExtension() == 'cram' ? + "crai" : args.contains("-c") ? "csi" : "bai" + """ + touch ${input}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml new file mode 100644 index 00000000..db8df0d5 --- /dev/null +++ b/modules/nf-core/samtools/index/meta.yml @@ -0,0 +1,71 @@ +name: samtools_index +description: Index SAM/BAM/CRAM file +keywords: + - index + - bam + - sam + - cram +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:samtools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: input file +output: + - bai: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bai": + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: CSI index file + pattern: "*.{csi}" + - crai: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.crai": + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@ewels" + - "@maxulysse" +maintainers: + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/samtools/index/tests/csi.nextflow.config b/modules/nf-core/samtools/index/tests/csi.nextflow.config new file mode 100644 index 00000000..0ed260ef --- /dev/null +++ b/modules/nf-core/samtools/index/tests/csi.nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_INDEX { + ext.args = '-c' + } + +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test b/modules/nf-core/samtools/index/tests/main.nf.test new file mode 100644 index 00000000..ca34fb5c --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,140 @@ +nextflow_process { + + name "Test Process SAMTOOLS_INDEX" + script "../main.nf" + process "SAMTOOLS_INDEX" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/index" + + test("bai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai") { + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi") { + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + file(process.out.csi[0][1]).name, + process.out.versions + ).match() } + ) + } + } + + test("bai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("crai - stub") { + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("csi - stub") { + options "-stub" + config "./csi.nextflow.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap new file mode 100644 index 00000000..72d65e81 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,250 @@ +{ + "csi - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + + ], + "csi": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:25.261127166" + }, + "crai - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:12.653194876" + }, + "bai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:21:01.854932651" + }, + "csi": { + "content": [ + "test.paired_end.sorted.bam.csi", + [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:51.485364222" + }, + "crai": { + "content": [ + { + "0": [ + + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:40.518873972" + }, + "bai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ], + "bai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], + "crai": [ + + ], + "csi": [ + + ], + "versions": [ + "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-16T08:20:21.184050361" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/tests/tags.yml b/modules/nf-core/samtools/index/tests/tags.yml new file mode 100644 index 00000000..e0f58a7a --- /dev/null +++ b/modules/nf-core/samtools/index/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/index: + - modules/nf-core/samtools/index/** diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 171fcb84..d8f33834 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -9,7 +9,7 @@ process SEVERUS { input: tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) - tuple val(meta2), path(bed) + tuple val(meta2), path(bed), path(pon_path) output: tuple val(meta), path("${prefix}/severus.log") , emit: log @@ -39,12 +39,14 @@ process SEVERUS { def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" + def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" """ severus \\ $args \\ --threads $task.cpus \\ --target-bam $target_input \\ $vntr_bed \\ + $pon \\ $control \\ $phasing_vcf \\ --out-dir ${prefix} diff --git a/nextflow.config b/nextflow.config index b16dbead..31d1d7e6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,6 +23,9 @@ params { minimap2_pb_model = null save_secondary_alignment = true + // Severus options + pon_file = null + bed_file = null // MultiQC options multiqc_config = null diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 88da7727..2aafaabc 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -17,9 +17,7 @@ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { CLAIR3 } from '../modules/local/clair3/main' include { LONGPHASE_PHASE } from '../modules/nf-core/longphase/phase/main' include { LONGPHASE_HAPLOTAG } from '../modules/nf-core/longphase/haplotag/main' -include { SEVERUS } from '../modules/nf-core/longphase/haplotag/main' - - +include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE; CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' @@ -30,6 +28,7 @@ include { METAEXTRACT } from '../modules/local/metaextract/main' // include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { SAMTOOLS_INDEX } from '../modules/nf-core/samtools/index/main.nf' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -179,7 +178,23 @@ workflow LR_SOMATIC { ch_fai ) - // Now we need to join the germline snps to the tumor and normal samples + clair3_reformat_samples + .join(CLAIR3.out.germline_vcf) + .map{meta, bam, bai, snps-> + def svs = [] + def mods = [] + return[meta, bam, bai, snps, svs, mods] + } + .set{clair3_reformat_samples} + // FORMAT IS [ meta, normal_bam, normal_bai, germline_vcf] + // (except if its tumor only) + + LONGPHASE_PHASE( + clair3_reformat_samples, + ch_fasta, + ch_fai + ) + reformat_samples.paired .map { meta, bams, bais -> def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] @@ -198,16 +213,36 @@ workflow LR_SOMATIC { return [ meta, [], tumor_bam, [], tumor_bai] } .mix(paired_samples) - .join(CLAIR3.out.germline_vcf) - .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, germline_vcf -> + + // Now we need to join the germline snps to the tumor and normal samples + reformat_samples.paired + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + + return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] + } + .set{paired_samples} + + reformat_samples.tumor_only + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, [], tumor_bam, [], tumor_bai] + } + .mix(paired_samples) + .join(LONGPHASE_PHASE.out.vcf) + .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, vcf -> def meta_tumor = meta.clone() meta_tumor.type = 'tumor' - def result = [[meta_tumor, tumor_bam, tumor_bai, germline_vcf]] + def result = [[meta_tumor, tumor_bam, tumor_bai, vcf]] if (normal_bam) { def meta_normal = meta.clone() meta_normal.type = 'normal' - result << [meta_normal, normal_bam, normal_bai, germline_vcf] + result << [meta_normal, normal_bam, normal_bai, vcf] } return result } @@ -217,20 +252,6 @@ workflow LR_SOMATIC { return [ meta, bam, bai, snps, snvs, mods] } .set{longphase_reformat} - // FORMAT IS [ meta, bam, bai, snps, [], [] ] - - LONGPHASE_PHASE( - longphase_reformat, - ch_fasta, - ch_fai - ) - - longphase_reformat - .join(LONGPHASE_PHASE.out.vcf) - .map{meta, bam, bai, snps, snvs, mods, phased_snps -> - return[meta, bam, bai,phased_snps, snvs, mods] - } - .set{longphase_reformat} // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] LONGPHASE_HAPLOTAG( @@ -238,11 +259,22 @@ workflow LR_SOMATIC { ch_fasta, ch_fai ) - + LONGPHASE_HAPLOTAG.out.bam + .set{haplotagged_bams} + + SAMTOOLS_INDEX( + haplotagged_bams + ) + + haplotagged_bams + .join(SAMTOOLS_INDEX.out.bai) + .view() + .set{haplotagged_bams} + longphase_reformat - .join(LONGPHASE_HAPLOTAG.out.bam) - .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam-> - return[meta, hap_bam, bai, phased_snps] + .join(haplotagged_bams) + .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam, hap_bai-> + return[meta, hap_bam, hap_bai, phased_snps] } .map{ meta, hap_bam, bai, vcf -> def new_meta = [id: meta.id, @@ -278,11 +310,18 @@ workflow LR_SOMATIC { return [ meta,tumor_bam, tumor_bai, [], [], vcf] } .mix(paired_samples) + .view() .set{severus_reformat} // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + bed_pon = Channel.of([[:], params.bed_file, params.pon_file]) + //bed_pon = [[:], params.bed_file, params.pon_file] + //bed_pon.view() - + SEVERUS( + severus_reformat, + bed_pon + ) // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] From 6403d1be1fb2f467cb5731841608ce474d8c5b13 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 26 Feb 2025 09:46:42 +0100 Subject: [PATCH 134/557] add wakhan framework --- modules/local/wakhan/main.nf | 32 +++++++++++++++++++++----------- workflows/lr_somatic.nf | 7 +++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index f0d32f91..f7a6bae5 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -35,7 +35,8 @@ process WAKHAN { // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf // TODO nf-core: Where applicable please provide/convert compressed files as input/output // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(bam) + tuple val(meta), path(tumor_bam), path(tumor_index), path(normal_bam), path(normal_index), path(phased_vcf), path(breakpoints_vcf) + tuple val(meta2), path(reference) output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels @@ -49,6 +50,11 @@ process WAKHAN { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def paired_command = normal_bam ? "--control-bam $normal_bam --normal-phased-vcf $phased_vcf" : + "--tumor-vcf $phased_vcf" + def VERSION = '0.1.0' + // WARN: Version information not provided by tool on CLI. Please update this string when bumping version + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 // If the software is unable to output a version number on the command-line then it can be manually specified // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf @@ -59,23 +65,27 @@ process WAKHAN { // TODO nf-core: Please replace the example samtools command below with your module's command // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ - samtools \\ - sort \\ - $args \\ - -@ $task.cpus \\ - -o ${prefix}.bam \\ - -T $prefix \\ - $bam - + wakhan \\ + ${args} \\ + ${paired_command} \\ + --threads ${task.cpus} \\ + --reference ${reference} \\ + --target-bam ${tumor_bam} \\ + --breakpoints ${breakpoints_vcf} + + cat <<-END_VERSIONS > versions.yml "${task.process}": - wakhan: \$(samtools --version |& sed '1!d ; s/samtools //') + wakhan: ${VERSION} END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '0.1.0' + // WARN: Version information not provided by tool on CLI. Please update this string when bumping version + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible // Have a look at the following examples: // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 @@ -85,7 +95,7 @@ process WAKHAN { cat <<-END_VERSIONS > versions.yml "${task.process}": - wakhan: \$(samtools --version |& sed '1!d ; s/samtools //') + wakhan: ${VERSION} END_VERSIONS """ } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 30d5fb08..4ff7da28 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -167,6 +167,13 @@ workflow LR_SOMATIC { [:] ) + // + // MODULE: WAKHAN + // + WAKHAN ( + severus_reformat, + ch_fasta + ) // // Collate and save software versions From 87468aa438c3cfdd7dbdfed93a85338e97905661 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Feb 2025 13:43:06 +0100 Subject: [PATCH 135/557] fix model selection --- modules/local/clair3/main.nf | 38 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 49e682a9..24ceca43 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -57,44 +57,44 @@ process CLAIR3 { 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + 'hifi_revio' : 'hifi_revio' ] - def model = (meta.basecall_model.toString().trim() == 'hifi') ? 'hifi' : modelMap.get(meta.basecall_model.toString().trim()) - def platform = (meta.platform == "pb")? "hifi" : "ont" - - if (model.toString().trim() in modelMap.keySet() || model.toString().trim() == 'pb') { + def model = modelMap.get(meta.basecall_model.toString().trim()) + def platform = (meta.platform == "pb") ? "hifi" : "ont" + + if (!model in modelMap.keySet() ) { model = 'r1041_e82_400bps_sup_v500' - log.warn "Warning: ClairS-TO has no appropriate models for ${method} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" + log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" } else { log.info "Using ${model} model for Clair3" } - - + // Download model command + def download_prefix = ( model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + + // Specify runtype for conda vs docker/singularity + // Both the initial clair3 call and the model_path call will not work with conda + //TODO: - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + wget ${download_prefix}/${model}.tar.gz + tar -xvzf ${model}.tar.gz + /opt/bin/run_clair3.sh \\ --bam_fn=${bam} \\ --ref_fn=${ref} \\ --threads=${task.cpus} \\ --platform="${platform}" \\ - --model_path="/opt/models/${model}" \\ + --model_path="${model}" \\ --use_longphase_for_intermediate_phasing \\ --output . cat <<-END_VERSIONS > versions.yml "${task.process}": - clair3: \$(samtools --version |& sed '1!d ; s/samtools //') + clair3: \$( /opt/bin/run_clair3.sh --version |& sed 's/Clair3 v//' ) END_VERSIONS """ @@ -110,7 +110,7 @@ process CLAIR3 { cat <<-END_VERSIONS > versions.yml "${task.process}": - clair3: \$(samtools --version |& sed '1!d ; s/samtools //') + clair3: \$( /opt/bin/run_clair3.sh --version |& sed 's/Clair3 v//' ) END_VERSIONS """ } From 456f4fa4820c971a0083515e679a8af7037e784c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Feb 2025 13:43:38 +0100 Subject: [PATCH 136/557] change to hifi_revio --- modules/local/metaextract/main.nf | 62 +++++-------------------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index 9a242627..945697e5 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -1,91 +1,47 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process METAEXTRACT { tag "$meta.id" label 'process_single' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : 'biocontainers/samtools:1.21--h50ea8bc_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - //tuple val(meta), - //tuple path('*.csv'), path('*.json'), emit: new_meta - tuple val(meta), stdout - // TODO nf-core: List additional required output channels/values here - //path "versions.yml" , emit: versions + tuple val(meta), stdout , emit: basecall_model + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - //def method = task.ext.args ?: '' - //def pac_flag = (meta.method == 'pb') ? 'T' : 'F' - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + def args = task.ext.args ?: '' + def ont = meta.platform == 'ont' """ - if [ "$meta.method" = "ont" ]; then - basecall_model=\$(samtools view -H ${bam} | awk -F'basecall_model=' '{print \$2}' | awk '{print \$1}'| tr -d '[:space:]') + if [ $ont = 'true' ]; then + basecall_model=\$(samtools view -H ${bam} ${args} | awk -F'basecall_model=' '{print \$2}' | awk '{print \$1}'| tr -d '[:space:]') echo "\$basecall_model" else - echo "hifi" + echo "hifi_revio" fi cat <<-END_VERSIONS > versions.yml "${task.process}": - metaextract: \$(samtools --version |& sed '1!d ; s/samtools //') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ touch ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": - metaextract: \$(samtools --version |& sed '1!d ; s/samtools //') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } From 2641b4e4387d1207e9d88d7718365b5a001539d9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Feb 2025 13:43:57 +0100 Subject: [PATCH 137/557] added params --- assets/samplesheet.csv | 6 +- conf/test.config | 5 + modules/nf-core/longphase/haplotag/main.nf | 2 +- modules/nf-core/longphase/phase/main.nf | 2 +- nextflow.config | 8 + subworkflows/local/prepare_reference_files.nf | 8 +- workflows/lr_somatic.nf | 327 +++++++++--------- 7 files changed, 188 insertions(+), 170 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index c3c9854b..eeca239f 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ sample,bam_tumor,bam_normal,platform -sample1,//staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted_50k.bam,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted_50k.bam,pb -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb +sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19_50k.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19_50k.bam,pb +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont diff --git a/conf/test.config b/conf/test.config index b3fd7799..592892e1 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,6 +31,11 @@ params { fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" pon_file = "/staging/leuven/stg_00096/home/hackathon/PoN_1000G_chm13.tsv.gz" bed_file = "/staging/leuven/stg_00096/home/hackathon/chm13.bed" + + // ASCAT files + ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_WGS_CHM13.zip" + ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_WGS_CHM13.zip" + //PON_file = "https://github.com/KolmogorovLab/Severus/raw/main/pon/PoN_1000G_chm13.tsv.gz" //bed_file = "https://github.com/KolmogorovLab/Severus/raw/main/vntrs/chm13.bed" } diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 86ba0592..73320550 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -23,7 +23,7 @@ process LONGPHASE_HAPLOTAG { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}" def sv_file = svs ? "--sv-file ${svs}" : "" def mod_file = mods ? "--mod-file ${mods}" : "" diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index f121f4b6..8fa49a30 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -23,7 +23,7 @@ process LONGPHASE_PHASE { script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}_germline" def sv_file = svs ? "--sv-file ${svs}" : "" def mod_file = mods ? "--mod-file ${mods}" : "" diff --git a/nextflow.config b/nextflow.config index 79aa02f9..c0fc2e9a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,6 +18,13 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false + // Skip options + skip_ascat = false + skip_wakhan = false + skip_severus = false + skip_smallvariants = false + skip_fibertoolsrs_fire = false + // minimap2 options minimap2_ont_model = null minimap2_pb_model = null @@ -30,6 +37,7 @@ params { ascat_min_map_qual = 10 ascat_purity = null ascat_longread_bins = 1000 + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 0322361b..32b5980d 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -48,28 +48,28 @@ workflow PREPARE_REFERENCE_FILES { else if (ascat_alleles.endsWith(".zip")) { UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) allele_files = UNZIP_ALLELES.out.unzipped_archive.map{ it[1] } - versions = versions.mix(UNZIP_ALLELES.out.versions) + ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) } else allele_files = Channel.fromPath(ascat_alleles).collect() if (!ascat_loci) loci_files = Channel.empty() else if (ascat_loci.endsWith(".zip")) { UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) loci_files = UNZIP_LOCI.out.unzipped_archive.map{ it[1] } - versions = versions.mix(UNZIP_LOCI.out.versions) + ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) } else loci_files = Channel.fromPath(ascat_loci).collect() if (!ascat_loci_gc) gc_file = Channel.value([]) else if (ascat_loci_gc.endsWith(".zip")) { UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) gc_file = UNZIP_GC.out.unzipped_archive.map{ it[1] } - versions = versions.mix(UNZIP_GC.out.versions) + ch_versions = ch_versions.mix(UNZIP_GC.out.versions) } else gc_file = Channel.fromPath(ascat_loci_gc).collect() if (!ascat_loci_rt) rt_file = Channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) rt_file = UNZIP_RT.out.unzipped_archive.map{ it[1] } - versions = versions.mix(UNZIP_RT.out.versions) + ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = Channel.fromPath(ascat_loci_rt).collect() emit: diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 0a919091..17ffe273 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -26,6 +26,7 @@ include { LONGPHASE_HAPLOTAG } from '../modules/nf-core/longphase/haplota include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { METAEXTRACT } from '../modules/local/metaextract/main' include { SAMTOOLS_INDEX } from '../modules/nf-core/samtools/index/main.nf' +include { WAKHAN } from '../modules/local/wakhan/main' // // IMPORT SUBWORKFLOWS @@ -55,20 +56,22 @@ workflow LR_SOMATIC { // // Take channels where there are multiple bam files in the list - // METAEXTRACT(ch_samplesheet) | view { message -> "I say... $message" } - basecall_meta = METAEXTRACT(ch_samplesheet) + METAEXTRACT( ch_samplesheet ) + + basecall_meta = METAEXTRACT.out.basecall_model + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) ch_samplesheet - .join(basecall_meta) - .map{ meta, bam, meta_ext -> - def meta_new = meta + [ basecall_model: meta_ext] - return[ meta_new, bam ] - } - .groupTuple() - .map { meta, bam -> - [ meta, bam.flatten()] + .join(basecall_meta) + .map{ meta, bam, meta_ext -> + def meta_new = meta + [ basecall_model: meta_ext] + return[ meta_new, bam ] } - .set{ch_samplesheet} + .groupTuple() + .map { meta, bam -> + [ meta, bam.flatten()] + } + .set{ch_samplesheet} ch_split = ch_samplesheet .branch { meta, bam -> @@ -80,12 +83,12 @@ workflow LR_SOMATIC { .bam .mix ( ch_split.single ) .set { ch_cat_ubams } - ch_versions = ch_versions.mix (SAMTOOLS_CAT.out.versions) + + ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) // // MODULE: CRAMINO // - CRAMINO_PRE ( ch_cat_ubams ) ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) @@ -93,8 +96,11 @@ workflow LR_SOMATIC { // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // - - PREPARE_REFERENCE_FILES ( params.fasta ) + PREPARE_REFERENCE_FILES ( params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_file, + params.ascat_rt_file ) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai @@ -107,24 +113,25 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) - + /* // // MODULE: Run MINIMAP2_INDEX // if (!params.skip_save_minimap2_index) { + //TODO: Do we need a separate index for ont vs pb samples? MINIMAP2_INDEX ( ch_fasta ) ch_minimap_index = MINIMAP2_INDEX.out.index ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) } - + */ // // MODULE: MINIMAP2_ALIGN // MINIMAP2_ALIGN ( ch_cat_ubams, - ch_minimap_index, + ch_fasta, true, 'bai', "", @@ -140,44 +147,43 @@ workflow LR_SOMATIC { // since both bams need to be phased on the normal clair3 output // if it exists ch_minimap_bam - .join(MINIMAP2_ALIGN.out.index) - .map{ meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - basecall_model: meta.basecall_model - ] - def bam_check = bam ? bam : [] - return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai]] - } - .groupTuple() - .branch {meta, bams, bais -> - paired: meta.paired_data - tumor_only : !meta.paired_data - } - .set{reformat_samples} + .join(MINIMAP2_ALIGN.out.index) + .map{ meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model + ] + def bam_check = bam ? bam : [] + return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai]] + } + .groupTuple() + .branch {meta, bams, bais -> + paired: meta.paired_data + tumor_only : !meta.paired_data + } + .set{reformat_samples} // for the paired samples, only send the normal to CLAIR3 reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - return [meta, normal_bam, normal_bai] - } - .set{clair3_reformat_paired} + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + return [meta, normal_bam, normal_bai] + } + .set{clair3_reformat_paired} // for the tumor only, send the tumor sample to CLAIR3 reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, tumor_bam, tumor_bai] - } - .mix(clair3_reformat_paired) - .set{clair3_reformat_samples} + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, tumor_bam, tumor_bai] + } + .mix(clair3_reformat_paired) + .set{clair3_reformat_samples} // FORMAT IS [ meta, normal_bam, normal_bai] // (except if its tumor only) - CLAIR3 ( clair3_reformat_samples, ch_fasta, @@ -185,148 +191,146 @@ workflow LR_SOMATIC { ) clair3_reformat_samples - .join(CLAIR3.out.germline_vcf) - .map{meta, bam, bai, snps-> - def svs = [] - def mods = [] - return[meta, bam, bai, snps, svs, mods] - } - .set{clair3_reformat_samples} + .join(CLAIR3.out.germline_vcf) + .map{meta, bam, bai, snps-> + def svs = [] + def mods = [] + return[meta, bam, bai, snps, svs, mods] + } + .set{clair3_reformat_samples} // FORMAT IS [ meta, normal_bam, normal_bai, germline_vcf] // (except if its tumor only) - - LONGPHASE_PHASE( + LONGPHASE_PHASE( clair3_reformat_samples, ch_fasta, ch_fai ) reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] - } - .set{paired_samples} + return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] + } + .set{paired_samples} reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, [], tumor_bam, [], tumor_bai] - } - .mix(paired_samples) + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, [], tumor_bam, [], tumor_bai] + } + .mix(paired_samples) // Now we need to join the germline snps to the tumor and normal samples reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + .map { meta, bams, bais -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] - } - .set{paired_samples} - - reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, [], tumor_bam, [], tumor_bai] - } - .mix(paired_samples) - .join(LONGPHASE_PHASE.out.vcf) - .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, vcf -> - def meta_tumor = meta.clone() - meta_tumor.type = 'tumor' - def result = [[meta_tumor, tumor_bam, tumor_bai, vcf]] - - if (normal_bam) { - def meta_normal = meta.clone() - meta_normal.type = 'normal' - result << [meta_normal, normal_bam, normal_bai, vcf] - } - return result - } - .map{ meta, bam, bai, snps -> - def snvs = [] - def mods = [] - return [ meta, bam, bai, snps, snvs, mods] - } - .set{longphase_reformat} - // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] + return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] + } + .set{paired_samples} + reformat_samples.tumor_only + .map{meta, bam, bai -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, [], tumor_bam, [], tumor_bai] + } + .mix(paired_samples) + .join(LONGPHASE_PHASE.out.vcf) + .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, vcf -> + def meta_tumor = meta.clone() + meta_tumor.type = 'tumor' + def result = [[meta_tumor, tumor_bam, tumor_bai, vcf]] + + if (normal_bam) { + def meta_normal = meta.clone() + meta_normal.type = 'normal' + result << [meta_normal, normal_bam, normal_bai, vcf] + } + return result + } + .map{ meta, bam, bai, snps -> + def snvs = [] + def mods = [] + return [ meta, bam, bai, snps, snvs, mods] + } + .view() + .set{longphase_reformat} + // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] + + // TODO: Add versions LONGPHASE_HAPLOTAG( longphase_reformat, ch_fasta, ch_fai ) LONGPHASE_HAPLOTAG.out.bam - .set{haplotagged_bams} + .set{haplotagged_bams} SAMTOOLS_INDEX( haplotagged_bams ) haplotagged_bams - .join(SAMTOOLS_INDEX.out.bai) - .view() - .set{haplotagged_bams} + .join(SAMTOOLS_INDEX.out.bai) + .set{haplotagged_bams} + longphase_reformat - .join(haplotagged_bams) - .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam, hap_bai-> - return[meta, hap_bam, hap_bai, phased_snps] - } - .map{ meta, hap_bam, bai, vcf -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - basecall_model: meta.basecall_model - ] - def bam_check = hap_bam ? hap_bam : [] - return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai], vcf] - } - .groupTuple() - .branch {meta, bams, bais, vcf-> - paired: meta.paired_data - tumor_only : !meta.paired_data - } - .set{severus_reformat} + .join(haplotagged_bams) + .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam, hap_bai -> + return[meta, hap_bam, hap_bai, phased_snps] + } + .map{ meta, hap_bam, bai, vcf -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model + ] + def bam_check = hap_bam ? hap_bam : [] + return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai], vcf] + } + .groupTuple() + .branch {meta, bams, bais, vcf -> + paired: meta.paired_data + tumor_only : !meta.paired_data + } + .set{severus_reformat} severus_reformat.paired - .map { meta, bams, bais, vcf -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - - return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf ] - } - .set{paired_samples} - + .map { meta, bams, bais, vcf -> + def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] + def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] + def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] + def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] + def first_vcf = vcf[0] //TODO: check if there is a better way + + return [ meta, [tumor_bam], [tumor_bai], [normal_bam], [normal_bai], first_vcf ] + } + .set{paired_samples} severus_reformat.tumor_only - .map{meta, bam, bai, vcf-> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta,tumor_bam, tumor_bai, [], [], vcf] - } - .mix(paired_samples) - .view() - .set{severus_reformat} + .map{meta, bam, bai, vcf -> + def tumor_bam = bam[0][1] + def tumor_bai = bai[0][1] + return [ meta, [tumor_bam], [tumor_bai], [], [], vcf ] + } + .mix(paired_samples) + .set{severus_reformat} // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - bed_pon = Channel.of([[:], params.bed_file, params.pon_file]) //bed_pon = [[:], params.bed_file, params.pon_file] //bed_pon.view() - SEVERUS( severus_reformat, - bed_pon + [[:], params.bed_file, params.pon_file] ) // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] @@ -365,16 +369,17 @@ workflow LR_SOMATIC { // MODULE: ASCAT // //TODO: Reformat input channel and add that to ASCAT -- then test + /* ASCAT ( - // input channel, - params.allele_files, - params.loci_files, - [:], - [:], - [:], - [:] - ) - + severus_reformat, + allele_files, + loci_files, + [], + [], + [], + [] + )*/ + /* // // MODULE: WAKHAN // @@ -382,7 +387,7 @@ workflow LR_SOMATIC { severus_reformat, ch_fasta ) - + */ // // Collate and save software versions // From c542b5ababdfa3472cf4041f9309e66c10758978 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 3 Mar 2025 20:53:13 +0100 Subject: [PATCH 138/557] added sex as samplesheet input --- assets/samplesheet.csv | 10 +++++----- assets/schema_input.json | 7 ++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index eeca239f..08c1d456 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ -sample,bam_tumor,bam_normal,platform -sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont +sample,bam_tumor,bam_normal,platform,sex +sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,male +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb,female +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,male +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,male diff --git a/assets/schema_input.json b/assets/schema_input.json index 7514df9d..4176b38b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -32,7 +32,12 @@ "enum": ["pb", "ont"], "errorMessage": "Method must be one of the following: 'pb' or 'ont'" }, + "sex": { + "type": "string", + "enum": ["male", "female"], + "errorMessage": "Biological sex must be either 'male' or 'female'" + } }, - "required": ["sample", "bam_tumor","platform"] + "required": ["sample", "bam_tumor", "platform", "sex"] } } From 69ca469f59cc50465709573b89df913784fe819d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 3 Mar 2025 20:53:30 +0100 Subject: [PATCH 139/557] added sex in channel prep --- subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 6666086d..ce669cf7 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,9 +74,9 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method -> + .map { meta, bam_tumor, bam_normal, method, sex -> def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, platform: method] + def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } //.groupTuple() From 51d28357a8ed23451f96d2f8589384ba1f8bce74 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 3 Mar 2025 20:54:01 +0100 Subject: [PATCH 140/557] added and fixed loci/allele file prep --- subworkflows/local/prepare_reference_files.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 32b5980d..d2bf3d1a 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -47,28 +47,28 @@ workflow PREPARE_REFERENCE_FILES { if (!ascat_alleles) allele_files = Channel.empty() else if (ascat_alleles.endsWith(".zip")) { UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - allele_files = UNZIP_ALLELES.out.unzipped_archive.map{ it[1] } + allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() } ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) } else allele_files = Channel.fromPath(ascat_alleles).collect() if (!ascat_loci) loci_files = Channel.empty() else if (ascat_loci.endsWith(".zip")) { UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - loci_files = UNZIP_LOCI.out.unzipped_archive.map{ it[1] } + loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() } ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) } else loci_files = Channel.fromPath(ascat_loci).collect() if (!ascat_loci_gc) gc_file = Channel.value([]) else if (ascat_loci_gc.endsWith(".zip")) { UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - gc_file = UNZIP_GC.out.unzipped_archive.map{ it[1] } + gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() } ch_versions = ch_versions.mix(UNZIP_GC.out.versions) } else gc_file = Channel.fromPath(ascat_loci_gc).collect() if (!ascat_loci_rt) rt_file = Channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - rt_file = UNZIP_RT.out.unzipped_archive.map{ it[1] } + rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() } ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = Channel.fromPath(ascat_loci_rt).collect() From f6e75be254e9dd40b28268b4019e5c5301ff24f2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Mar 2025 16:26:51 +0100 Subject: [PATCH 141/557] made all female --- assets/samplesheet.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 08c1d456..ecf3e149 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ sample,bam_tumor,bam_normal,platform,sex -sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,male +sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,female sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb,female -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,male -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,male +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,female +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,female From a7585fedf7c6e935cae98c70cc76be8e82a03d06 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Mar 2025 16:27:24 +0100 Subject: [PATCH 142/557] added param for ascat_chroms and set it in test.config --- conf/modules.config | 6 +++--- conf/test.config | 9 +++++---- nextflow.config | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5f15a403..8240f4dd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -146,16 +146,16 @@ process { withName : '.*:ASCAT' { ext.args = { [ - "gender": meta.sex, + "gender": meta.sex == 'female' ? 'XX' : 'XY', "genomeVersion": params.genome_name, "purity": params.ascat_purity, "ploidy": params.ascat_ploidy, "minCounts": params.ascat_min_counts, - "chrom_names": meta.sex == 'XX' ? "c(1:22, 'X')" : "c(1:22, 'X', 'Y')", //TODO: Adjust this based on how we define it in samplesheet + "chrom_names": params.ascat_chroms ?: meta.sex == 'female' ? "c(1:22, 'X')" : "c(1:22, 'X', 'Y')", "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual, "longread_bins": params.ascat_longread_bins, - "allele_counter_flags": "-f 0" + "allele_counter_flags": params.ascat_allelecounter_flags ] } } diff --git a/conf/test.config b/conf/test.config index 592892e1..ecb19e5a 100644 --- a/conf/test.config +++ b/conf/test.config @@ -15,7 +15,7 @@ process { cpus: 4, memory: '15.GB', time: '1.h' - ] + ] } params { @@ -33,9 +33,10 @@ params { bed_file = "/staging/leuven/stg_00096/home/hackathon/chm13.bed" // ASCAT files - ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_WGS_CHM13.zip" - ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_WGS_CHM13.zip" - + ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_CHM13.zip" + ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_CHM13.zip" + ascat_chroms = "19" //PON_file = "https://github.com/KolmogorovLab/Severus/raw/main/pon/PoN_1000G_chm13.tsv.gz" //bed_file = "https://github.com/KolmogorovLab/Severus/raw/main/vntrs/chm13.bed" + } diff --git a/nextflow.config b/nextflow.config index c0fc2e9a..e20a3136 100644 --- a/nextflow.config +++ b/nextflow.config @@ -37,6 +37,8 @@ params { ascat_min_map_qual = 10 ascat_purity = null ascat_longread_bins = 1000 + ascat_allelecounter_flags = "-f 0" + ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version From 77731776a1627152e658bba83838e7d48ef69b9c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Mar 2025 16:28:14 +0100 Subject: [PATCH 143/557] made ascat files into value channels --- subworkflows/local/prepare_reference_files.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index d2bf3d1a..d993e466 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -47,28 +47,28 @@ workflow PREPARE_REFERENCE_FILES { if (!ascat_alleles) allele_files = Channel.empty() else if (ascat_alleles.endsWith(".zip")) { UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() } + allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) } else allele_files = Channel.fromPath(ascat_alleles).collect() if (!ascat_loci) loci_files = Channel.empty() else if (ascat_loci.endsWith(".zip")) { UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() } + loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) } else loci_files = Channel.fromPath(ascat_loci).collect() if (!ascat_loci_gc) gc_file = Channel.value([]) else if (ascat_loci_gc.endsWith(".zip")) { UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() } + gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_GC.out.versions) } else gc_file = Channel.fromPath(ascat_loci_gc).collect() if (!ascat_loci_rt) rt_file = Channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() } + rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = Channel.fromPath(ascat_loci_rt).collect() From 45f0303ecb18bed1e0a107c1fcc7703c9aa24462 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Mar 2025 16:30:28 +0100 Subject: [PATCH 144/557] changes and .diff for ascat module --- modules.json | 86 ++++++++++++++++++++++++-------- modules/nf-core/ascat/ascat.diff | 83 ++++++++++++++++++++++++++++-- modules/nf-core/ascat/main.nf | 46 ++++++++++++----- 3 files changed, 178 insertions(+), 37 deletions(-) diff --git a/modules.json b/modules.json index 90409c8b..f23ceb3c 100644 --- a/modules.json +++ b/modules.json @@ -8,88 +8,122 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "c70357ea249a541df53dd5b479b3c32b0c26c4d2", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -98,25 +132,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "763d4b5c05ffda3ac1ac969dc67f7458cfb2eb1d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index dc6043aa..c0e28cee 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -3,20 +3,32 @@ Changes in component 'nf-core/ascat' Changes in 'ascat/main.nf': --- modules/nf-core/ascat/main.nf +++ modules/nf-core/ascat/main.nf -@@ -48,7 +48,11 @@ +@@ -4,8 +4,8 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': +- 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': ++ 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" + + input: + tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) +@@ -48,7 +48,12 @@ def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" - + ++ def normal_exists = input_normal ? 'TRUE' : 'FALSE' + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" -+ def normal_name = input_normal ? ",normalname = $prefix.normal" : "" ++ def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) -@@ -65,9 +69,7 @@ +@@ -65,21 +70,22 @@ #prepare from BAM files ascat.prepareHTS( tumourseqfile = "$input_tumor", @@ -26,6 +38,71 @@ Changes in 'ascat/main.nf': allelecounter_exe = "alleleCounter", alleles.prefix = allele_prefix, loci.prefix = loci_prefix, + gender = "$gender", + genomeVersion = "$genomeVersion", + nthreads = $task.cpus ++ $normal_bam ++ $normal_name + $minCounts_arg + $bed_file_arg + $chrom_names_arg + $min_base_qual_arg + $min_map_qual_arg + $fasta_arg ++ $allele_counter_flags + $skip_allele_counting_tumour_arg + $skip_allele_counting_normal_arg, + seed = 42 +@@ -87,14 +93,28 @@ + + + #Load the data +- ascat.bc = ascat.loadData( +- Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), +- Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), +- Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), +- Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), +- genomeVersion = "$genomeVersion", +- gender = "$gender" +- ) ++ if($normal_exists) { ++ print("normal exists") ++ ascat.bc = ascat.loadData( ++ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), ++ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), ++ Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), ++ Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), ++ genomeVersion = "$genomeVersion", ++ gender = "$gender" ++ ) ++ } else { ++ print("normal does not exist") ++ ascat.bc = ascat.loadData( ++ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), ++ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), ++ genomeVersion = "$genomeVersion", ++ gender = "$gender") ++ gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") ++ ++ } ++ print("printing ascat.bc") ++ print(ascat.bc) + + #Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) +@@ -117,7 +137,11 @@ + } + + #Segment the data +- ascat.bc = ascat.aspcf(ascat.bc, seed=42) ++ if($normal_exists) { ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42) ++ } else { ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42, ascat.gg = gg) ++ } + + #Plot the segmented data + ascat.plotSegmentedData(ascat.bc) 'modules/nf-core/ascat/environment.yml' is unchanged ************************************************************ diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index b7502d3c..1e57c29b 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -4,8 +4,8 @@ process ASCAT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': - 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': + 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) @@ -49,8 +49,9 @@ process ASCAT { def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + def normal_exists = input_normal ? 'TRUE' : 'FALSE' def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" - def normal_name = input_normal ? ",normalname = $prefix.normal" : "" + def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ @@ -76,12 +77,15 @@ process ASCAT { gender = "$gender", genomeVersion = "$genomeVersion", nthreads = $task.cpus + $normal_bam + $normal_name $minCounts_arg $bed_file_arg $chrom_names_arg $min_base_qual_arg $min_map_qual_arg $fasta_arg + $allele_counter_flags $skip_allele_counting_tumour_arg $skip_allele_counting_normal_arg, seed = 42 @@ -89,14 +93,28 @@ process ASCAT { #Load the data - ascat.bc = ascat.loadData( - Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), - Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), - Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), - Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), - genomeVersion = "$genomeVersion", - gender = "$gender" - ) + if($normal_exists) { + print("normal exists") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), + Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender" + ) + } else { + print("normal does not exist") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender") + gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") + + } + print("printing ascat.bc") + print(ascat.bc) #Plot the raw data ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) @@ -119,7 +137,11 @@ process ASCAT { } #Segment the data - ascat.bc = ascat.aspcf(ascat.bc, seed=42) + if($normal_exists) { + ascat.bc = ascat.aspcf(ascat.bc, seed=42) + } else { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, ascat.gg = gg) + } #Plot the segmented data ascat.plotSegmentedData(ascat.bc) From 62cc9c59344cb8497b50050336268421f5d8b5d3 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 4 Mar 2025 16:30:47 +0100 Subject: [PATCH 145/557] added and fixed ascat for workflow --- workflows/lr_somatic.nf | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 17ffe273..3d29063d 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -225,7 +225,7 @@ workflow LR_SOMATIC { } .mix(paired_samples) - // Now we need to join the germline snps to the tumor and normal samples + // Now we need to join the germline snps to the tumor and normal samples reformat_samples.paired .map { meta, bams, bais -> def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] @@ -262,7 +262,6 @@ workflow LR_SOMATIC { def mods = [] return [ meta, bam, bai, snps, snvs, mods] } - .view() .set{longphase_reformat} // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] @@ -369,16 +368,25 @@ workflow LR_SOMATIC { // MODULE: ASCAT // //TODO: Reformat input channel and add that to ASCAT -- then test - /* + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .view() + .set { ascat_ch } + + allele_files.view() + loci_files.view() + ASCAT ( - severus_reformat, + ascat_ch, allele_files, loci_files, [], [], [], [] - )*/ + ) /* // // MODULE: WAKHAN From 8c0edad92af64b0ab7f5cca7b94088ac4f6e938e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 4 Mar 2025 21:50:43 +0100 Subject: [PATCH 146/557] Adds subworkflows for TO and T/N and clairS --- conf/test.config | 6 +- modules/local/clairs/environment.yml | 7 + modules/local/clairs/main.nf | 114 ++++++++++++ modules/local/clairs/meta.yml | 69 +++++++ modules/local/clairs/tests/main.nf.test | 73 ++++++++ modules/local/clairsto/main.nf | 15 +- modules/local/vcfsplit/environment.yml | 7 + modules/local/vcfsplit/main.nf | 106 +++++++++++ modules/local/vcfsplit/meta.yml | 69 +++++++ modules/local/vcfsplit/tests/main.nf.test | 73 ++++++++ subworkflows/local/run_clair.nf | 11 -- subworkflows/local/run_clair3.nf | 0 subworkflows/local/tumor_normal_happhase.nf | 126 +++++++++++++ subworkflows/local/tumor_only_happhase.nf | 79 ++++++++ workflows/lr_somatic.nf | 189 +++----------------- 15 files changed, 754 insertions(+), 190 deletions(-) create mode 100644 modules/local/clairs/environment.yml create mode 100644 modules/local/clairs/main.nf create mode 100644 modules/local/clairs/meta.yml create mode 100644 modules/local/clairs/tests/main.nf.test create mode 100644 modules/local/vcfsplit/environment.yml create mode 100644 modules/local/vcfsplit/main.nf create mode 100644 modules/local/vcfsplit/meta.yml create mode 100644 modules/local/vcfsplit/tests/main.nf.test delete mode 100644 subworkflows/local/run_clair.nf delete mode 100644 subworkflows/local/run_clair3.nf create mode 100644 subworkflows/local/tumor_normal_happhase.nf create mode 100644 subworkflows/local/tumor_only_happhase.nf diff --git a/conf/test.config b/conf/test.config index 592892e1..5f431fe8 100644 --- a/conf/test.config +++ b/conf/test.config @@ -33,9 +33,9 @@ params { bed_file = "/staging/leuven/stg_00096/home/hackathon/chm13.bed" // ASCAT files - ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_WGS_CHM13.zip" - ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_WGS_CHM13.zip" + ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_CHM13.zip" + ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_CHM13.zip" //PON_file = "https://github.com/KolmogorovLab/Severus/raw/main/pon/PoN_1000G_chm13.tsv.gz" //bed_file = "https://github.com/KolmogorovLab/Severus/raw/main/vntrs/chm13.bed" -} +} \ No newline at end of file diff --git a/modules/local/clairs/environment.yml b/modules/local/clairs/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/clairs/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf new file mode 100644 index 00000000..c20a4dfa --- /dev/null +++ b/modules/local/clairs/main.nf @@ -0,0 +1,114 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process CLAIRS { + tag "$meta.id" + label 'process_high' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker://hkubal/clairs:v0.4.1': + 'hkubal/clairs:v0.4.1' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(tumor_bam), path(tumor_bai),path(normal_bam), path(normal_bai) + tuple val(meta2), path(ref) + tuple val(meta3), path(ref_index) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.vcf.gz"), emit: somatic_vcf + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + + // if method meta data is pb, default to the revio model else go to the map + def model = modelMap.get(meta.basecall_model.toString().trim()) + + if (!model in modelMap.keySet() ) { + model = 'ont_r10_dorado_sup_5khz_ssrs' + log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" + } + else { + log.info "Using ${model} model for Clair3" + } + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + /opt/bin/run_clairs \\ + --tumor_bam_fn $tumor_bam \\ + --normal_bam_fn $normal_bam \\ + --ref_fn $ref \\ + --threads ${task.cpus} \\ + --platform ${model} \\ + --output_dir . \\ + --use_heterozygous_indel_for_intermediate_phasing True \\ + --use_longphase_for_intermediate_haplotagging True \\ + --conda_prefix /opt/conda/envs/clairs + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + clairs: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ +} diff --git a/modules/local/clairs/meta.yml b/modules/local/clairs/meta.yml new file mode 100644 index 00000000..604a3aa3 --- /dev/null +++ b/modules/local/clairs/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "clairs" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "clairs": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/clairs/tests/main.nf.test b/modules/local/clairs/tests/main.nf.test new file mode 100644 index 00000000..7c7a3032 --- /dev/null +++ b/modules/local/clairs/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test clairs +nextflow_process { + + name "Test Process CLAIRS" + script "../main.nf" + process "CLAIRS" + + tag "modules" + tag "modules_" + tag "clairs" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 8a93172f..0d1202fb 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -41,8 +41,7 @@ process CLAIRSTO { output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*snv.vcf.gz"), emit: somatic_vcf - tuple val(meta), path("*indel.vcf.gz"), emit: germline_vcf + tuple val(meta), path("*snv.vcf.gz"), path("*indel.vcf.gz"), emit: vcfs // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions @@ -57,17 +56,19 @@ process CLAIRSTO { 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs' + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' ] // if method meta data is pb, default to the revio model else go to the map - def model = (meta.basecall_model == 'hifi') ? 'hifi_revio_ssrs' : modelMap.get(meta.basecall_model.toString().trim()) - if (model.toString().trim() in modelMap.keySet() || model.toString().trim() == 'hifi') { - model = 'r1041_e82_400bps_sup_v500' + def model = modelMap.get(meta.basecall_model.toString().trim()) + + if (!model in modelMap.keySet() ) { + model = 'ont_r10_dorado_sup_5khz_ssrs' log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" } else { - log.info "Using ${model} model for ClairS-TO" + log.info "Using ${model} model for Clair3" } // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 diff --git a/modules/local/vcfsplit/environment.yml b/modules/local/vcfsplit/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/vcfsplit/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf new file mode 100644 index 00000000..3e980a19 --- /dev/null +++ b/modules/local/vcfsplit/main.nf @@ -0,0 +1,106 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process VCFSPLIT { + tag "$meta.id" + label 'process_single' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(indel_vcf), path(snv_vcf) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*somatic.vcf.gz"), emit: somatic_vcf + tuple val(meta), path("*germline.vcf.gz"), emit: germline_vcf + + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + + # Extract PASS entries from both VCF files, compress, index, and merge + bcftools view -i 'FILTER="PASS"' $indel_vcf | bgzip -c > indels_pass.vcf.gz + bcftools view -i 'FILTER="PASS"' $snv_vcf | bgzip -c > snv_pass.vcf.gz + tabix -p vcf indels_pass.vcf.gz + tabix -p vcf snv_pass.vcf.gz + bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz + tabix -p vcf somatic.vcf.gz + + # Extract ONLY NonSomatic entries, compress, index, and merge + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz + tabix -p vcf indels_nonsomatic.vcf.gz + tabix -p vcf snv_nonsomatic.vcf.gz + bcftools concat -a -Oz -o germline.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + tabix -p vcf germline.vcf.gz + + # Cleanup intermediate files + rm indels_pass.vcf.gz snv_pass.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + rm indels_pass.vcf.gz.tbi snv_pass.vcf.gz.tbi indels_nonsomatic.vcf.gz.tbi snv_nonsomatic.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfsplit: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + vcfsplit: \$(samtools --version |& sed '1!d ; s/samtools //') + END_VERSIONS + """ +} diff --git a/modules/local/vcfsplit/meta.yml b/modules/local/vcfsplit/meta.yml new file mode 100644 index 00000000..2ed845aa --- /dev/null +++ b/modules/local/vcfsplit/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "vcfsplit" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "vcfsplit": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/vcfsplit/tests/main.nf.test b/modules/local/vcfsplit/tests/main.nf.test new file mode 100644 index 00000000..9b650ca7 --- /dev/null +++ b/modules/local/vcfsplit/tests/main.nf.test @@ -0,0 +1,73 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test vcfsplit +nextflow_process { + + name "Test Process VCFSPLIT" + script "../main.nf" + process "VCFSPLIT" + + tag "modules" + tag "modules_" + tag "vcfsplit" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/subworkflows/local/run_clair.nf b/subworkflows/local/run_clair.nf deleted file mode 100644 index 801d8809..00000000 --- a/subworkflows/local/run_clair.nf +++ /dev/null @@ -1,11 +0,0 @@ -include { CLAIRSTO } from '../modules/local/clairsto/main' -include { CLAIRS } from '../modules/local/clairs/main' - -workflow RUN_SOMATIC_CLAIR { - take: - ch_bams - - main: - - -} \ No newline at end of file diff --git a/subworkflows/local/run_clair3.nf b/subworkflows/local/run_clair3.nf deleted file mode 100644 index e69de29b..00000000 diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf new file mode 100644 index 00000000..a1f9d41f --- /dev/null +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -0,0 +1,126 @@ +include { CLAIR3 } from '../../modules/local/clair3/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' + +workflow TUMOR_NORMAL_HAPPHASE { + take: + mixed_bams + fasta + fai + + main: + mixed_bams + .branch{ meta, bam, bai -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set{mixed_bams} + + mixed_bams.normal + .map{meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model] + return[new_meta, bam, bai] + } + .set{normal_bams} + + mixed_bams.tumor + .map{meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model] + return[new_meta, bam, bai] + } + .set{tumor_bams} + + CLAIR3( + normal_bams, + fasta, + fai + ) + + normal_bams + .join(CLAIR3.out.germline_vcf) + .map{ meta, bam, bai, vcf -> + def svs = [] + def mods = [] + return [meta, bam, bai, vcf, svs, mods] + } + .set{normalbams_germlinevcf} + + LONGPHASE_PHASE( + normalbams_germlinevcf, + fasta, + fai + ) + + normal_bams + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, bam, bai, vcf -> + def new_meta = meta + [type: "normal"] + def snvs = [] + def mods = [] + return[new_meta, bam, bai, vcf, snvs, mods] + } + .set{normal_bams} + + tumor_bams + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, bam, bai, vcf -> + def new_meta = meta + [type: "tumor"] + def snvs = [] + def mods = [] + return [new_meta, bam, bai, vcf, snvs, mods] + } + .mix(normal_bams) + .set{mixed_bams_vcf} + + LONGPHASE_HAPLOTAG( + mixed_bams_vcf, + fasta, + fai + ) + + LONGPHASE_HAPLOTAG.out.bam + .set{mixed_hapbams} + + SAMTOOLS_INDEX( + mixed_hapbams + ) + + mixed_bams_vcf + .join(mixed_hapbams) + .join(SAMTOOLS_INDEX.out.bai) + .set{mixed_hapbams} + + mixed_hapbams + .map{ meta, bam, bai, vcf, snvs, mods, hapbam, hapbai-> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model] + return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] + + } + .groupTuple() + .map{meta, bam, bai -> + + def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] + def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] + def normal_bai = bai[0][0].type == "normal" ? bai[0][1] : bai[1][1] + def tumor_bai = bai[0][0].type == "tumor" ? bai[0][1] : bai[1][1] + + return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] + } + .join(LONGPHASE_PHASE.out.vcf) + .set{tumor_normal_severus} + + + emit: + tumor_normal_severus + +} \ No newline at end of file diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf new file mode 100644 index 00000000..207b5ce9 --- /dev/null +++ b/subworkflows/local/tumor_only_happhase.nf @@ -0,0 +1,79 @@ +include { CLAIRSTO } from '../../modules/local/clairsto/main.nf' +include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' + +workflow TUMOR_ONLY_HAPPHASE { + + take: + tumor_bams + fasta + fai + + main: + tumor_bams.view() + CLAIRSTO( + tumor_bams, + fasta, + fai + ) + + VCFSPLIT( + CLAIRSTO.out.vcfs + ) + + tumor_bams + .join(VCFSPLIT.out.germline_vcf) + .map{ meta, bam, bai, snps -> + def svs = [] + def mods = [] + return[meta, bam, bai, snps, svs, mods] + } + .set{tumor_bams_germlinevcf} + // [meta, bam, bai, vcf] + + LONGPHASE_PHASE( + tumor_bams_germlinevcf, + fasta, + fai + ) + + tumor_bams + .join(LONGPHASE_PHASE.out.vcf) + .map{ meta, bam, bai, snps -> + def svs = [] + def mods = [] + return [meta, bam, bai, snps, svs, mods] + } + .set{tumor_bams_phasedvcf} + + LONGPHASE_HAPLOTAG( + tumor_bams_phasedvcf, + fasta, + fai + ) + + LONGPHASE_HAPLOTAG.out.bam + .set{haplotagged_bams} + + SAMTOOLS_INDEX( + haplotagged_bams + ) + + haplotagged_bams + .join(SAMTOOLS_INDEX.out.bai) + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, hap_bam, hap_bai, vcf -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + basecall_model: meta.basecall_model] + return[new_meta, hap_bam, hap_bai, [],[], vcf] + } + .set{tumor_only_severus} + + emit: + tumor_only_severus + +} \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 17ffe273..29cbc445 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -15,6 +15,7 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { CLAIRSTO } from '../modules/local/clairsto/main' +include { CLAIRS } from '../modules/local/clairs/main.nf' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' @@ -33,6 +34,10 @@ include { WAKHAN } from '../modules/local/wakhan/main' // include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' + + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -142,192 +147,38 @@ workflow LR_SOMATIC { MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } - // Need to join the tumor and normal information back together // since both bams need to be phased on the normal clair3 output // if it exists ch_minimap_bam - .join(MINIMAP2_ALIGN.out.index) - .map{ meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - basecall_model: meta.basecall_model - ] - def bam_check = bam ? bam : [] - return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai]] - } - .groupTuple() - .branch {meta, bams, bais -> - paired: meta.paired_data - tumor_only : !meta.paired_data + .join(MINIMAP2_ALIGN.out.index) + .branch{meta, bams, bais -> + paired: meta.paired_data + tumor_only: !meta.paired_data } - .set{reformat_samples} + .set{branched_minimap} - // for the paired samples, only send the normal to CLAIR3 - reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - return [meta, normal_bam, normal_bai] - } - .set{clair3_reformat_paired} - // for the tumor only, send the tumor sample to CLAIR3 - reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, tumor_bam, tumor_bai] - } - .mix(clair3_reformat_paired) - .set{clair3_reformat_samples} - // FORMAT IS [ meta, normal_bam, normal_bai] - // (except if its tumor only) - CLAIR3 ( - clair3_reformat_samples, + TUMOR_NORMAL_HAPPHASE( + branched_minimap.paired, ch_fasta, ch_fai ) - - clair3_reformat_samples - .join(CLAIR3.out.germline_vcf) - .map{meta, bam, bai, snps-> - def svs = [] - def mods = [] - return[meta, bam, bai, snps, svs, mods] - } - .set{clair3_reformat_samples} - // FORMAT IS [ meta, normal_bam, normal_bai, germline_vcf] - // (except if its tumor only) - LONGPHASE_PHASE( - clair3_reformat_samples, + TUMOR_ONLY_HAPPHASE( + branched_minimap.tumor_only, ch_fasta, ch_fai ) + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .set{severus_reformat} + // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - - return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] - } - .set{paired_samples} - - reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, [], tumor_bam, [], tumor_bai] - } - .mix(paired_samples) - - // Now we need to join the germline snps to the tumor and normal samples - reformat_samples.paired - .map { meta, bams, bais -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - - return [ meta, normal_bam, tumor_bam, normal_bai, tumor_bai ] - } - .set{paired_samples} - - reformat_samples.tumor_only - .map{meta, bam, bai -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, [], tumor_bam, [], tumor_bai] - } - .mix(paired_samples) - .join(LONGPHASE_PHASE.out.vcf) - .flatMap { meta, normal_bam, tumor_bam, normal_bai, tumor_bai, vcf -> - def meta_tumor = meta.clone() - meta_tumor.type = 'tumor' - def result = [[meta_tumor, tumor_bam, tumor_bai, vcf]] - - if (normal_bam) { - def meta_normal = meta.clone() - meta_normal.type = 'normal' - result << [meta_normal, normal_bam, normal_bai, vcf] - } - return result - } - .map{ meta, bam, bai, snps -> - def snvs = [] - def mods = [] - return [ meta, bam, bai, snps, snvs, mods] - } - .view() - .set{longphase_reformat} - // FORMAT IS [ meta, bam, bai, phased_snps, [], [] ] - - // TODO: Add versions - LONGPHASE_HAPLOTAG( - longphase_reformat, + CLAIRS( + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus, ch_fasta, ch_fai ) - LONGPHASE_HAPLOTAG.out.bam - .set{haplotagged_bams} - - SAMTOOLS_INDEX( - haplotagged_bams - ) - - haplotagged_bams - .join(SAMTOOLS_INDEX.out.bai) - .set{haplotagged_bams} - - - longphase_reformat - .join(haplotagged_bams) - .map{meta, bam, bai, phased_snps, snvs, mods, hap_bam, hap_bai -> - return[meta, hap_bam, hap_bai, phased_snps] - } - .map{ meta, hap_bam, bai, vcf -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - basecall_model: meta.basecall_model - ] - def bam_check = hap_bam ? hap_bam : [] - return[new_meta , [[type: meta.type], bam_check], [[type: meta.type], bai], vcf] - } - .groupTuple() - .branch {meta, bams, bais, vcf -> - paired: meta.paired_data - tumor_only : !meta.paired_data - } - .set{severus_reformat} - - severus_reformat.paired - .map { meta, bams, bais, vcf -> - def normal_bam = bams[0][0].type == "normal" ? bams[0][1] : bams[1][1] - def tumor_bam = bams[0][0].type == "tumor" ? bams[0][1] : bams[1][1] - def normal_bai = bais[0][0].type == "normal" ? bais[0][1] : bais[1][1] - def tumor_bai = bais[0][0].type == "tumor" ? bais[0][1] : bais[1][1] - def first_vcf = vcf[0] //TODO: check if there is a better way - - return [ meta, [tumor_bam], [tumor_bai], [normal_bam], [normal_bai], first_vcf ] - } - .set{paired_samples} - severus_reformat.tumor_only - .map{meta, bam, bai, vcf -> - def tumor_bam = bam[0][1] - def tumor_bai = bai[0][1] - return [ meta, [tumor_bam], [tumor_bai], [], [], vcf ] - } - .mix(paired_samples) - .set{severus_reformat} - // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - - //bed_pon = [[:], params.bed_file, params.pon_file] - //bed_pon.view() SEVERUS( severus_reformat, [[:], params.bed_file, params.pon_file] From a616aae68d55376f029d4bbc2eb582a83a9df616 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Mar 2025 10:37:38 +0100 Subject: [PATCH 147/557] added sex meta to subworkflows --- subworkflows/local/tumor_normal_happhase.nf | 3 +++ subworkflows/local/tumor_only_happhase.nf | 1 + 2 files changed, 4 insertions(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a1f9d41f..62998c69 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -22,6 +22,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, + sex: sex, basecall_model: meta.basecall_model] return[new_meta, bam, bai] } @@ -32,6 +33,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, + sex: sex, basecall_model: meta.basecall_model] return[new_meta, bam, bai] } @@ -102,6 +104,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, + sex: sex, basecall_model: meta.basecall_model] return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 207b5ce9..ca6a49a5 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -68,6 +68,7 @@ workflow TUMOR_ONLY_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, + sex: sex, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } From 4e43f1d9ecf1315d31118850206753be5daad940 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Mar 2025 10:49:01 +0100 Subject: [PATCH 148/557] changed sex: sex, to sex: meta.sex --- subworkflows/local/tumor_normal_happhase.nf | 7 ++++--- subworkflows/local/tumor_only_happhase.nf | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 62998c69..6328a2b6 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -18,11 +18,12 @@ workflow TUMOR_NORMAL_HAPPHASE { .set{mixed_bams} mixed_bams.normal + .view() .map{meta, bam, bai -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, - sex: sex, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, bam, bai] } @@ -33,7 +34,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, - sex: sex, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, bam, bai] } @@ -104,7 +105,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, - sex: sex, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index ca6a49a5..2a02f14d 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -68,7 +68,7 @@ workflow TUMOR_ONLY_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, - sex: sex, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } From 870e3ac08bd3c1154cc26f532f30d493ea848b40 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 5 Mar 2025 14:51:16 +0100 Subject: [PATCH 149/557] changed clairs input and swapped vcfsplit order --- modules/local/vcfsplit/main.nf | 2 +- workflows/lr_somatic.nf | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 3e980a19..3d21d17d 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -35,7 +35,7 @@ process VCFSPLIT { // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf // TODO nf-core: Where applicable please provide/convert compressed files as input/output // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(indel_vcf), path(snv_vcf) + tuple val(meta), path(snv_vcf), path(indel_vcf) output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 24aa1c0f..e826525c 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -174,8 +174,12 @@ workflow LR_SOMATIC { .set{severus_reformat} // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + clairs_input = TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] + } CLAIRS( - TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus, + clairs_input, ch_fasta, ch_fai ) From 39625c397253f1c2af34cd97494076ff12cce544 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 11 Mar 2025 10:12:02 +0100 Subject: [PATCH 150/557] Adds versioning and changes output dir in conf --- conf/modules.config | 50 ++++++++++++++++++++++++++++++++-- modules/local/clair3/main.nf | 39 +++----------------------- modules/local/clairs/main.nf | 4 +-- modules/local/clairsto/main.nf | 13 ++------- modules/local/vcfsplit/main.nf | 4 +-- 5 files changed, 58 insertions(+), 52 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8240f4dd..b9bc29a6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -125,7 +125,25 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: '.*:CLAIRS' { + ext.args = { } + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairs" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:CLAIR3' { + ext.args = { } + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clair3" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}" } publishDir = [ @@ -138,7 +156,7 @@ process { withName: '.*:METAEXTRACT' { ext.args = { } publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/metaextract" }, + path: { "${params.outdir}/${meta.id}/metaextract" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -157,6 +175,7 @@ process { "longread_bins": params.ascat_longread_bins, "allele_counter_flags": params.ascat_allelecounter_flags ] } + } withName : '.*:WAKHAN' { @@ -173,7 +192,34 @@ process { withName: '.*:LONGPHASE_PHASE' { ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/longphase_phase" }, + path: { "${params.outdir}/${meta.id}/longphase_phase" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:SAMTOOLS.*' { + ext.args = {''} + publishDir = [ + path: { "${params.outdir}/${meta.id}/samtools" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:LONGPHASE_HAPLOTAG' { + ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} + publishDir = [ + path: { "${params.outdir}/${meta.id}/longphase_haplotag" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:VCFSPLIT' { + ext.args = {''} + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 24ceca43..39ede708 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,40 +1,13 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process CLAIR3 { tag "$meta.id" label 'process_high' - - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'docker://hkubal/clair3:v1.0.10': 'hkubal/clair3:v1.0.10' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam), path(bam_bai) tuple val(meta2), path(ref) tuple val(meta3), path(ref_index) @@ -42,7 +15,7 @@ process CLAIR3 { output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("merge_output.vcf.gz"), emit: germline_vcf + tuple val(meta), path("*merge_output.vcf.gz"), emit: germline_vcf // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions @@ -99,14 +72,10 @@ process CLAIR3 { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ - touch ${prefix}.bam + touch ${prefix}.merge_output.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index c20a4dfa..da02cfb0 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -92,7 +92,7 @@ process CLAIRS { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(samtools --version |& sed '1!d ; s/samtools //') + clairs: \$( /opt/bin/run_clairs --version |& sed 's/ClairS v//' ) END_VERSIONS """ @@ -108,7 +108,7 @@ process CLAIRS { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(samtools --version |& sed '1!d ; s/samtools //') + clairs: \$( /opt/bin/run_clairs --version |& sed 's/ClairS v//' ) END_VERSIONS """ } diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 0d1202fb..16413a26 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -71,15 +71,6 @@ process CLAIRSTO { log.info "Using ${model} model for Clair3" } - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ /opt/bin/run_clairs_to \\ --tumor_bam_fn ${tumor_bam} \\ @@ -94,7 +85,7 @@ process CLAIRSTO { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs --version | sed 's/ClairS version: //') + clairs: \$(/opt/bin/run_clairs_to --version | sed 's/ClairS-TO version: //') END_VERSIONS """ @@ -107,7 +98,7 @@ process CLAIRSTO { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs --version | sed 's/ClairS version: //') + clairs: \$(/opt/bin/run_clairs_to --version | sed 's/ClairS-TO version: //') END_VERSIONS """ } diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 3d21d17d..29abd98d 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -84,7 +84,7 @@ process VCFSPLIT { cat <<-END_VERSIONS > versions.yml "${task.process}": - vcfsplit: \$(samtools --version |& sed '1!d ; s/samtools //') + vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') END_VERSIONS """ @@ -100,7 +100,7 @@ process VCFSPLIT { cat <<-END_VERSIONS > versions.yml "${task.process}": - vcfsplit: \$(samtools --version |& sed '1!d ; s/samtools //') + vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') END_VERSIONS """ } From 0efe367d8ff46debc4f8d1abca6f16b9c8bcf6a4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 11 Mar 2025 10:14:55 +0100 Subject: [PATCH 151/557] Updates ClairS-TO version --- modules/local/clairsto/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 16413a26..8cb165a6 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -25,8 +25,8 @@ process CLAIRSTO { // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clairs-to:v0.3.1': - 'hkubal/clairs-to:v0.3.1' }" + 'docker://hkubal/clairs-to:v0.4.0': + 'hkubal/clairs-to:v0.4.0' }" input: // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" From d8e34c943430fa9b9748f8680ead98a119b86a02 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 17 Mar 2025 10:03:45 +0100 Subject: [PATCH 152/557] Update versioning + severus and remove view states --- conf/base.config | 5 +++++ conf/modules.config | 9 +-------- modules/local/clair3/main.nf | 2 +- modules/local/clairs/main.nf | 2 +- modules/local/clairsto/main.nf | 2 +- modules/nf-core/severus/main.nf | 2 +- subworkflows/local/tumor_only_happhase.nf | 2 -- workflows/lr_somatic.nf | 22 +++++++++------------- 8 files changed, 19 insertions(+), 27 deletions(-) diff --git a/conf/base.config b/conf/base.config index 8bc8e250..5ee015cb 100644 --- a/conf/base.config +++ b/conf/base.config @@ -46,6 +46,11 @@ process { memory = { 72.GB * task.attempt } time = { 16.h * task.attempt } } + withLabel:process_very_high { + cpus = { 24 * task.attempt } + memory = { 144.GB * task.attempt } + time = { 16.h * task.attempt } + } withLabel:process_long { time = { 20.h * task.attempt } } diff --git a/conf/modules.config b/conf/modules.config index b9bc29a6..8f68c94c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -100,7 +100,7 @@ process { } withName: '.*:SEVERUS' { - ext.args = '--min-support 3' + ext.args = '--min-support 3 --output-read-ids ' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, @@ -118,7 +118,6 @@ process { } withName: '.*:CLAIRSTO' { - ext.args = { } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, @@ -127,7 +126,6 @@ process { } withName: '.*:CLAIRS' { - ext.args = { } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairs" }, mode: params.publish_dir_mode, @@ -136,7 +134,6 @@ process { } withName: '.*:CLAIR3' { - ext.args = { } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clair3" }, mode: params.publish_dir_mode, @@ -154,7 +151,6 @@ process { } withName: '.*:METAEXTRACT' { - ext.args = { } publishDir = [ path: { "${params.outdir}/${meta.id}/metaextract" }, mode: params.publish_dir_mode, @@ -199,7 +195,6 @@ process { } withName: '.*:SAMTOOLS.*' { - ext.args = {''} publishDir = [ path: { "${params.outdir}/${meta.id}/samtools" }, mode: params.publish_dir_mode, @@ -208,7 +203,6 @@ process { } withName: '.*:LONGPHASE_HAPLOTAG' { - ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ path: { "${params.outdir}/${meta.id}/longphase_haplotag" }, mode: params.publish_dir_mode, @@ -217,7 +211,6 @@ process { } withName: '.*:VCFSPLIT' { - ext.args = {''} publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 39ede708..aa576d01 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,6 +1,6 @@ process CLAIR3 { tag "$meta.id" - label 'process_high' + label 'process_very_high' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index da02cfb0..b5a5a971 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -17,7 +17,7 @@ process CLAIRS { tag "$meta.id" - label 'process_high' + label 'process_very_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 8cb165a6..906badff 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -17,7 +17,7 @@ process CLAIRSTO { tag "$meta.id" - label 'process_high' + label 'process_very_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index d8f33834..9198d8ec 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -23,7 +23,7 @@ process SEVERUS { tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf //, optional: true tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2a02f14d..4bb39156 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -12,7 +12,6 @@ workflow TUMOR_ONLY_HAPPHASE { fai main: - tumor_bams.view() CLAIRSTO( tumor_bams, fasta, @@ -68,7 +67,6 @@ workflow TUMOR_ONLY_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, - sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index e826525c..8a7a8bef 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -228,21 +228,17 @@ workflow LR_SOMATIC { .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] } - .view() .set { ascat_ch } - allele_files.view() - loci_files.view() - - ASCAT ( - ascat_ch, - allele_files, - loci_files, - [], - [], - [], - [] - ) + //ASCAT ( + // ascat_ch, + // allele_files, + // loci_files, + // [], + // [], + // [], + // [] + //) /* // // MODULE: WAKHAN From e3921afe2293d49b0d0520a622e9c54c52eb269b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 17 Mar 2025 10:11:12 +0100 Subject: [PATCH 153/557] Add spacing --- conf/base.config | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/base.config b/conf/base.config index 5ee015cb..1e3aa242 100644 --- a/conf/base.config +++ b/conf/base.config @@ -28,31 +28,31 @@ process { // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { cpus = { 1 } - memory = { 6.GB * task.attempt } - time = { 4.h * task.attempt } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_low { - cpus = { 2 * task.attempt } - memory = { 12.GB * task.attempt } - time = { 4.h * task.attempt } + cpus = { 2 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_medium { - cpus = { 6 * task.attempt } - memory = { 36.GB * task.attempt } - time = { 8.h * task.attempt } + cpus = { 6 * task.attempt } + memory = { 36.GB * task.attempt } + time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { 12 * task.attempt } - memory = { 72.GB * task.attempt } - time = { 16.h * task.attempt } + cpus = { 12 * task.attempt } + memory = { 72.GB * task.attempt } + time = { 16.h * task.attempt } } withLabel:process_very_high { - cpus = { 24 * task.attempt } + cpus = { 24 * task.attempt } memory = { 144.GB * task.attempt } - time = { 16.h * task.attempt } + time = { 16.h * task.attempt } } withLabel:process_long { - time = { 20.h * task.attempt } + time = { 20.h * task.attempt } } withLabel:process_high_memory { memory = { 200.GB * task.attempt } From 3c97976a69a09a695ac1cc450e0cf732e0c20201 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 17 Mar 2025 11:28:04 +0100 Subject: [PATCH 154/557] Update subworkflows/local/tumor_only_happhase.nf Co-authored-by: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> --- subworkflows/local/tumor_only_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 4bb39156..40a31201 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -66,7 +66,7 @@ workflow TUMOR_ONLY_HAPPHASE { .map{meta, hap_bam, hap_bai, vcf -> def new_meta = [id: meta.id, paired_data: meta.paired_data, - platform: meta.platform, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } From 9cc499f1a8262e0674060bc2f81e6b046ee09e6b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 17 Mar 2025 11:29:11 +0100 Subject: [PATCH 155/557] added ASCAT back in and readded meta.sex --- subworkflows/local/tumor_only_happhase.nf | 1 + workflows/lr_somatic.nf | 33 +++++++---------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 4bb39156..ebfcb62f 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -67,6 +67,7 @@ workflow TUMOR_ONLY_HAPPHASE { def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, + sex: meta.sex, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 8a7a8bef..bf34c500 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -118,19 +118,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) - /* - // - // MODULE: Run MINIMAP2_INDEX - // - if (!params.skip_save_minimap2_index) { - - //TODO: Do we need a separate index for ont vs pb samples? - MINIMAP2_INDEX ( ch_fasta ) - ch_minimap_index = MINIMAP2_INDEX.out.index - - ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) - } - */ + // // MODULE: MINIMAP2_ALIGN // @@ -223,22 +211,21 @@ workflow LR_SOMATIC { // // MODULE: ASCAT // - //TODO: Reformat input channel and add that to ASCAT -- then test severus_reformat .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } - //ASCAT ( - // ascat_ch, - // allele_files, - // loci_files, - // [], - // [], - // [], - // [] - //) + ASCAT ( + ascat_ch, + allele_files, + loci_files, + [], + [], + [], + [] + ) /* // // MODULE: WAKHAN From 36cb92c0487d0ad88aff04fb77568f9e3056bf86 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 18 Mar 2025 17:50:58 +0100 Subject: [PATCH 156/557] added versioning output of tools in main.nf and in subworkflows, also fixed some formatting to make it consistent with other parts --- modules/local/wakhan/main.nf | 60 ++---- subworkflows/local/tumor_normal_happhase.nf | 208 ++++++++++++-------- 2 files changed, 141 insertions(+), 127 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index f7a6bae5..84713fd2 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -19,25 +19,15 @@ process WAKHAN { tag "$meta.id" label 'process_medium' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE': - 'biocontainers/YOUR-TOOL-HERE' }" + 'https://depot.galaxyproject.org/singularity/wakhan:0.1.1--pyhdfd78af_1': + 'biocontainers/wakhan:0.1.1--pyhdfd78af_1' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(tumor_bam), path(tumor_index), path(normal_bam), path(normal_index), path(phased_vcf), path(breakpoints_vcf) + tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) tuple val(meta2), path(reference) - + output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam @@ -50,42 +40,32 @@ process WAKHAN { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def paired_command = normal_bam ? "--control-bam $normal_bam --normal-phased-vcf $phased_vcf" : - "--tumor-vcf $phased_vcf" - def VERSION = '0.1.0' - // WARN: Version information not provided by tool on CLI. Please update this string when bumping version - - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-vcf $vcf" + // WARN: Version information not provided by tool on CLI. Please update this string when upgrading BLAZE code + def VERSION = "0.1.1" """ wakhan \\ - ${args} \\ - ${paired_command} \\ - --threads ${task.cpus} \\ + --target-bam ${tumor_input} \\ + --breakpoints ${breakpoints} \\ --reference ${reference} \\ - --target-bam ${tumor_bam} \\ - --breakpoints ${breakpoints_vcf} - - + --genome-name ${prefix} \\ + --outdir-plots ${prefix} \\ + ${phased_vcf} \\ + ${args} \\ + --threads ${task.cpus} + + cat <<-END_VERSIONS > versions.yml "${task.process}": - wakhan: ${VERSION} + wakhan: $VERSION END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '0.1.0' - // WARN: Version information not provided by tool on CLI. Please update this string when bumping version - + def VERSION = "0.1.1" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible // Have a look at the following examples: // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 @@ -95,7 +75,7 @@ process WAKHAN { cat <<-END_VERSIONS > versions.yml "${task.process}": - wakhan: ${VERSION} + wakhan: $VERSION END_VERSIONS """ } diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 6328a2b6..45dfc2cc 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -10,121 +10,155 @@ workflow TUMOR_NORMAL_HAPPHASE { fai main: + + ch_versions = Channel.empty() + + // Branch input bams in normal and tumour mixed_bams - .branch{ meta, bam, bai -> - normal: meta.type == "normal" - tumor: meta.type == "tumor" - } - .set{mixed_bams} + .branch{ meta, bam, bai -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set{mixed_bams} + // Get normal bams mixed_bams.normal - .view() - .map{meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - basecall_model: meta.basecall_model] - return[new_meta, bam, bai] - } - .set{normal_bams} - + .map{ meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + basecall_model: meta.basecall_model] + return[new_meta, bam, bai] + } + .set{normal_bams} + + // Get tumour bams mixed_bams.tumor - .map{meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - basecall_model: meta.basecall_model] - return[new_meta, bam, bai] - } - .set{tumor_bams} - - CLAIR3( + .map{ meta, bam, bai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + basecall_model: meta.basecall_model] + return[new_meta, bam, bai] + } + .set{tumor_bams} + + // + // MODULE: CLAIR3 + // + + CLAIR3 ( normal_bams, fasta, fai ) - + + ch_versions = ch_versions.mix(CLAIR3.out.versions) + + // Add germline vcf to normal bams normal_bams - .join(CLAIR3.out.germline_vcf) - .map{ meta, bam, bai, vcf -> - def svs = [] - def mods = [] - return [meta, bam, bai, vcf, svs, mods] - } - .set{normalbams_germlinevcf} - + .join(CLAIR3.out.germline_vcf) + .map{ meta, bam, bai, vcf -> + def svs = [] + def mods = [] + return [meta, bam, bai, vcf, svs, mods] + } + .set{normalbams_germlinevcf} + + // + // MODULE: LONGPHASE_PHASE + // + LONGPHASE_PHASE( normalbams_germlinevcf, fasta, fai ) + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + + // Add phased vcf to normal bams normal_bams - .join(LONGPHASE_PHASE.out.vcf) - .map{meta, bam, bai, vcf -> - def new_meta = meta + [type: "normal"] - def snvs = [] - def mods = [] - return[new_meta, bam, bai, vcf, snvs, mods] - } - .set{normal_bams} - + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, bam, bai, vcf -> + def new_meta = meta + [type: "normal"] + def snvs = [] + def mods = [] + return[new_meta, bam, bai, vcf, snvs, mods] + } + .set{normal_bams} + + // Add phased vcf to tumour bams tumor_bams - .join(LONGPHASE_PHASE.out.vcf) - .map{meta, bam, bai, vcf -> - def new_meta = meta + [type: "tumor"] - def snvs = [] - def mods = [] - return [new_meta, bam, bai, vcf, snvs, mods] - } - .mix(normal_bams) - .set{mixed_bams_vcf} - - LONGPHASE_HAPLOTAG( + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, bam, bai, vcf -> + def new_meta = meta + [type: "tumor"] + def snvs = [] + def mods = [] + return [new_meta, bam, bai, vcf, snvs, mods] + } + .mix(normal_bams) + .set{mixed_bams_vcf} + + // + // MODULE: LONGPHASE_HAPLOTAG + // + + LONGPHASE_HAPLOTAG ( mixed_bams_vcf, fasta, fai ) - + + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) + + // Get final tagged bams LONGPHASE_HAPLOTAG.out.bam - .set{mixed_hapbams} - - SAMTOOLS_INDEX( + .set{ mixed_hapbams } + + // + // MODULE: SAMTOOLS_INDEX + // + + SAMTOOLS_INDEX ( mixed_hapbams ) - + + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + + // Add index to channel mixed_bams_vcf - .join(mixed_hapbams) - .join(SAMTOOLS_INDEX.out.bai) - .set{mixed_hapbams} - + .join(mixed_hapbams) + .join(SAMTOOLS_INDEX.out.bai) + .set{mixed_hapbams} + + // Group everything back together in one channel + // Format of channel is [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf] mixed_hapbams - .map{ meta, bam, bai, vcf, snvs, mods, hapbam, hapbai-> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - basecall_model: meta.basecall_model] - return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] - - } - .groupTuple() - .map{meta, bam, bai -> - - def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] - def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] - def normal_bai = bai[0][0].type == "normal" ? bai[0][1] : bai[1][1] - def tumor_bai = bai[0][0].type == "tumor" ? bai[0][1] : bai[1][1] - - return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] - } - .join(LONGPHASE_PHASE.out.vcf) - .set{tumor_normal_severus} - + .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + basecall_model: meta.basecall_model] + return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] + } + .groupTuple() + .map{ meta, bam, bai -> + def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] + def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] + def normal_bai = bai[0][0].type == "normal" ? bai[0][1] : bai[1][1] + def tumor_bai = bai[0][0].type == "tumor" ? bai[0][1] : bai[1][1] + // Return channel + return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] + } + .join(LONGPHASE_PHASE.out.vcf) + .set{tumor_normal_severus} emit: tumor_normal_severus + versions = ch_versions } \ No newline at end of file From 1055d6aa8e9decd84400508e542fe8a460bfa2dd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 18 Mar 2025 17:59:44 +0100 Subject: [PATCH 157/557] more formatting changes --- subworkflows/local/prepare_reference_files.nf | 15 +++-- subworkflows/local/tumor_normal_happhase.nf | 8 +-- workflows/lr_somatic.nf | 64 ++++++++++++++----- 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index d993e466..9e7eb5aa 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -19,11 +19,9 @@ workflow PREPARE_REFERENCE_FILES { main: ch_versions = Channel.empty() + ch_prepared_fasta = Channel.empty() // Check if fasta and gtf are zipped - - // - ch_prepared_fasta = Channel.empty() if (fasta.endsWith('.gz')){ UNZIP_FASTA( [ [:], fasta ]) @@ -36,9 +34,16 @@ workflow PREPARE_REFERENCE_FILES { // // MODULE: Index the fasta // - SAMTOOLS_FAIDX( ch_prepared_fasta, [ [:], "$projectDir/assets/dummy_file.txt" ]) + + SAMTOOLS_FAIDX ( + ch_prepared_fasta, + [ [:], "$projectDir/assets/dummy_file.txt" ] + ) + ch_prepared_fai = SAMTOOLS_FAIDX.out.fai + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + // // Prepare ASCAT files // @@ -59,7 +64,7 @@ workflow PREPARE_REFERENCE_FILES { } else loci_files = Channel.fromPath(ascat_loci).collect() if (!ascat_loci_gc) gc_file = Channel.value([]) - else if (ascat_loci_gc.endsWith(".zip")) { + else if ( ascat_loci_gc.endsWith(".zip") ) { UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_GC.out.versions) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 45dfc2cc..095de90d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -60,7 +60,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add germline vcf to normal bams normal_bams .join(CLAIR3.out.germline_vcf) - .map{ meta, bam, bai, vcf -> + .map { meta, bam, bai, vcf -> def svs = [] def mods = [] return [meta, bam, bai, vcf, svs, mods] @@ -71,7 +71,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: LONGPHASE_PHASE // - LONGPHASE_PHASE( + LONGPHASE_PHASE ( normalbams_germlinevcf, fasta, fai @@ -82,7 +82,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to normal bams normal_bams .join(LONGPHASE_PHASE.out.vcf) - .map{meta, bam, bai, vcf -> + .map { meta, bam, bai, vcf -> def new_meta = meta + [type: "normal"] def snvs = [] def mods = [] @@ -93,7 +93,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams tumor_bams .join(LONGPHASE_PHASE.out.vcf) - .map{meta, bam, bai, vcf -> + .map { meta, bam, bai, vcf -> def new_meta = meta + [type: "tumor"] def snvs = [] def mods = [] diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index bf34c500..df1b0016 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -55,20 +55,19 @@ workflow LR_SOMATIC { ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - + // - // MODULE: Combine bam files from the same sample + // MODULE: METAEXTRACT // - // Take channels where there are multiple bam files in the list METAEXTRACT( ch_samplesheet ) - - basecall_meta = METAEXTRACT.out.basecall_model + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) + basecall_meta = METAEXTRACT.out.basecall_model ch_samplesheet .join(basecall_meta) - .map{ meta, bam, meta_ext -> + .map { meta, bam, meta_ext -> def meta_new = meta + [ basecall_model: meta_ext] return[ meta_new, bam ] } @@ -84,6 +83,10 @@ workflow LR_SOMATIC { multiple: bam.size() > 1 } + // + // MODULE: SAMTOOLS_CAT + // + SAMTOOLS_CAT ( ch_split.multiple ) .bam .mix ( ch_split.single ) @@ -94,6 +97,7 @@ workflow LR_SOMATIC { // // MODULE: CRAMINO // + CRAMINO_PRE ( ch_cat_ubams ) ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) @@ -101,12 +105,14 @@ workflow LR_SOMATIC { // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // + PREPARE_REFERENCE_FILES ( params.fasta, params.ascat_allele_files, params.ascat_loci_files, params.ascat_gc_file, params.ascat_rt_file ) + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai @@ -122,6 +128,7 @@ workflow LR_SOMATIC { // // MODULE: MINIMAP2_ALIGN // + MINIMAP2_ALIGN ( ch_cat_ubams, ch_fasta, @@ -140,43 +147,61 @@ workflow LR_SOMATIC { // if it exists ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) - .branch{meta, bams, bais -> + .branch { meta, bams, bais -> paired: meta.paired_data tumor_only: !meta.paired_data } - .set{branched_minimap} + .set { branched_minimap } - TUMOR_NORMAL_HAPPHASE( + TUMOR_NORMAL_HAPPHASE ( branched_minimap.paired, ch_fasta, ch_fai ) - TUMOR_ONLY_HAPPHASE( + + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + + TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, ch_fai ) + + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus - .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) - .set{severus_reformat} + .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .set { severus_reformat } // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] clairs_input = TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] } - CLAIRS( + + // + // MODULE: CLAIRS + // + + CLAIRS ( clairs_input, ch_fasta, ch_fai ) - SEVERUS( + + ch_versions = ch_versions.mix(CLAIRS.out.versions) + + // + // MODULE: SEVERUS + // + + SEVERUS ( severus_reformat, [[:], params.bed_file, params.pon_file] ) - // The channel is now [[meta], [bam]] With meta consisting of [id, paired_data, method, specs, type] + ch_versions = ch_versions.mix(SEVERUS.out.versions) // // MODULE: CRAMINO @@ -191,7 +216,9 @@ workflow LR_SOMATIC { // // prepare mosdepth input channel: we need to specify compulsory path to bed as well - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index).map{ meta, bam, bai -> [meta, bam, bai, []]}.set{ch_mosdepth_in} + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + .map { meta, bam, bai -> [meta, bam, bai, []] } + .set { ch_mosdepth_in } MOSDEPTH ( ch_mosdepth_in, ch_fasta ) @@ -226,14 +253,19 @@ workflow LR_SOMATIC { [], [] ) + + ch_versions = ch_versions.mix(ASCAT.out.versions) + /* // // MODULE: WAKHAN // + WAKHAN ( severus_reformat, ch_fasta ) + */ // // Collate and save software versions From db6d8af60062d0139ab97b085fa9cc922e1c51cf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 18 Mar 2025 18:02:21 +0100 Subject: [PATCH 158/557] more formatting --- workflows/lr_somatic.nf | 55 ++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index df1b0016..875be48c 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -3,11 +3,11 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' // // IMPORT MODULES @@ -15,7 +15,7 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { CLAIRSTO } from '../modules/local/clairsto/main' -include { CLAIRS } from '../modules/local/clairs/main.nf' +include { CLAIRS } from '../modules/local/clairs/main.nf' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' @@ -32,10 +32,10 @@ include { WAKHAN } from '../modules/local/wakhan/main' // // IMPORT SUBWORKFLOWS // -include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' -include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' -include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' @@ -106,11 +106,13 @@ workflow LR_SOMATIC { // SUBWORKFLOW: PREPARE_REFERENCE_FILES // - PREPARE_REFERENCE_FILES ( params.fasta, - params.ascat_allele_files, - params.ascat_loci_files, - params.ascat_gc_file, - params.ascat_rt_file ) + PREPARE_REFERENCE_FILES ( + params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_file, + params.ascat_rt_file + ) ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta @@ -153,7 +155,10 @@ workflow LR_SOMATIC { } .set { branched_minimap } - + // + // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE + // + TUMOR_NORMAL_HAPPHASE ( branched_minimap.paired, ch_fasta, @@ -162,6 +167,10 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + // + // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE + // + TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, @@ -170,15 +179,18 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) .set { severus_reformat } - // FORMAT IS [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - - clairs_input = TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + + // Get ClairS input channel + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] } + .set { clairs_input } // // MODULE: CLAIRS @@ -220,14 +232,17 @@ workflow LR_SOMATIC { .map { meta, bam, bai -> [meta, bam, bai, []] } .set { ch_mosdepth_in } - MOSDEPTH ( ch_mosdepth_in, - ch_fasta ) + MOSDEPTH ( + ch_mosdepth_in, + ch_fasta + ) ch_versions = ch_versions.mix(MOSDEPTH.out.versions) // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // + BAM_STATS_SAMTOOLS ( ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel ch_fasta From a402d695cdbc2dbf59b5623bb103d3b64e892857 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 3 Apr 2025 11:03:59 +0200 Subject: [PATCH 159/557] added example wakhan code --- modules/local/wakhan/main.nf | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 84713fd2..1e673224 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -53,6 +53,15 @@ process WAKHAN { ${phased_vcf} \\ ${args} \\ --threads ${task.cpus} + + #micromamba run -n wakhan wakhan \ + #--target-bam /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/CLAIR3/D0/D0_long_tagged_bam_prefix.bam \ + #--breakpoints /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/Severus_run2/all_SVs/severus_all.vcf \ + #--normal-phased-vcf /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/CLAIR3/normal_bam/phased_merge_output.vcf.gz \ + #--genome-name D0 \ + #--out-dir-plots ${VSC_SCRATCH}/wakhan_plots \ + #--reference /staging/leuven/stg_00096/references/GRCh38.alt-masked-V2-noALT/fasta/Homo_sapiens_assembly38_masked_noALT.fa \ + #--threads 12 cat <<-END_VERSIONS > versions.yml From f39b4c829c522355036e74e74bc3d96fad550f7b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 3 Apr 2025 11:10:40 +0200 Subject: [PATCH 160/557] added TODO and versioning of future wakhan --- workflows/lr_somatic.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 875be48c..6c041414 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -281,6 +281,8 @@ workflow LR_SOMATIC { ch_fasta ) + ch_versions = ch_versions.mix(WAKHAN.out.versions) + */ // // Collate and save software versions @@ -297,6 +299,8 @@ workflow LR_SOMATIC { // // MODULE: MultiQC // + // TODO: Add channels that need to be fed into multiqc still. E.g. QC output + // Check what is compatible with multiqc ch_multiqc_config = Channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? From a84b4b4e5ab69d44d07557af71fddc4e090a929c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 4 Apr 2025 15:13:31 +0200 Subject: [PATCH 161/557] Updates to nf-core compatible clair modules --- modules/local/clair3/main.nf | 96 +++++----- modules/local/clair3/meta.yml | 174 ++++++++++++------ modules/local/clair3/tests/main.nf.test | 158 +++++++++++++--- modules/local/clair3/tests/main.nf.test.snap | 100 ++++++++++ modules/local/clairs/environment.yml | 7 - modules/local/clairs/main.nf | 104 +++-------- modules/local/clairs/meta.yml | 116 +++++++----- modules/local/clairs/tests/main.nf.test | 72 +++++--- modules/local/clairs/tests/main.nf.test.snap | 132 +++++++++++++ modules/local/clairsto/environment.yml | 7 - modules/local/clairsto/main.nf | 103 +++-------- modules/local/clairsto/meta.yml | 130 ++++++++----- modules/local/clairsto/tests/main.nf.test | 81 ++++++-- .../local/clairsto/tests/main.nf.test.snap | 32 ++++ 14 files changed, 866 insertions(+), 446 deletions(-) create mode 100644 modules/local/clair3/tests/main.nf.test.snap delete mode 100644 modules/local/clairs/environment.yml create mode 100644 modules/local/clairs/tests/main.nf.test.snap delete mode 100644 modules/local/clairsto/environment.yml create mode 100644 modules/local/clairsto/tests/main.nf.test.snap diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index aa576d01..22007298 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,85 +1,73 @@ process CLAIR3 { tag "$meta.id" - label 'process_very_high' - + label 'process_high' + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clair3:v1.0.10': - 'hkubal/clair3:v1.0.10' }" + 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': + 'biocontainers/clair3:1.0.10--py39hd649744_1' }" input: - tuple val(meta), path(bam), path(bam_bai) - tuple val(meta2), path(ref) - tuple val(meta3), path(ref_index) - + tuple val(meta), path(bam), path(bai), val(packaged_model), path(user_model), val(platform) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*merge_output.vcf.gz"), emit: germline_vcf - - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when script: - def modelMap = [ - 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', - 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', - 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', - 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', - 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', - 'hifi_revio' : 'hifi_revio' - ] - def model = modelMap.get(meta.basecall_model.toString().trim()) - def platform = (meta.platform == "pb") ? "hifi" : "ont" - - if (!model in modelMap.keySet() ) { - model = 'r1041_e82_400bps_sup_v500' - log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" + def model = "" + if (!user_model) { + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + model = "\${CONDA_PREFIX}/bin/models/${packaged_model}" + } + else { + model = "/usr/local/bin/models/$packaged_model" + } } - else { - log.info "Using ${model} model for Clair3" + if (!packaged_model) { + model = "$user_model" } - - // Download model command - def download_prefix = ( model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) - - - // Specify runtype for conda vs docker/singularity - // Both the initial clair3 call and the model_path call will not work with conda - //TODO: - - + if (packaged_model && user_model) { + error "Two models specified $user_model and $packaged_model, specify one of them." + } + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ - wget ${download_prefix}/${model}.tar.gz - tar -xvzf ${model}.tar.gz - - /opt/bin/run_clair3.sh \\ - --bam_fn=${bam} \\ - --ref_fn=${ref} \\ - --threads=${task.cpus} \\ - --platform="${platform}" \\ - --model_path="${model}" \\ - --use_longphase_for_intermediate_phasing \\ - --output . + run_clair3.sh \\ + --bam_fn=$bam \\ + --ref_fn=$reference \\ + --threads=$task.cpus \\ + --output=. \\ + --platform=$platform \\ + --model=$model \\ + $args cat <<-END_VERSIONS > versions.yml "${task.process}": - clair3: \$( /opt/bin/run_clair3.sh --version |& sed 's/Clair3 v//' ) + clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') END_VERSIONS """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.merge_output.vcf.gz + echo "" | gzip > ${prefix}.phased_merge_output.vcf.gz + touch ${prefix}.phased_merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}.merge_output.vcf.gz + touch ${prefix}.merge_output.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": - clair3: \$( /opt/bin/run_clair3.sh --version |& sed 's/Clair3 v//' ) + clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') END_VERSIONS """ } diff --git a/modules/local/clair3/meta.yml b/modules/local/clair3/meta.yml index 99457104..5ba5105b 100644 --- a/modules/local/clair3/meta.yml +++ b/modules/local/clair3/meta.yml @@ -1,69 +1,123 @@ ---- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "clair3" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Clair3 is a germline small variant caller for long-reads keywords: - - sort - - example - - genomics +- germline +- variant +- Indel +- SNV tools: - - "clair3": - ## TODO nf-core: Add a description and other details for the software below - description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≤30-fold of ONT data (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment as input for deep-learning based long-read small variant calling. Clair3 is simple and modular for easy deployment and integration." - homepage: "None" - documentation: "None" - tool_dev_url: "None" - doi: "" - licence: ['BSD-3-clause'] - identifier: biotools:clair3 +- "clair3": + description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER + (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≤30-fold of ONT data + (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally + four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment + as input for deep-learning based long-read small variant calling. Clair3 is + simple and modular for easy deployment and integration." + homepage: "https://github.com/HKU-BAL/Clair3" + documentation: "https://github.com/HKU-BAL/Clair3" + tool_dev_url: "https://github.com/HKU-BAL/Clair3" + doi: "10.1038/s43588-022-00387-x" + licence: ['BSD-3-clause'] + identifier: biotools:clair3 -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - -## TODO nf-core: Add a description of all of the variables used as output -output: +- - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" - + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - bai: + type: file + description: BAM index file + pattern: "*.bai" + - packaged_model: + type: string + description: string containing the name of a prepackaged Clair3 model + full list of models and their descriptions is provided at https://github.com/HKU-BAL/Clair3?tab=readme-ov-file#pre-trained-models + - user_model: + type: directory + description: directory containing Clair3 model files + - platform: + type: string + description: val in ['hifi','ont', 'ilmn'] to indicate pacbio, ONT, or illumina + respectively +- - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - reference: + type: file + description: reference fasta file + pattern: "*.fasta" +- - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - index: + type: file + description: reference index file + pattern: "*.fai" +output: +- vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - '*merge_output.vcf.gz': + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" +- tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - '*merge_output.vcf.gz.tbi': + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" +- phased_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - '*phased_merge_output.vcf.gz': + type: file + description: phased vcf + pattern: "*.{vcf,vcf.gz}" +- phased_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - '*phased_merge_output.vcf.gz.tbi': + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" +- versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@robert-a-forsyth" +- "@robert-a-forsyth" maintainers: - - "@robert-a-forsyth" +- "@robert-a-forsyth" diff --git a/modules/local/clair3/tests/main.nf.test b/modules/local/clair3/tests/main.nf.test index 72e44827..8e9c8cc3 100644 --- a/modules/local/clair3/tests/main.nf.test +++ b/modules/local/clair3/tests/main.nf.test @@ -1,5 +1,3 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test clair3 nextflow_process { name "Test Process CLAIR3" @@ -7,25 +5,84 @@ nextflow_process { process "CLAIR3" tag "modules" - tag "modules_" + tag "modules_nfcore" tag "clair3" + tag "untar" - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { + setup { + run("UNTAR") { + script "../../../../modules/nf-core/untar/main.nf" + process { + """ + input[0] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'generic/models/clair3.hifi.tar.gz', checkIfExists: true) + ] + """ + } + } + } + test("sarscov2 - bam - user_model") { - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + when { + process { + """ + def model_path = UNTAR.out.untar + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [], + ]) + .join(UNTAR.out.untar) + .combine(Channel.of(['hifi'])) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf.collect { file(it[1]).getName() }, + process.out.tbi.collect { file(it[1]).getName() }, + process.out.versions, + process.out.phased_vcf.collect { file(it[1]).getName() }, + process.out.phased_tbi.collect { file(it[1]).getName() }) + .match()} + ) + } + + } + + test("sarscov2 - bam - packaged_model") { when { process { """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map + input[0] = Channel.of([ + [ id:'test' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + 'hifi_revio', + [], + 'hifi', + ]) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), ] """ } @@ -34,15 +91,52 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + { assert snapshot( + process.out.vcf.collect { file(it[1]).getName() }, + process.out.tbi.collect { file(it[1]).getName() }, + process.out.versions, + process.out.phased_vcf.collect { file(it[1]).getName() }, + process.out.phased_tbi.collect { file(it[1]).getName() }) + .match()} + ) + } + + } + + test("sarscov2 - bam - both") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + ['hifi_revio'], + ]) + .join(UNTAR.out.untar) + .combine(Channel.of(['hifi'])) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.failed } ) } } - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { options "-stub" @@ -50,11 +144,22 @@ nextflow_process { when { process { """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map + def model_path = UNTAR.out.untar + input[0] = Channel.of([ + [ id:'test' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [], + ]) + .join(UNTAR.out.untar) + .combine(Channel.of(['hifi'])) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), ] """ } @@ -63,11 +168,16 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.phased_vcf, + process.out.phased_tbi, + process.out.versions) + .match()} ) } } -} +} \ No newline at end of file diff --git a/modules/local/clair3/tests/main.nf.test.snap b/modules/local/clair3/tests/main.nf.test.snap new file mode 100644 index 00000000..e9b68be8 --- /dev/null +++ b/modules/local/clair3/tests/main.nf.test.snap @@ -0,0 +1,100 @@ +{ + "sarscov2 - bam - stub": { + "content": [ + [ + [ + { + "id": "test" + }, + [ + "test.merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test.phased_merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ] + ], + [ + [ + { + "id": "test" + }, + [ + "test.merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.phased_merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + [ + [ + { + "id": "test" + }, + "test.phased_merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + { + "id": "test" + }, + "test.phased_merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + "versions.yml:md5,10928c13418eced076964d86249aeaf8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-04T09:30:51.327348" + }, + "sarscov2 - bam - packaged_model": { + "content": [ + [ + "merge_output.vcf.gz" + ], + [ + "merge_output.vcf.gz.tbi" + ], + [ + "versions.yml:md5,10928c13418eced076964d86249aeaf8" + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-04T09:30:16.61651" + }, + "sarscov2 - bam - user_model": { + "content": [ + [ + "merge_output.vcf.gz" + ], + [ + "merge_output.vcf.gz.tbi" + ], + [ + "versions.yml:md5,10928c13418eced076964d86249aeaf8" + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-04T09:29:58.640181" + } +} \ No newline at end of file diff --git a/modules/local/clairs/environment.yml b/modules/local/clairs/environment.yml deleted file mode 100644 index 4b3c9d37..00000000 --- a/modules/local/clairs/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - "YOUR-TOOL-HERE" diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index b5a5a971..95c8fe0c 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -1,114 +1,58 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process CLAIRS { tag "$meta.id" - label 'process_very_high' + label 'process_high' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. - conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clairs:v0.4.1': - 'hkubal/clairs:v0.4.1' }" + 'docker.io/hkubal/clairs:v0.4.1': + 'docker.io/hkubal/clairs:v0.4.1' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(tumor_bam), path(tumor_bai),path(normal_bam), path(normal_bai) - tuple val(meta2), path(ref) - tuple val(meta3), path(ref_index) + tuple val(meta), path(tumor_bam), path(tumor_bai), path(normal_bam), path(normal_bai), val(model) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*.vcf.gz"), emit: somatic_vcf - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when script: - def modelMap = [ - 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'hifi_revio' : 'hifi_revio_ss' - - ] - - // if method meta data is pb, default to the revio model else go to the map - def model = modelMap.get(meta.basecall_model.toString().trim()) + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" - if (!model in modelMap.keySet() ) { - model = 'ont_r10_dorado_sup_5khz_ssrs' - log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" - } - else { - log.info "Using ${model} model for Clair3" - } - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ - /opt/bin/run_clairs \\ + /opt/bin/run_clairs \ --tumor_bam_fn $tumor_bam \\ --normal_bam_fn $normal_bam \\ - --ref_fn $ref \\ - --threads ${task.cpus} \\ - --platform ${model} \\ + --ref_fn $reference \\ + --threads $task.cpus \\ + --platform $model \\ --output_dir . \\ - --use_heterozygous_indel_for_intermediate_phasing True \\ - --use_longphase_for_intermediate_haplotagging True \\ - --conda_prefix /opt/conda/envs/clairs + --output_prefix $prefix \\ + $args cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$( /opt/bin/run_clairs --version |& sed 's/ClairS v//' ) + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d; s|run_clairs ||' +) END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ - touch ${prefix}.bam + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$( /opt/bin/run_clairs --version |& sed 's/ClairS v//' ) + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d; s|run_clairs ||' +) END_VERSIONS """ } diff --git a/modules/local/clairs/meta.yml b/modules/local/clairs/meta.yml index 604a3aa3..46c5b6ce 100644 --- a/modules/local/clairs/meta.yml +++ b/modules/local/clairs/meta.yml @@ -1,68 +1,92 @@ ---- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "clairs" -## TODO nf-core: Add a description of the module and list keywords description: write your description here keywords: - - sort - - example - - genomics + - small + - variant + - SNV + - indel tools: - "clairs": - ## TODO nf-core: Add a description and other details for the software below description: "" - homepage: "" - documentation: "" - tool_dev_url: "" - doi: "" - licence: - identifier: + homepage: "https://github.com/HKU-BAL/ClairS" + documentation: "https://github.com/HKU-BAL/ClairS" + tool_dev_url: "https://github.com/HKU-BAL/ClairS" + doi: "10.1101/2023.08.17.553778 " + licence: ["BSD-3-clause"] + identifier: biotools:clairs -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - - bam: + - tumor_bam: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - -## TODO nf-core: Add a description of all of the variables used as output -output: - - bam: - #Only when we have meta - - meta: + description: | + BAM file for tumor sample + pattern: "*.vcf.gz" + - tumor_bai: + type: file + description: | + index file for tumor BAM file + pattern: "*.bai" + - normal_bam: + type: file + description: | + BAM file for normal sample + pattern: "*.bam" + - normal_bai: + type: file + description: | + index file for normal BAM file + pattern: "*.bai" + - model: + type: string + description: | + Name for ClairS model + - - meta2: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": + - reference: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - - versions: - - "versions.yml": + description: | + A reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + - index: type: file - description: File containing software versions - pattern: "versions.yml" - + description: | + index file for the reference fasta file + pattern: "*.fai" +output: + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz": + type: file + description: VCF file containing small somatic variants + pattern: "*.vcf.gz" + - tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz.tbi": + type: file + description: VCF index file for small somatic variants + pattern: "*.vcf.gz.tbi" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/clairs/tests/main.nf.test b/modules/local/clairs/tests/main.nf.test index 7c7a3032..b17c769d 100644 --- a/modules/local/clairs/tests/main.nf.test +++ b/modules/local/clairs/tests/main.nf.test @@ -1,5 +1,3 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test clairs nextflow_process { name "Test Process CLAIRS" @@ -7,25 +5,29 @@ nextflow_process { process "CLAIRS" tag "modules" - tag "modules_" + tag "modules_nfcore" tag "clairs" - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + test("bam - packaged_model") { when { process { """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + input[0] = Channel.of([ + [ id:'test' ], // meta map + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam.bai', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), + 'hifi_revio_ssrs', + ]) + input[1] = [ + [ id:'test'], + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa.fai', checkIfExists: true), ] """ } @@ -34,27 +36,38 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + { assert snapshot( + process.out.vcf.collect { file(it[1]).getName() }, + process.out.tbi.collect { file(it[1]).getName() }, + process.out.versions) + .match()} ) } } - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { + test("bam - stub") { options "-stub" when { process { """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + input[0] = Channel.of([ + [ id:'test' ], // meta map + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam.bai', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), + 'hifi_revio_ssrs', + ]) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), ] """ } @@ -63,11 +76,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.versions,) + .match()} ) } } -} +} \ No newline at end of file diff --git a/modules/local/clairs/tests/main.nf.test.snap b/modules/local/clairs/tests/main.nf.test.snap new file mode 100644 index 00000000..a7b3da39 --- /dev/null +++ b/modules/local/clairs/tests/main.nf.test.snap @@ -0,0 +1,132 @@ +{ + "sarscov2 - bam - packaged_model": { + "content": [ + [ + "test.vcf.gz" + ], + [ + "test.vcf.gz.tbi" + ], + [ + "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-04T11:11:15.839049" + }, + "sarscov2 - bam - stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "/Users/u0155044/Documents/modules/.nf-test/tests/78916ca2ff4be4b934d0f97d43dddaa7/work/0d/d8ad17c1547262fafc3c22ee0ba901/test.vcf.gz" + ] + ], + [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + null, + null, + [ + "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-04T11:11:32.911824" + }, + "sarscov2 - bam - user_model": { + "content": [ + [ + + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-18T14:07:40.253357" + }, + "sarscov2 - bam - both": { + "content": [ + [ + + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-18T14:07:50.758312" + }, + "bam - stub": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-04-04T11:45:37.043057294" + }, + "bam - packaged_model": { + "content": [ + [ + "test.vcf.gz" + ], + [ + "test.vcf.gz.tbi" + ], + [ + "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-04-04T11:20:25.090597153" + } +} \ No newline at end of file diff --git a/modules/local/clairsto/environment.yml b/modules/local/clairsto/environment.yml deleted file mode 100644 index 4b3c9d37..00000000 --- a/modules/local/clairsto/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - "YOUR-TOOL-HERE" diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 906badff..9e7a739d 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -1,104 +1,61 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. process CLAIRSTO { tag "$meta.id" - label 'process_very_high' + label 'process_high' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. - conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clairs-to:v0.4.0': - 'hkubal/clairs-to:v0.4.0' }" + 'docker.io/hkubal/clairs-to:v0.4.0': + 'docker.io/hkubal/clairs-to:v0.4.0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. - tuple val(meta), path(tumor_bam), path(tumor_bai) - tuple val(meta2), path(ref) - tuple val(meta3), path(ref_index) + tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) + tuple val(meta2), path(reference) + tuple val(meta3), path(index) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*snv.vcf.gz"), path("*indel.vcf.gz"), emit: vcfs - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val(meta), path("*/indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("*/indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("*/snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("*/snv.vcf.gz.tbi"), emit: snv_tbi when: task.ext.when == null || task.ext.when script: - def platform = meta.platform - // Contains ClairS-TO models appropriate for specs in the schema - def modelMap = [ - 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'hifi_revio' : 'hifi_revio_ss' - ] - - // if method meta data is pb, default to the revio model else go to the map - def model = modelMap.get(meta.basecall_model.toString().trim()) - - if (!model in modelMap.keySet() ) { - model = 'ont_r10_dorado_sup_5khz_ssrs' - log.warn "Warning: ClairS-TO has no appropriate models for ${model} defaulting to dna_r10.4.1_e8.2_400bps_sup@v5.0.0 for Clair3" - } - else { - log.info "Using ${model} model for Clair3" - } + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' """ - /opt/bin/run_clairs_to \\ - --tumor_bam_fn ${tumor_bam} \\ - --ref_fn ${ref} \\ - --threads ${task.cpus} \\ - --platform ${model} \\ - --remove_intermediate_dir \\ - --output_dir . \\ - --use_longphase_for_intermediate_phasing True \\ - --use_longphase_for_intermediate_haplotagging True \\ - --conda_prefix /opt/micromamba/envs/clairs-to + /opt/bin/run_clairs_to \ + --tumor_bam_fn $tumor_bam \\ + --ref_fn $reference \\ + --platform $model \\ + --threads $task.cpus \\ + --output_dir $prefix \\ + $conda_prefix \\ + $args \\ cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs_to --version | sed 's/ClairS-TO version: //') + clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') END_VERSIONS """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def output_dir = "${prefix}_clairs_output" + """ - mkdir -p ${output_dir} - touch ${output_dir}/output.vcf.gz + mkdir -p output + echo "" | gzip > output/snv.vcf.gz + touch output/snv.vcf.gz.tbi + echo "" | gzip > output/indel.vcf.gz + touch output/indel.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs_to --version | sed 's/ClairS-TO version: //') + clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') END_VERSIONS """ } diff --git a/modules/local/clairsto/meta.yml b/modules/local/clairsto/meta.yml index 462dde3b..f283f56a 100644 --- a/modules/local/clairsto/meta.yml +++ b/modules/local/clairsto/meta.yml @@ -1,68 +1,104 @@ ---- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "clairsto" -## TODO nf-core: Add a description of the module and list keywords description: write your description here keywords: - - sort - - example - - genomics + - small + - variant + - SNV + - indel + - tumor-only tools: - - "clairsto": - ## TODO nf-core: Add a description and other details for the software below + - "clairs": description: "" - homepage: "" - documentation: "" - tool_dev_url: "" - doi: "" - licence: - identifier: + homepage: "https://github.com/HKU-BAL/ClairS-TO" + documentation: "https://github.com/HKU-BAL/ClairS-TO" + tool_dev_url: "https://github.com/HKU-BAL/ClairS-TO" + doi: "10.1101/2023.08.17.553778 " + licence: ["BSD-3-clause"] + identifier: biotools:clairsto -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - - bam: + - tumor_bam: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - -## TODO nf-core: Add a description of all of the variables used as output -output: - - bam: - #Only when we have meta - - meta: + description: | + BAM file for tumor sample + pattern: "*.vcf.gz" + - tumor_bai: + type: file + description: | + index file for tumor BAM file + pattern: "*.bai" + - model: + type: string + description: | + Name for ClairS model + - - meta2: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": + - reference: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - - versions: - - "versions.yml": + description: | + A reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + - index: type: file - description: File containing software versions - pattern: "versions.yml" - + description: | + index file for the reference fasta file + pattern: "*.fai" +output: + - indel_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - "*/indel.vcf.gz": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - indel_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - "*/indel.vcf.gz.tbi": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - snv_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - "*/snv.vcf.gz": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz" + - snv_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" + - "*/snv.vcf.gz.tbi": + type: map + description: | + Groovy Map containing sample information + pattern: "*.vcf.gz.tbi" authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/clairsto/tests/main.nf.test b/modules/local/clairsto/tests/main.nf.test index 0b18e45d..75e14709 100644 --- a/modules/local/clairsto/tests/main.nf.test +++ b/modules/local/clairsto/tests/main.nf.test @@ -1,32 +1,31 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test clairsto nextflow_process { - name "Test Process CLAIRSTO" + name "Test Process CLAIRSTP" script "../main.nf" process "CLAIRSTO" tag "modules" - tag "modules_" + tag "modules_nfcore" tag "clairsto" - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + test("bam - packaged_model") { when { process { """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam), - file(/staging/leuven/stg_00096/references/GRCh38.alt-masked-V2-noALT/fasta/Homo_sapiens_assembly38_masked_noALT.fasta) + input[0] = Channel.of([ + [ id:'test' ], // meta map + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), + 'hifi_revio_ssrs', + ]) + input[1] = [ + [ id:'test'], + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa.fai', checkIfExists: true), ] """ } @@ -35,11 +34,53 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + { assert snapshot( + process.out.vcf.collect { file(it[1]).getName() }, + process.out.tbi.collect { file(it[1]).getName() }, + process.out.versions) + .match()} ) } } + test("bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), + file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), + 'hifi_revio_ssrs', + ]) + input[1] = [ + [ id:'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + ] + input[2] = [ + [ id: 'test'], + file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.phased_vcf, + process.out.phased_tbi, + process.out.versions,) + .match()} + ) + } + + } +} \ No newline at end of file diff --git a/modules/local/clairsto/tests/main.nf.test.snap b/modules/local/clairsto/tests/main.nf.test.snap new file mode 100644 index 00000000..253bcf17 --- /dev/null +++ b/modules/local/clairsto/tests/main.nf.test.snap @@ -0,0 +1,32 @@ +{ + "bam - stub": { + "content": [ + null, + null, + null, + null, + null + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-04-04T13:57:26.590547195" + }, + "bam - packaged_model": { + "content": [ + [ + + ], + [ + + ], + null + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-04-04T13:57:14.452606576" + } +} \ No newline at end of file From e19ea2f69e60b4758e7758d9014603930ac95b5c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 13:06:41 +0200 Subject: [PATCH 162/557] added ascat parameter --- conf/test.config | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/conf/test.config b/conf/test.config index 7a6514a9..fa4d970f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,19 +23,14 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - input ="$projectDir/assets/samplesheet.csv" - // Genome references - fasta = "/staging/leuven/stg_00096/home/hackathon/references/CHM13V2_maskedY_rCRS_chr19.fa" - pon_file = "/staging/leuven/stg_00096/home/hackathon/PoN_1000G_chm13.tsv.gz" - bed_file = "/staging/leuven/stg_00096/home/hackathon/chm13.bed" + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" + pon_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/PoN_1000G_chm13.tsv.gz" + bed_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/chm13.bed" // ASCAT files - ascat_allele_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_alleles_CHM13.zip" - ascat_loci_files = "/staging/leuven/stg_00096/home/hackathon/ASCAT_files/G1000_loci_CHM13.zip" - ascat_chroms = "19" - //PON_file = "https://github.com/KolmogorovLab/Severus/raw/main/pon/PoN_1000G_chm13.tsv.gz" - //bed_file = "https://github.com/KolmogorovLab/Severus/raw/main/vntrs/chm13.bed" + ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" + ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + ascat_chroms = "19" + ascat_min_counts = "2" } From c225fb7758a955f3dc423316d64e40d61855117a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 13:06:57 +0200 Subject: [PATCH 163/557] fixed some publishdirs for modules --- conf/modules.config | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 8f68c94c..b9d217fb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -150,6 +150,18 @@ process { ] } + withName: '.*:PREPARE_REFERENCE_FILES' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:UNZIP_.*' { + publishDir = [ + enabled: false + ] + } + withName: '.*:METAEXTRACT' { publishDir = [ path: { "${params.outdir}/${meta.id}/metaextract" }, @@ -171,7 +183,11 @@ process { "longread_bins": params.ascat_longread_bins, "allele_counter_flags": params.ascat_allelecounter_flags ] } - + publishDir = [ + path: { "${params.outdir}/${meta.id}/ascat" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } withName : '.*:WAKHAN' { From 71113285b13cac6c2c37663185a1fdee9eca1c14 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:10:49 +0200 Subject: [PATCH 164/557] added ascat skip in prepare reference files --- subworkflows/local/prepare_reference_files.nf | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 9e7eb5aa..664c2e09 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -49,33 +49,35 @@ workflow PREPARE_REFERENCE_FILES { // // prepare ascat and controlfreec reference files - if (!ascat_alleles) allele_files = Channel.empty() - else if (ascat_alleles.endsWith(".zip")) { - UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() - ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) - } else allele_files = Channel.fromPath(ascat_alleles).collect() + if ( !params.skip_ascat ) { + if (!ascat_alleles) allele_files = Channel.empty() + else if (ascat_alleles.endsWith(".zip")) { + UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) + } else allele_files = Channel.fromPath(ascat_alleles).collect() - if (!ascat_loci) loci_files = Channel.empty() - else if (ascat_loci.endsWith(".zip")) { - UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() - ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) - } else loci_files = Channel.fromPath(ascat_loci).collect() + if (!ascat_loci) loci_files = Channel.empty() + else if (ascat_loci.endsWith(".zip")) { + UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) + } else loci_files = Channel.fromPath(ascat_loci).collect() - if (!ascat_loci_gc) gc_file = Channel.value([]) - else if ( ascat_loci_gc.endsWith(".zip") ) { - UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() - ch_versions = ch_versions.mix(UNZIP_GC.out.versions) - } else gc_file = Channel.fromPath(ascat_loci_gc).collect() + if (!ascat_loci_gc) gc_file = Channel.value([]) + else if ( ascat_loci_gc.endsWith(".zip") ) { + UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_GC.out.versions) + } else gc_file = Channel.fromPath(ascat_loci_gc).collect() - if (!ascat_loci_rt) rt_file = Channel.value([]) - else if (ascat_loci_rt.endsWith(".zip")) { - UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() - ch_versions = ch_versions.mix(UNZIP_RT.out.versions) - } else rt_file = Channel.fromPath(ascat_loci_rt).collect() + if (!ascat_loci_rt) rt_file = Channel.value([]) + else if (ascat_loci_rt.endsWith(".zip")) { + UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + ch_versions = ch_versions.mix(UNZIP_RT.out.versions) + } else rt_file = Channel.fromPath(ascat_loci_rt).collect() + } emit: prepped_fasta = ch_prepared_fasta From 7a2d7d0c4a928874041a55e40e4df1f2084efc48 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:25:07 +0200 Subject: [PATCH 165/557] added skip params --- nextflow.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index e20a3136..045c015e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,10 +19,13 @@ params { igenomes_ignore = false // Skip options + skip_qc = false + skip_cramino = false + skip_mosdepth = false + skip_bamstats = false skip_ascat = false skip_wakhan = false skip_severus = false - skip_smallvariants = false skip_fibertoolsrs_fire = false // minimap2 options From 2e827cff12504ae2a3f8eaf0ef8dd32843094f7a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:25:15 +0200 Subject: [PATCH 166/557] added skips in workflow --- workflows/lr_somatic.nf | 108 +++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 41 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 6c041414..db320ce1 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -98,9 +98,13 @@ workflow LR_SOMATIC { // MODULE: CRAMINO // - CRAMINO_PRE ( ch_cat_ubams ) + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_PRE ( ch_cat_ubams ) + + ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) + } - ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) // // SUBWORKFLOW: PREPARE_REFERENCE_FILES @@ -208,68 +212,87 @@ workflow LR_SOMATIC { // MODULE: SEVERUS // - SEVERUS ( - severus_reformat, - [[:], params.bed_file, params.pon_file] - ) - - ch_versions = ch_versions.mix(SEVERUS.out.versions) + if (!params.skip_severus) { + + SEVERUS ( + severus_reformat, + [[:], params.bed_file, params.pon_file] + ) + + ch_versions = ch_versions.mix(SEVERUS.out.versions) + } // // MODULE: CRAMINO // - CRAMINO_POST ( ch_minimap_bam ) + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_POST ( ch_minimap_bam ) - ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + } // // Module: MOSDEPTH // - // prepare mosdepth input channel: we need to specify compulsory path to bed as well - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) - .map { meta, bam, bai -> [meta, bam, bai, []] } - .set { ch_mosdepth_in } + if (!params.skip_qc && params.skip_mosdepth) { + + // prepare mosdepth input channel: we need to specify compulsory path to bed as well + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + .map { meta, bam, bai -> [meta, bam, bai, []] } + .set { ch_mosdepth_in } - MOSDEPTH ( - ch_mosdepth_in, - ch_fasta - ) + MOSDEPTH ( + ch_mosdepth_in, + ch_fasta + ) - ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + } + // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // - BAM_STATS_SAMTOOLS ( - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel - ch_fasta - ) + if (!params.skip_qc && params.skip_bamstats ) { + + BAM_STATS_SAMTOOLS ( + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_fasta + ) + + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + } - ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) // // MODULE: ASCAT // - severus_reformat - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] - } - .set { ascat_ch } - ASCAT ( - ascat_ch, - allele_files, - loci_files, - [], - [], - [], - [] - ) + if (!skip_ascat) { + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set { ascat_ch } + + ASCAT ( + ascat_ch, + allele_files, + loci_files, + [], + [], + [], + [] + ) + + ch_versions = ch_versions.mix(ASCAT.out.versions) + } - ch_versions = ch_versions.mix(ASCAT.out.versions) + /* // @@ -299,8 +322,6 @@ workflow LR_SOMATIC { // // MODULE: MultiQC // - // TODO: Add channels that need to be fed into multiqc still. E.g. QC output - // Check what is compatible with multiqc ch_multiqc_config = Channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? @@ -330,9 +351,14 @@ workflow LR_SOMATIC { ) // Collect MultiQC files + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) + + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), From 7ce42b96ce3b0ed9fd5528c76959975cf5055640 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:25:53 +0200 Subject: [PATCH 167/557] added skips in workflow --- workflows/lr_somatic.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index db320ce1..ea152eb0 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -251,7 +251,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(MOSDEPTH.out.versions) } - // // SUBWORKFLOW: BAM_STATS_SAMTOOLS @@ -267,7 +266,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) } - // // MODULE: ASCAT // @@ -292,19 +290,21 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(ASCAT.out.versions) } - - /* // // MODULE: WAKHAN // - WAKHAN ( - severus_reformat, - ch_fasta - ) - - ch_versions = ch_versions.mix(WAKHAN.out.versions) + if (!skip_wakhan) { + + WAKHAN ( + severus_reformat, + ch_fasta + ) + + ch_versions = ch_versions.mix(WAKHAN.out.versions) + } + */ // From 44452540237a1329f4d2c513f31f35ed23a311ab Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:34:18 +0200 Subject: [PATCH 168/557] skip changes --- nextflow.config | 3 +-- workflows/lr_somatic.nf | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 045c015e..a8a03b6a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,8 +25,7 @@ params { skip_bamstats = false skip_ascat = false skip_wakhan = false - skip_severus = false - skip_fibertoolsrs_fire = false + skip_fiber = false // minimap2 options minimap2_ont_model = null diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index ea152eb0..457b8033 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -122,7 +122,7 @@ workflow LR_SOMATIC { ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai - // ASCAT files + // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files loci_files = PREPARE_REFERENCE_FILES.out.loci_files gc_file = PREPARE_REFERENCE_FILES.out.gc_file From 4d98524908062f8d27b026fe161ef2ef7b7722a8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 14:48:48 +0200 Subject: [PATCH 169/557] added descriptions and grouping using nf-core pipelines schema build --- nextflow_schema.json | 156 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index a33030c5..154832e5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -82,6 +82,150 @@ } } }, + "minimap2_options": { + "title": "minimap2 options", + "type": "object", + "description": "", + "default": "", + "properties": { + "minimap2_ont_model": { + "type": "string", + "description": "Minimap ont model to use" + }, + "minimap2_pb_model": { + "type": "string", + "description": "Minimap Pacbio model to use" + }, + "save_secondary_alignment": { + "type": "boolean", + "default": true, + "description": "Whether to save secondary alignments" + } + } + }, + "severus_parameters": { + "title": "Severus parameters", + "type": "object", + "description": "Severus specific parameters", + "default": "", + "properties": { + "pon_file": { + "type": "string", + "description": "Path to Panel of Normal files" + }, + "bed_file": { + "type": "string", + "description": "Path to bed file" + }, + "centromere_bed": { + "type": "string", + "default": "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed", + "description": "Path to centromere locaiton bed file" + } + } + }, + "ascat_parameters": { + "title": "ASCAT parameters", + "type": "object", + "description": "ASCAT specific parameters", + "default": "", + "properties": { + "ascat_ploidy": { + "type": "string", + "description": "Enforce a ploidy" + }, + "ascat_purity": { + "type": "string", + "description": "Enforce a purity" + }, + "ascat_min_base_qual": { + "type": "integer", + "default": 20, + "description": "Minimum base quality for allelecounter" + }, + "ascat_min_counts": { + "type": "integer", + "default": 10, + "description": "Minimum counts for allelecounter" + }, + "ascat_min_map_qual": { + "type": "integer", + "default": 10, + "description": "Minimum mapping quality for allelecounter" + }, + "ascat_longread_bins": { + "type": "integer", + "default": 1000, + "description": "Binsize for long-read" + }, + "ascat_allelecounter_flags": { + "type": "string", + "default": "-f 0", + "description": "Additional allelecounter flags to use" + }, + "ascat_chroms": { + "type": "string", + "description": "Chromosomes to process (automatically inferred, only use if you want to run on a subset)" + }, + "genome_name": { + "type": "string", + "default": "CHM13", + "description": "Genome name (hg19, hg38, or CHM13)" + }, + "ascat_allele_files": { + "type": "string", + "description": "Path to (zip) of allele files" + }, + "ascat_loci_files": { + "type": "string", + "description": "path to (zip) of loci files" + }, + "ascat_gc_files": { + "type": "string", + "description": "Path to (zip) of GC files" + }, + "ascat_rt_files": { + "type": "string", + "description": "path to (zip) of RT files" + } + } + }, + "skip_options": { + "title": "Skip options", + "type": "object", + "description": "Define whether to skip certain steps", + "default": "", + "properties": { + "skip_qc": { + "type": "boolean", + "description": "Skips all QC steps" + }, + "skip_cramino": { + "type": "boolean", + "description": "Skips Cramino" + }, + "skip_mosdepth": { + "type": "boolean", + "description": "Skips Mosdepth" + }, + "skip_bamstats": { + "type": "boolean", + "description": "Skips samtools flagstat, stats, and idxstats" + }, + "skip_wakhan": { + "type": "boolean", + "description": "Skips wakhan" + }, + "skip_fiber": { + "type": "boolean", + "description": "Skip Fibertools steps" + }, + "skip_ascat": { + "type": "boolean", + "description": "Skip ASCAT" + } + } + }, "institutional_config_options": { "title": "Institutional config options", "type": "object", @@ -235,6 +379,18 @@ { "$ref": "#/$defs/reference_genome_options" }, + { + "$ref": "#/$defs/minimap2_options" + }, + { + "$ref": "#/$defs/severus_parameters" + }, + { + "$ref": "#/$defs/ascat_parameters" + }, + { + "$ref": "#/$defs/skip_options" + }, { "$ref": "#/$defs/institutional_config_options" }, From 218ad9fbd5b3620349d9af7682b6505a15d21d30 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 7 Apr 2025 15:06:48 +0200 Subject: [PATCH 170/557] schema updated --- nextflow_schema.json | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 154832e5..bb08dd6a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -116,13 +116,9 @@ "bed_file": { "type": "string", "description": "Path to bed file" - }, - "centromere_bed": { - "type": "string", - "default": "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed", - "description": "Path to centromere locaiton bed file" } - } + }, + "required": ["pon_file", "bed_file"] }, "ascat_parameters": { "title": "ASCAT parameters", @@ -190,6 +186,18 @@ } } }, + "wakhan_parameters": { + "title": "Wakhan parameters", + "type": "object", + "description": "", + "default": "", + "properties": { + "centromere_bed": { + "type": "string", + "description": "Path to centromere location bed file for Wakhan" + } + } + }, "skip_options": { "title": "Skip options", "type": "object", @@ -388,6 +396,9 @@ { "$ref": "#/$defs/ascat_parameters" }, + { + "$ref": "#/$defs/wakhan_parameters" + }, { "$ref": "#/$defs/skip_options" }, From 5220df99d008682923f842bbf5b8376ce2f9d5e4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 7 Apr 2025 16:00:24 +0200 Subject: [PATCH 171/557] Change channel structure and add comments --- subworkflows/local/tumor_normal_happhase.nf | 85 +++++++++++++++++-- subworkflows/local/tumor_only_happhase.nf | 80 ++++++++++++++++- .../utils_nfcore_lr_somatic_pipeline/main.nf | 6 +- workflows/lr_somatic.nf | 74 +++++++++++++--- 4 files changed, 217 insertions(+), 28 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 095de90d..fd84cc1f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -8,6 +8,7 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams fasta fai + clair3_modelMap main: @@ -21,7 +22,8 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{mixed_bams} - // Get normal bams + // Get normal bams and add platform/model info for Clair3 usage + // remove type from so that information can be merged easier later mixed_bams.normal .map{ meta, bam, bai -> def new_meta = [id: meta.id, @@ -29,11 +31,22 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, basecall_model: meta.basecall_model] - return[new_meta, bam, bai] + def clair3_model = clair3_modelMap.get(meta.basecall_model.toString().trim()) + def platform = (meta.platform == "pb") ? "hifi" : "ont" + return[new_meta, bam, bai, clair3_model, [], platform] } .set{normal_bams} - + + // normal_bams -> meta: [id, paired_data, platform, sex, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // clair3_model: clair3 model name + // user_model: user-defined model path (empty) + // platform: name of sequencing platform + + // Get tumour bams + // remove type from so that information can be merged easier later mixed_bams.tumor .map{ meta, bam, bai -> def new_meta = [id: meta.id, @@ -45,10 +58,16 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{tumor_bams} + // tumor_bams -> meta: [id, paired_data, platform, sex, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + + // // MODULE: CLAIR3 // - + // small germline variant calling + CLAIR3 ( normal_bams, fasta, @@ -58,18 +77,29 @@ workflow TUMOR_NORMAL_HAPPHASE { ch_versions = ch_versions.mix(CLAIR3.out.versions) // Add germline vcf to normal bams + // remove clair3 model information + normal_bams - .join(CLAIR3.out.germline_vcf) - .map { meta, bam, bai, vcf -> + .join(CLAIR3.out.vcf) + .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> def svs = [] def mods = [] return [meta, bam, bai, vcf, svs, mods] } .set{normalbams_germlinevcf} + // normal_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // // MODULE: LONGPHASE_PHASE // + // Phase normals LONGPHASE_PHASE ( normalbams_germlinevcf, @@ -80,9 +110,12 @@ workflow TUMOR_NORMAL_HAPPHASE { ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) // Add phased vcf to normal bams + // Add type information back + // both are needed for mixing with the tumor bams + normal_bams .join(LONGPHASE_PHASE.out.vcf) - .map { meta, bam, bai, vcf -> + .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> def new_meta = meta + [type: "normal"] def snvs = [] def mods = [] @@ -90,7 +123,17 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{normal_bams} - // Add phased vcf to tumour bams + // normal_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + + // Add phased vcf to tumour bams and type information + // mix with the normal bams + tumor_bams .join(LONGPHASE_PHASE.out.vcf) .map { meta, bam, bai, vcf -> @@ -102,9 +145,17 @@ workflow TUMOR_NORMAL_HAPPHASE { .mix(normal_bams) .set{mixed_bams_vcf} + // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: normal small germline variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + // // MODULE: LONGPHASE_HAPLOTAG // + // haplotag tumor and normal bams with normal vcf files for both LONGPHASE_HAPLOTAG ( mixed_bams_vcf, @@ -118,13 +169,19 @@ workflow TUMOR_NORMAL_HAPPHASE { LONGPHASE_HAPLOTAG.out.bam .set{ mixed_hapbams } + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bams: haplotagged aligned bams + + // // MODULE: SAMTOOLS_INDEX // + // index the haplotaged bams SAMTOOLS_INDEX ( mixed_hapbams ) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) @@ -134,8 +191,12 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(SAMTOOLS_INDEX.out.bai) .set{mixed_hapbams} + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bams: haplotagged aligned bams + // bais: indexes for bam files + + // Group everything back together in one channel - // Format of channel is [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf] mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> def new_meta = [id: meta.id, @@ -156,6 +217,12 @@ workflow TUMOR_NORMAL_HAPPHASE { } .join(LONGPHASE_PHASE.out.vcf) .set{tumor_normal_severus} + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, basecall_model] + // tumor_bam: haplotagged aligned bam for tumor + // tumor_bai: indexes for tumor bam files + // normal_bam: haplotagged aligned bam files for normal + // normal_bai: indexes for normal bam files + // phased_vcf: phased small variant vcf for normal emit: tumor_normal_severus diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index ebfcb62f..1cca7118 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -10,27 +10,69 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams fasta fai + clairSTO_modelMap main: + + tumor_bams + .map{ meta, bam, bai -> + def clairSTO_model = clairSTO_modelMap.get(meta.basecall_model.toString().trim()) + return [meta, bam, bai, clairSTO_model] + } + .set{tumor_bams} + + // + // MODULE: CLAIRSTO + // + // call somatic/non-somatic variants + // (* not called as germline * just non-somatic) + CLAIRSTO( tumor_bams, fasta, fai ) + CLAIRSTO.out.indel_vcf + .join(CLAIRSTO.out.snv_vcf) + .set{clairsto_vcf} + + // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // indel_vcf: vcf for indels + // snv_vcf: vcf for snvs + + // + // MODULE: VCFSPLIT + // + // ClairSTO gives outputs in snv.vcf and indel.vcf + // reformats them to be in somatic.vcf and nonsomatic.vcf + VCFSPLIT( - CLAIRSTO.out.vcfs + clairsto_vcf ) + // Add the nonsomatic vcf info + // remove model info tumor_bams .join(VCFSPLIT.out.germline_vcf) - .map{ meta, bam, bai, snps -> + .map{ meta, bam, bai, model, snps -> def svs = [] def mods = [] return[meta, bam, bai, snps, svs, mods] } .set{tumor_bams_germlinevcf} - // [meta, bam, bai, vcf] + + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: tumor small nonsomatic variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // + // MODULES: LONGPHASE_PHASE + // + // Phase tumor bams on nonsomatic vcf LONGPHASE_PHASE( tumor_bams_germlinevcf, @@ -38,28 +80,51 @@ workflow TUMOR_ONLY_HAPPHASE { fai ) + // Add phased nonsomatic vcf info + // remove model info tumor_bams .join(LONGPHASE_PHASE.out.vcf) - .map{ meta, bam, bai, snps -> + .map{ meta, bam, bai, model, snps -> def svs = [] def mods = [] return [meta, bam, bai, snps, svs, mods] } .set{tumor_bams_phasedvcf} + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bai: indexes for bam files + // vcf: phased tumor small nonsomatic variant vcf + // svs: structural variant vcf (empty) + // mods: modcall-generated VCF with modifications (empty) + + // + // MODULES: LONGPHASE_HAPLOTAG + // + // Haplotag the tumor bams + LONGPHASE_HAPLOTAG( tumor_bams_phasedvcf, fasta, fai ) + // grab phased bams LONGPHASE_HAPLOTAG.out.bam .set{haplotagged_bams} + + // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bams: list of concatenated aligned bams + // + // MODULES: SAMTOOLS_INDEX + // + // index the haplotagged bams SAMTOOLS_INDEX( haplotagged_bams ) + // join information and the phased VCF file haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.vcf) @@ -72,6 +137,13 @@ workflow TUMOR_ONLY_HAPPHASE { return[new_meta, hap_bam, hap_bai, [],[], vcf] } .set{tumor_only_severus} + + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, basecall_model] + // hap_bam: haplotagged aligned bam for tumor + // hap_bai: indexes for tumor bam files + // normal_bam: haplotagged aligned bam files for normal (empty) + // normal_bai: indexes for normal bam files (empty) + // phased_vcf: phased small variant vcf emit: tumor_only_severus diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index ce669cf7..f6693b97 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -79,7 +79,6 @@ workflow PIPELINE_INITIALISATION { def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } - //.groupTuple() .map { meta, bam_tumor, bam_normal -> [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } @@ -97,8 +96,9 @@ workflow PIPELINE_INITIALISATION { return result } .set { ch_samplesheet } - // Channel is now [[meta], [bam]] - // With meta consisting of [id, paired_data, method, specs, type] + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] + // bam: unaligned bams emit: samplesheet = ch_samplesheet diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 6c041414..7a9de747 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -51,20 +51,44 @@ workflow LR_SOMATIC { ch_samplesheet // channel: samplesheet read in from --input // Channel format is [[meta], [bam]]. // Where [meta] is [id, paired_data, method, specs, type] + main: + def clair3_modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + 'hifi_revio' : 'hifi_revio' + ] + + //ClairSTO and ClairS have the same set of models + def clairs_modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() // // MODULE: METAEXTRACT // - + // extracts the base calling model from the bam files + METAEXTRACT( ch_samplesheet ) ch_versions = ch_versions.mix(METAEXTRACT.out.versions) basecall_meta = METAEXTRACT.out.basecall_model + // Adds the base calling model to meta.basecall_model + ch_samplesheet .join(basecall_meta) .map { meta, bam, meta_ext -> @@ -76,7 +100,12 @@ workflow LR_SOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} + + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of unaligned bams + ch_split = ch_samplesheet .branch { meta, bam -> single: bam.size() == 1 @@ -86,18 +115,23 @@ workflow LR_SOMATIC { // // MODULE: SAMTOOLS_CAT // - + // concatenates bam files from single sample + SAMTOOLS_CAT ( ch_split.multiple ) .bam .mix ( ch_split.single ) .set { ch_cat_ubams } + + // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated unaligned bams + ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) // // MODULE: CRAMINO // - + // QC the unaligned bams CRAMINO_PRE ( ch_cat_ubams ) ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) @@ -130,6 +164,7 @@ workflow LR_SOMATIC { // // MODULE: MINIMAP2_ALIGN // + // Aligns ubams MINIMAP2_ALIGN ( ch_cat_ubams, @@ -139,14 +174,19 @@ workflow LR_SOMATIC { "", "" ) - - ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } + + + // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + + + // ch_minimap_bams into tumor and paired to phase the paired ones on normal + // and add index - // Need to join the tumor and normal information back together - // since both bams need to be phased on the normal clair3 output - // if it exists ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) .branch { meta, bams, bais -> @@ -154,15 +194,22 @@ workflow LR_SOMATIC { tumor_only: !meta.paired_data } .set { branched_minimap } + + + // branched_minimap -> meta: [id, paired_data, platform, sex, type, basecall_model] + // bam: list of concatenated aligned bams + // bais: indexes for bam files // // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE // + // Phasing/haplotaging/small germline variant calling for tumor-normal samples TUMOR_NORMAL_HAPPHASE ( branched_minimap.paired, ch_fasta, - ch_fai + ch_fai, + clair3_modelMap ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -170,13 +217,15 @@ workflow LR_SOMATIC { // // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE // + // Phasing/haplotagging for tumor only samples TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, - ch_fai + ch_fai, + clairs_modelMap ) - + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) // Get Severus input channel @@ -188,7 +237,8 @@ workflow LR_SOMATIC { // Get ClairS input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] + def model = clairs_modelMap.get(meta.basecall_model.toString().trim()) + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } .set { clairs_input } From e6401abe77846db56768e46e02092889f85b62c0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 7 Apr 2025 16:03:32 +0200 Subject: [PATCH 172/557] change process label --- modules/local/clair3/main.nf | 2 +- modules/local/clairs/main.nf | 2 +- modules/local/clairsto/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 22007298..725c7e12 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,6 +1,6 @@ process CLAIR3 { tag "$meta.id" - label 'process_high' + label 'process_very_high' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 95c8fe0c..372634b7 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -1,6 +1,6 @@ process CLAIRS { tag "$meta.id" - label 'process_high' + label 'process_very_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'docker.io/hkubal/clairs:v0.4.1': diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 9e7a739d..0d6e95cd 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -1,7 +1,7 @@ process CLAIRSTO { tag "$meta.id" - label 'process_high' + label 'process_very_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'docker.io/hkubal/clairs-to:v0.4.0': From 05dd680f5bce280a633b57b4760afbd6ce64e698 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 8 Apr 2025 14:38:31 +0200 Subject: [PATCH 173/557] Change samplesheet and schema add fiber category --- assets/samplesheet.csv | 10 +++++----- assets/schema_input.json | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index ecf3e149..dd73f7e9 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ -sample,bam_tumor,bam_normal,platform,sex -sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,female -sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb,female -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,female -sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,female +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,female,n +sample2,/scratch/leuven/351/vsc35115/downsampled.bam,,pb,female,y +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,female,n +sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,female,n diff --git a/assets/schema_input.json b/assets/schema_input.json index 4176b38b..f48d9615 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -36,6 +36,11 @@ "type": "string", "enum": ["male", "female"], "errorMessage": "Biological sex must be either 'male' or 'female'" + }, + "fiber": { + "type": "string", + "enum": ["y", "n"], + "errorMessage": "Specifiy (y/n) if sample has had fiberseq performed" } }, "required": ["sample", "bam_tumor", "platform", "sex"] From ef5907194e7a3b4ed64567f2a23ef6269d6418e7 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 8 Apr 2025 14:42:11 +0200 Subject: [PATCH 174/557] change type to integer --- conf/test.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/test.config b/conf/test.config index fa4d970f..5d646aa2 100644 --- a/conf/test.config +++ b/conf/test.config @@ -15,7 +15,7 @@ process { cpus: 4, memory: '15.GB', time: '1.h' - ] + ] } params { @@ -23,14 +23,14 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" pon_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/chm13.bed" - + // ASCAT files ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" ascat_chroms = "19" - ascat_min_counts = "2" + ascat_min_counts = "2".toInteger() } From b971f334d1fe74046f96ce8b418e35ef13be60d3 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 8 Apr 2025 14:42:41 +0200 Subject: [PATCH 175/557] Fibertools update --- modules/local/fibertoolsrs/fire/main.nf | 4 +- .../fibertoolsrs/nucleosomes/environment.yml | 7 ++ .../local/fibertoolsrs/nucleosomes/main.nf | 90 +++++++++++++++++++ .../local/fibertoolsrs/nucleosomes/meta.yml | 69 ++++++++++++++ .../nucleosomes/tests/main.nf.test | 74 +++++++++++++++ modules/local/fibertoolsrs/predictm6a/main.nf | 6 +- modules/local/fibertoolsrs/qc/main.nf | 8 +- 7 files changed, 249 insertions(+), 9 deletions(-) create mode 100644 modules/local/fibertoolsrs/nucleosomes/environment.yml create mode 100644 modules/local/fibertoolsrs/nucleosomes/main.nf create mode 100644 modules/local/fibertoolsrs/nucleosomes/meta.yml create mode 100644 modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 6733806c..cf58369b 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -64,7 +64,7 @@ process FIBERTOOLSRS_FIRE { $args \\ -t $task.cpus \\ $bam \\ - ${prefix}.bam + ${prefix}_fire.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -80,7 +80,7 @@ process FIBERTOOLSRS_FIRE { // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ - touch ${prefix}.bam + touch ${prefix}_fire.bam cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/fibertoolsrs/nucleosomes/environment.yml b/modules/local/fibertoolsrs/nucleosomes/environment.yml new file mode 100644 index 00000000..4b3c9d37 --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "YOUR-TOOL-HERE" diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf new file mode 100644 index 00000000..0c7fd2df --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -0,0 +1,90 @@ +// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) +// https://github.com/nf-core/modules/tree/master/modules/nf-core/ +// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: +// https://nf-co.re/join +// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. +// All other parameters MUST be provided using the "task.ext" directive, see here: +// https://www.nextflow.io/docs/latest/process.html#ext +// where "task.ext" is a string. +// Any parameters that need to be evaluated in the context of a particular sample +// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. +// TODO nf-core: Software that can be piped together SHOULD be added to separate module files +// unless there is a run-time, storage advantage in implementing in this way +// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: +// bwa mem | samtools view -B -T ref.fasta +// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty +// list (`[]`) instead of a file can be used to work around this issue. + +process FIBERTOOLSRS_NUCLEOSOMES { + tag "$meta.id" + label 'process_very_high' + + // TODO nf-core: List required Conda package(s). + // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). + // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. + // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': + 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + + input: + // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" + // MUST be provided as an input via a Groovy Map called "meta". + // This information may not be required in some instances e.g. indexing reference genome files: + // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf + // TODO nf-core: Where applicable please provide/convert compressed files as input/output + // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(bam) + + output: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 + // If the software is unable to output a version number on the command-line then it can be manually specified + // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf + // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) + // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive + // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter + // using the Nextflow "task" variable e.g. "--threads $task.cpus" + // TODO nf-core: Please replace the example samtools command below with your module's command + // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ + ft \\ + add-nucleosomes \\ + $args \\ + -t $task.cpus \\ + $bam \\ + ${prefix}_nuc.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + // TODO nf-core: A stub section should mimic the execution of the original module as best as possible + // Have a look at the following examples: + // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 + // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ + touch ${prefix}_nuc.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') + END_VERSIONS + """ +} diff --git a/modules/local/fibertoolsrs/nucleosomes/meta.yml b/modules/local/fibertoolsrs/nucleosomes/meta.yml new file mode 100644 index 00000000..bc5a5889 --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/meta.yml @@ -0,0 +1,69 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fibertoolssrs_nucleosomes" +## TODO nf-core: Add a description of the module and list keywords +description: write your description here +keywords: + - sort + - example + - genomics +tools: + - "fibertoolssrs": + ## TODO nf-core: Add a description and other details for the software below + description: "" + homepage: "" + documentation: "" + tool_dev_url: "" + doi: "" + licence: + identifier: + +## TODO nf-core: Add a description of all of the variables used as input +input: + # Only when we have meta + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + + ## TODO nf-core: Delete / customise this example input + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + +## TODO nf-core: Add a description of all of the variables used as output +output: + - bam: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + + - versions: + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@robert-a-forsyth" +maintainers: + - "@robert-a-forsyth" diff --git a/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test b/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test new file mode 100644 index 00000000..e558b3a6 --- /dev/null +++ b/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test @@ -0,0 +1,74 @@ +// TODO nf-core: Once you have added the required tests, please run the following command to build this file: +// nf-core modules test fibertoolssrs/nucleosomes +nextflow_process { + + name "Test Process FIBERTOOLSSRS_NUCLEOSOMES" + script "../main.nf" + process "FIBERTOOLSSRS_NUCLEOSOMES" + + tag "modules" + tag "modules_" + tag "fibertoolssrs" + tag "fibertoolssrs/nucleosomes" + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used + test("sarscov2 - bam") { + + // TODO nf-core: If you are created a test for a chained module + // (the module requires running more than one process to generate the required output) + // add the 'setup' method here. + // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. + ) + } + + } + + // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + // TODO nf-core: define inputs of the process here. Example: + + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + //TODO nf-core: Add all required assertions to verify the test output. + ) + } + + } + +} diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index c58147d8..059b31f0 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -17,7 +17,7 @@ process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" - label 'process_single' + label 'process_very_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). @@ -64,7 +64,7 @@ process FIBERTOOLSRS_PREDICTM6A { $args \\ -t $task.cpus \\ $bam \\ - ${prefix}.bam + ${prefix}_m6a.bam cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -80,7 +80,7 @@ process FIBERTOOLSRS_PREDICTM6A { // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ - touch ${prefix}.bam + touch ${prefix}_m6a.bam cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index 92367413..b99424d6 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -17,7 +17,7 @@ process FIBERTOOLSRS_QC { tag "$meta.id" - label 'process_single' + label 'process_very_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). @@ -39,7 +39,7 @@ process FIBERTOOLSRS_QC { output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.txt"), emit: qc_txt // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions @@ -64,7 +64,7 @@ process FIBERTOOLSRS_QC { $args \\ -t $task.cpus \\ $bam \\ - ${prefix}.bam + ${prefix}_qc.txt cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -80,7 +80,7 @@ process FIBERTOOLSRS_QC { // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ - touch ${prefix}.bam + touch ${prefix}_qc.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From 0a78791e57e498375db599188459792d2329f5cd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 8 Apr 2025 14:43:10 +0200 Subject: [PATCH 176/557] Add fibertools compatibility --- subworkflows/local/tumor_normal_happhase.nf | 73 +++--- subworkflows/local/tumor_only_happhase.nf | 23 +- .../utils_nfcore_lr_somatic_pipeline/main.nf | 12 +- workflows/lr_somatic.nf | 236 +++++++++++------- 4 files changed, 206 insertions(+), 138 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index fd84cc1f..7e1e168d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -11,9 +11,9 @@ workflow TUMOR_NORMAL_HAPPHASE { clair3_modelMap main: - + ch_versions = Channel.empty() - + // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -21,7 +21,7 @@ workflow TUMOR_NORMAL_HAPPHASE { tumor: meta.type == "tumor" } .set{mixed_bams} - + // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later mixed_bams.normal @@ -30,6 +30,7 @@ workflow TUMOR_NORMAL_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, + fiber: meta.fiber, basecall_model: meta.basecall_model] def clair3_model = clair3_modelMap.get(meta.basecall_model.toString().trim()) def platform = (meta.platform == "pb") ? "hifi" : "ont" @@ -37,7 +38,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{normal_bams} - // normal_bams -> meta: [id, paired_data, platform, sex, basecall_model] + // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // clair3_model: clair3 model name @@ -53,16 +54,17 @@ workflow TUMOR_NORMAL_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, + fiber: meta.fiber, basecall_model: meta.basecall_model] return[new_meta, bam, bai] } .set{tumor_bams} - - // tumor_bams -> meta: [id, paired_data, platform, sex, basecall_model] + + // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files - + // // MODULE: CLAIR3 // @@ -73,9 +75,9 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta, fai ) - + ch_versions = ch_versions.mix(CLAIR3.out.versions) - + // Add germline vcf to normal bams // remove clair3 model information @@ -87,8 +89,8 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, vcf, svs, mods] } .set{normalbams_germlinevcf} - - // normal_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // vcf: normal small germline variant vcf @@ -100,15 +102,15 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: LONGPHASE_PHASE // // Phase normals - + LONGPHASE_PHASE ( normalbams_germlinevcf, fasta, fai ) - + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) - + // Add phased vcf to normal bams // Add type information back // both are needed for mixing with the tumor bams @@ -122,15 +124,15 @@ workflow TUMOR_NORMAL_HAPPHASE { return[new_meta, bam, bai, vcf, snvs, mods] } .set{normal_bams} - - // normal_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // vcf: normal small germline variant vcf // svs: structural variant vcf (empty) // mods: modcall-generated VCF with modifications (empty) - + // Add phased vcf to tumour bams and type information // mix with the normal bams @@ -144,32 +146,32 @@ workflow TUMOR_NORMAL_HAPPHASE { } .mix(normal_bams) .set{mixed_bams_vcf} - - // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // vcf: normal small germline variant vcf // svs: structural variant vcf (empty) // mods: modcall-generated VCF with modifications (empty) - + // // MODULE: LONGPHASE_HAPLOTAG // // haplotag tumor and normal bams with normal vcf files for both - + LONGPHASE_HAPLOTAG ( mixed_bams_vcf, fasta, fai ) - + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) - + // Get final tagged bams LONGPHASE_HAPLOTAG.out.bam .set{ mixed_hapbams } - - // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams @@ -177,25 +179,25 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: SAMTOOLS_INDEX // // index the haplotaged bams - + SAMTOOLS_INDEX ( mixed_hapbams ) - + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) - + // Add index to channel mixed_bams_vcf .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) .set{mixed_hapbams} - - // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams // bais: indexes for bam files - - + + // Group everything back together in one channel mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> @@ -203,6 +205,7 @@ workflow TUMOR_NORMAL_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, + fiber: meta.fiber, basecall_model: meta.basecall_model] return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } @@ -217,7 +220,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .join(LONGPHASE_PHASE.out.vcf) .set{tumor_normal_severus} - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, basecall_model] + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files // normal_bam: haplotagged aligned bam files for normal @@ -227,5 +230,5 @@ workflow TUMOR_NORMAL_HAPPHASE { emit: tumor_normal_severus versions = ch_versions - -} \ No newline at end of file + +} diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 1cca7118..92a22e78 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -36,8 +36,8 @@ workflow TUMOR_ONLY_HAPPHASE { CLAIRSTO.out.indel_vcf .join(CLAIRSTO.out.snv_vcf) .set{clairsto_vcf} - - // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // indel_vcf: vcf for indels // snv_vcf: vcf for snvs @@ -62,7 +62,7 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{tumor_bams_germlinevcf} - // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // vcf: tumor small nonsomatic variant vcf @@ -91,14 +91,14 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{tumor_bams_phasedvcf} - // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, basecall_model] + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // vcf: phased tumor small nonsomatic variant vcf // svs: structural variant vcf (empty) // mods: modcall-generated VCF with modifications (empty) - // + // // MODULES: LONGPHASE_HAPLOTAG // // Haplotag the tumor bams @@ -112,8 +112,8 @@ workflow TUMOR_ONLY_HAPPHASE { // grab phased bams LONGPHASE_HAPLOTAG.out.bam .set{haplotagged_bams} - - // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: list of concatenated aligned bams // @@ -133,12 +133,13 @@ workflow TUMOR_ONLY_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, + fiber: meta.fiber, basecall_model: meta.basecall_model] return[new_meta, hap_bam, hap_bai, [],[], vcf] } .set{tumor_only_severus} - - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, basecall_model] + + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // hap_bam: haplotagged aligned bam for tumor // hap_bai: indexes for tumor bam files // normal_bam: haplotagged aligned bam files for normal (empty) @@ -147,5 +148,5 @@ workflow TUMOR_ONLY_HAPPHASE { emit: tumor_only_severus - -} \ No newline at end of file + +} diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index f6693b97..9243abbd 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,9 +74,9 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method, sex -> + .map { meta, bam_tumor, bam_normal, method, sex, fiber -> def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex] + def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .map { meta, bam_tumor, bam_normal -> @@ -86,20 +86,20 @@ workflow PIPELINE_INITIALISATION { def meta_tumor = meta.clone() meta_tumor.type = 'tumor' def result = [[meta_tumor, tumor_bam]] - + if (normal_bam) { def meta_normal = meta.clone() meta_normal.type = 'normal' result << [meta_normal, normal_bam] } - + return result } .set { ch_samplesheet } // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] - // bam: unaligned bams - + // bam: unaligned bams + emit: samplesheet = ch_samplesheet versions = ch_versions diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 871496f1..f7db98a8 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -28,6 +28,11 @@ include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { METAEXTRACT } from '../modules/local/metaextract/main' include { SAMTOOLS_INDEX } from '../modules/nf-core/samtools/index/main.nf' include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' + // // IMPORT SUBWORKFLOWS @@ -49,7 +54,7 @@ workflow LR_SOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input - // Channel format is [[meta], [bam]]. + // Channel format is [[meta], [bam]]. // Where [meta] is [id, paired_data, method, specs, type] main: @@ -71,19 +76,19 @@ workflow LR_SOMATIC { 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', 'hifi_revio' : 'hifi_revio_ss' - + ] ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - + // // MODULE: METAEXTRACT // // extracts the base calling model from the bam files METAEXTRACT( ch_samplesheet ) - + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) basecall_meta = METAEXTRACT.out.basecall_model @@ -100,18 +105,18 @@ workflow LR_SOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} - - - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, basecall_model] - // bam: list of unaligned bams + + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of unaligned bams ch_split = ch_samplesheet - .branch { meta, bam -> + .branch { meta, bam -> single: bam.size() == 1 multiple: bam.size() > 1 } - + // // MODULE: SAMTOOLS_CAT // @@ -121,69 +126,126 @@ workflow LR_SOMATIC { .bam .mix ( ch_split.single ) .set { ch_cat_ubams } - - - // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, basecall_model] - // bam: list of concatenated unaligned bams + + + // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated unaligned bams ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) - + // // MODULE: CRAMINO // // QC the unaligned bams if (!params.skip_qc && !params.skip_cramino) { - + CRAMINO_PRE ( ch_cat_ubams ) ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) } - + // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // - - PREPARE_REFERENCE_FILES ( + + PREPARE_REFERENCE_FILES ( params.fasta, params.ascat_allele_files, params.ascat_loci_files, params.ascat_gc_file, - params.ascat_rt_file + params.ascat_rt_file ) - + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai - - // ASCAT files + + // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files loci_files = PREPARE_REFERENCE_FILES.out.loci_files gc_file = PREPARE_REFERENCE_FILES.out.gc_file rt_file = PREPARE_REFERENCE_FILES.out.rt_file - - + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) + // + // MODULE: FIBERTOOLSRS_PREDICTM6A + // + // predict m6a in unaligned bam + + if (!params.skip_fiber) { + ch_cat_ubams + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams} + + FIBERTOOLSRS_PREDICTM6A ( + ch_cat_ubams.pacBio + ) + + ch_cat_ubams.ont + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{fiber_branch} + + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + // + // MODULE: FIBERTOOLSRS_FIRE + // + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) + + + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + } + } // // MODULE: MINIMAP2_ALIGN // // Aligns ubams - - MINIMAP2_ALIGN ( + + MINIMAP2_ALIGN ( ch_cat_ubams, ch_fasta, true, 'bai', - "", - "" + "", + "" ) - MINIMAP2_ALIGN.out.bam - .set { ch_minimap_bam } - + MINIMAP2_ALIGN.out.bam + .set { ch_minimap_bam } - // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, basecall_model] - // bam: list of concatenated aligned bams + + // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] + // bam: list of concatenated aligned bams ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) @@ -198,9 +260,9 @@ workflow LR_SOMATIC { tumor_only: !meta.paired_data } .set { branched_minimap } - - // branched_minimap -> meta: [id, paired_data, platform, sex, type, basecall_model] + + // branched_minimap -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bais: indexes for bam files @@ -208,21 +270,21 @@ workflow LR_SOMATIC { // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE // // Phasing/haplotaging/small germline variant calling for tumor-normal samples - + TUMOR_NORMAL_HAPPHASE ( branched_minimap.paired, ch_fasta, ch_fai, clair3_modelMap ) - + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) - + // // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE // // Phasing/haplotagging for tumor only samples - + TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, @@ -231,13 +293,13 @@ workflow LR_SOMATIC { ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) - + // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - + // Get ClairS input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> @@ -245,59 +307,59 @@ workflow LR_SOMATIC { return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } .set { clairs_input } - + // // MODULE: CLAIRS - // - + // + CLAIRS ( clairs_input, ch_fasta, ch_fai ) - + ch_versions = ch_versions.mix(CLAIRS.out.versions) - + // // MODULE: SEVERUS // - + if (!params.skip_severus) { - + SEVERUS ( severus_reformat, [[:], params.bed_file, params.pon_file] ) - + ch_versions = ch_versions.mix(SEVERUS.out.versions) } - - // + + // // MODULE: CRAMINO - // - + // + if (!params.skip_qc && !params.skip_cramino) { - + CRAMINO_POST ( ch_minimap_bam ) ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) } - + // // Module: MOSDEPTH // - + if (!params.skip_qc && params.skip_mosdepth) { - + // prepare mosdepth input channel: we need to specify compulsory path to bed as well ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) .map { meta, bam, bai -> [meta, bam, bai, []] } .set { ch_mosdepth_in } - MOSDEPTH ( + MOSDEPTH ( ch_mosdepth_in, - ch_fasta - ) + ch_fasta + ) ch_versions = ch_versions.mix(MOSDEPTH.out.versions) } @@ -305,28 +367,28 @@ workflow LR_SOMATIC { // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // - + if (!params.skip_qc && params.skip_bamstats ) { - + BAM_STATS_SAMTOOLS ( ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel ch_fasta ) - + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) } - + // // MODULE: ASCAT // - - if (!skip_ascat) { + + if (!params.skip_ascat) { severus_reformat .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } - + ASCAT ( ascat_ch, allele_files, @@ -336,26 +398,26 @@ workflow LR_SOMATIC { [], [] ) - + ch_versions = ch_versions.mix(ASCAT.out.versions) } - + /* // // MODULE: WAKHAN // - + if (!skip_wakhan) { - + WAKHAN ( severus_reformat, ch_fasta ) - + ch_versions = ch_versions.mix(WAKHAN.out.versions) } - + */ // // Collate and save software versions @@ -385,7 +447,7 @@ workflow LR_SOMATIC { ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) @@ -399,16 +461,18 @@ workflow LR_SOMATIC { sort: true ) ) - + // Collect MultiQC files - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) - - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) - - + if (!params.skip_qc && params.skip_bamstats ) { + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + } + if (!params.skip_qc && params.skip_mosdepth) { + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) + } + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), @@ -422,11 +486,11 @@ workflow LR_SOMATIC { versions = ch_versions // channel: [ path(versions.yml) ] - + } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ \ No newline at end of file +*/ From b97795a59a6740b3663a0e4da9b2a0069deef8f8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 8 Apr 2025 14:45:49 +0200 Subject: [PATCH 177/557] Edit samplesheet --- assets/samplesheet.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index dd73f7e9..4137b50a 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,5 +1,5 @@ -sample,bam_tumor,bam_normal,platform,sex,fiber +sample,bam_tumor,bam_normal,platform,sex sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,female,n -sample2,/scratch/leuven/351/vsc35115/downsampled.bam,,pb,female,y +sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb,female,n sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,female,n sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k_rep2.bam,,ont,female,n From 3cae8111c05caa0a7a3bd1010e66c3f1873aaa2a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 15:31:33 +0200 Subject: [PATCH 178/557] added header --- assets/samplesheet.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 4137b50a..ae6bff3c 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,4 +1,4 @@ -sample,bam_tumor,bam_normal,platform,sex +sample,bam_tumor,bam_normal,platform,sex,fiber sample1,/staging/leuven/stg_00096/home/hackathon/PTCL1/GC151233_chr19_sorted.bam,,ont,female,n sample2,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15M_chr19.bam,/staging/leuven/stg_00096/home/hackathon/CCS15/CCS15N_chr19.bam,pb,female,n sample3,/staging/leuven/stg_00096/home/hackathon/DNA_PTCL_B2233535_500k.bam,,ont,female,n From 8318896815a6e546907dba41f1cb1a06b2df531d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 15:31:47 +0200 Subject: [PATCH 179/557] added conda module --- modules/local/fibertoolsrs/nucleosomes/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/fibertoolsrs/nucleosomes/environment.yml b/modules/local/fibertoolsrs/nucleosomes/environment.yml index 4b3c9d37..649180bb 100644 --- a/modules/local/fibertoolsrs/nucleosomes/environment.yml +++ b/modules/local/fibertoolsrs/nucleosomes/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "YOUR-TOOL-HERE" + - fibertools-rs=0.6.2 From 05ea352e7e0038ed62717bd32a8d5c2d28459c4c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 15:35:50 +0200 Subject: [PATCH 180/557] added versions and removed if skip statement at multiqc step --- workflows/lr_somatic.nf | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index f7db98a8..ad93042b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -186,6 +186,8 @@ workflow LR_SOMATIC { FIBERTOOLSRS_PREDICTM6A ( ch_cat_ubams.pacBio ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) ch_cat_ubams.ont .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) @@ -205,6 +207,9 @@ workflow LR_SOMATIC { FIBERTOOLSRS_NUCLEOSOMES ( fiber_branch.fiber ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + // // MODULE: FIBERTOOLSRS_FIRE // @@ -212,7 +217,8 @@ workflow LR_SOMATIC { FIBERTOOLSRS_FIRE ( FIBERTOOLSRS_NUCLEOSOMES.out.bam ) - + + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) @@ -225,6 +231,8 @@ workflow LR_SOMATIC { FIBERTOOLSRS_QC ( FIBERTOOLSRS_FIRE.out.bam ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) } } // @@ -463,15 +471,13 @@ workflow LR_SOMATIC { ) // Collect MultiQC files - if (!params.skip_qc && params.skip_bamstats ) { - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) - } - if (!params.skip_qc && params.skip_mosdepth) { - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) - } + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) + MULTIQC ( ch_multiqc_files.collect(), From 496fcbd90ad41fac125877806822749ca12dfdd1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 17:34:36 +0200 Subject: [PATCH 181/557] changed to integer --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 5d646aa2..4f3f15ad 100644 --- a/conf/test.config +++ b/conf/test.config @@ -32,5 +32,5 @@ params { ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" ascat_chroms = "19" - ascat_min_counts = "2".toInteger() + ascat_min_counts = 2 } From cb87b392c0748d47e1796f7c4cc4a3be85e9901a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 17:42:57 +0200 Subject: [PATCH 182/557] fixed multiqc channels --- workflows/lr_somatic.nf | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index ad93042b..1e3c5df1 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -356,9 +356,12 @@ workflow LR_SOMATIC { // // Module: MOSDEPTH // - + if (!params.skip_qc && params.skip_mosdepth) { - + + ch_mosdepth_global = Channel.empty() + ch_mosdepth_summary = Channel.empty() + // prepare mosdepth input channel: we need to specify compulsory path to bed as well ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) .map { meta, bam, bai -> [meta, bam, bai, []] } @@ -368,20 +371,30 @@ workflow LR_SOMATIC { ch_mosdepth_in, ch_fasta ) - + + ch_mosdepth_global = MOSDEPTH.out.global_txt + ch_mosdepth_summary = MOSDEPTH.out.summary_txt + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) } // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // - + ch_bam_stats = Channel.empty() + ch_bam_flagstats = Channel.empty() + ch_bam_idxstats = Channel.empty() + if (!params.skip_qc && params.skip_bamstats ) { BAM_STATS_SAMTOOLS ( ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel ch_fasta ) + + bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats + bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat + bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) } @@ -471,12 +484,12 @@ workflow LR_SOMATIC { ) // Collect MultiQC files - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it[1]}.ifEmpty([])) MULTIQC ( From a42907e47cfe491fe2873783fd9889a7848b820e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 17:44:48 +0200 Subject: [PATCH 183/557] typo --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1e3c5df1..f6d9235f 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -382,7 +382,7 @@ workflow LR_SOMATIC { // SUBWORKFLOW: BAM_STATS_SAMTOOLS // ch_bam_stats = Channel.empty() - ch_bam_flagstats = Channel.empty() + ch_bam_flagstat = Channel.empty() ch_bam_idxstats = Channel.empty() if (!params.skip_qc && params.skip_bamstats ) { From bdcab5a2bcb69e114c80f6c116ba1f1ce90bb6b7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 8 Apr 2025 17:45:57 +0200 Subject: [PATCH 184/557] changed specifying empty channels outside if statement because i was an idiot --- workflows/lr_somatic.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index f6d9235f..4b38b60c 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -357,10 +357,12 @@ workflow LR_SOMATIC { // Module: MOSDEPTH // + + ch_mosdepth_global = Channel.empty() + ch_mosdepth_summary = Channel.empty() + if (!params.skip_qc && params.skip_mosdepth) { - - ch_mosdepth_global = Channel.empty() - ch_mosdepth_summary = Channel.empty() + // prepare mosdepth input channel: we need to specify compulsory path to bed as well ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) From cfea7f3a01409e424d9efaddd28b73b08f64b3e0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 9 Apr 2025 09:48:03 +0200 Subject: [PATCH 185/557] stash --- conf/test.config | 2 +- workflows/lr_somatic.nf | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/conf/test.config b/conf/test.config index 5d646aa2..4f3f15ad 100644 --- a/conf/test.config +++ b/conf/test.config @@ -32,5 +32,5 @@ params { ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" ascat_chroms = "19" - ascat_min_counts = "2".toInteger() + ascat_min_counts = 2 } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index ad93042b..8835c68e 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -186,7 +186,7 @@ workflow LR_SOMATIC { FIBERTOOLSRS_PREDICTM6A ( ch_cat_ubams.pacBio ) - + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) ch_cat_ubams.ont @@ -207,9 +207,9 @@ workflow LR_SOMATIC { FIBERTOOLSRS_NUCLEOSOMES ( fiber_branch.fiber ) - + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) - + // // MODULE: FIBERTOOLSRS_FIRE // @@ -217,7 +217,7 @@ workflow LR_SOMATIC { FIBERTOOLSRS_FIRE ( FIBERTOOLSRS_NUCLEOSOMES.out.bam ) - + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) fiber_branch.nonFiber @@ -231,7 +231,7 @@ workflow LR_SOMATIC { FIBERTOOLSRS_QC ( FIBERTOOLSRS_FIRE.out.bam ) - + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) } } @@ -471,13 +471,15 @@ workflow LR_SOMATIC { ) // Collect MultiQC files - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) - - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) - + if (!params.skip_qc && params.skip_bamstats ) { + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(BAM_STATS_SAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([])) + } + if (!params.skip_qc && params.skip_mosdepth) { + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.global_txt.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(MOSDEPTH.out.summary_txt.collect{it[1]}.ifEmpty([])) + } MULTIQC ( ch_multiqc_files.collect(), From c77e19bfb06a1e772c84884f9c6ab4ea463996e1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 9 Apr 2025 15:39:13 +0200 Subject: [PATCH 186/557] fix output file paths --- conf/modules.config | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b9d217fb..1d279e26 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,12 +26,12 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_mapped" } + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() @@ -99,24 +99,34 @@ process { ] } - withName: '.*:SEVERUS' { - ext.args = '--min-support 3 --output-read-ids ' + withName: '.*:FIBERTOOLSRS_FIRE' { + ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/severus" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:FIBERTOOLSRS_FIRE' { - ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args + withName: '.*:FIBERTOOLSRS_NUCLEOSOMES' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/nucleosomes" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:SEVERUS' { + ext.args = '--min-support 3 --output-read-ids ' + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/severus" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + + withName: '.*:CLAIRSTO' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, @@ -132,7 +142,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:CLAIR3' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clair3" }, @@ -149,19 +159,19 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:PREPARE_REFERENCE_FILES' { publishDir = [ enabled: false ] } - + withName: '.*:UNZIP_.*' { publishDir = [ enabled: false ] } - + withName: '.*:METAEXTRACT' { publishDir = [ path: { "${params.outdir}/${meta.id}/metaextract" }, @@ -189,7 +199,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName : '.*:WAKHAN' { ext.args = { [ @@ -200,7 +210,7 @@ process { ].join(' ').trim() } } - + withName: '.*:LONGPHASE_PHASE' { ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ @@ -210,7 +220,7 @@ process { ] } - withName: '.*:SAMTOOLS.*' { + withName: '.*:SAMTOOLS_*' { publishDir = [ path: { "${params.outdir}/${meta.id}/samtools" }, mode: params.publish_dir_mode, From d652c230cb0209b922ba8b183991cc573d82bdf5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 9 Apr 2025 16:14:45 +0200 Subject: [PATCH 187/557] remove view statement --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1640bdaf..5fd8f393 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -91,7 +91,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(METAEXTRACT.out.versions) basecall_meta = METAEXTRACT.out.meta_ext - basecall_meta.view() // Adds the base calling model to meta.basecall_model ch_samplesheet From 792fd49a878f127d17ea6476f1126929d7ce5986 Mon Sep 17 00:00:00 2001 From: rcools Date: Wed, 9 Apr 2025 16:16:02 +0200 Subject: [PATCH 188/557] Introduction for README --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ada563d7..1906a020 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,14 @@ ## Introduction -**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies such as from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. + +This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. + +It can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design. + +Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. + ## Contributions and Support From 2dd8c4470a1c723e3910f901559320d5b6caafbf Mon Sep 17 00:00:00 2001 From: rcools Date: Wed, 9 Apr 2025 17:23:35 +0200 Subject: [PATCH 190/557] Pipeline summary for README --- README.md | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1906a020..e45ec6dd 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,39 @@ It can be run in both **matched tumour-normal** and **tumour-only mode**, offeri Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. +## Pipeline summary +**1) Pre-processing:** - + a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) + + b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) + + c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) + + d. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs)) + +**2i) Matched mode: small variant calling:** + + a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) + + b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + + c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) + +**2ii) Tumour only mode: small variant calling:** + + a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) + + b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +**3) Large variant calling:** + + a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) + + b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) - ## Usage > [!NOTE] From e5e5efe524e94a6541820e3f1ddf9eb84c114581 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 9 Apr 2025 17:23:57 +0200 Subject: [PATCH 191/557] removed and --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65788888..03123270 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ We thank the following people for their extensive assistance in the development This pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report. -Besides QC and 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. +Besides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles. Example output directory structure: From 25eaed64d6e9741c38a7f1f212c59947d9e905cf Mon Sep 17 00:00:00 2001 From: rcools <114592436+rcools@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:34:04 +0200 Subject: [PATCH 192/557] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae6860ca..55af8478 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## Introduction -**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies such as from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. +**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. From cca62855fc81f9afed7dd2ce8c84b5b34f7024e2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 11:25:07 +0200 Subject: [PATCH 193/557] removed view --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1640bdaf..5fd8f393 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -91,7 +91,6 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(METAEXTRACT.out.versions) basecall_meta = METAEXTRACT.out.meta_ext - basecall_meta.view() // Adds the base calling model to meta.basecall_model ch_samplesheet From f7cd7dd7fb87cfa7a2fbff5c1eac742df99a618c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 11:25:26 +0200 Subject: [PATCH 194/557] added igenomes getAttributes --- main.nf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main.nf b/main.nf index 502dad5c..c51d6604 100644 --- a/main.nf +++ b/main.nf @@ -28,6 +28,12 @@ include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lr_s // This is an example of how to use getGenomeAttribute() to fetch parameters // from igenomes.config using `--genome` params.fasta = getGenomeAttribute('fasta') +params.genome_name = getGenomeAttribute('genome_name') +params.ascat_allele_files = getGenomeAttribute('ascat_alles') +params.ascat_loci_files = getGenomeAttribute('ascat_loci') +params.centromere_bed = getGenomeAttribute('centromere_bed') +params.pon_file = getGenomeAttribute('pon_file') +params.bed_file = getGenomeAttribute('bed_file') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From af8d9c6046f9bf14490735f90fb843a80a3f8583 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 11:26:15 +0200 Subject: [PATCH 195/557] updated igenomes and adjusted test config, normal config and parameter schema --- conf/igenomes.config | 43 ++++++++++++++----------------------------- conf/test.config | 10 +++++----- nextflow.config | 4 ++-- nextflow_schema.json | 4 +--- 4 files changed, 22 insertions(+), 39 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 3f114377..b72c42fb 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -11,38 +11,23 @@ params { // illumina iGenomes reference file paths genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + genome_name = "hg38" + ascat_alleles = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/ASCAT/G1000_alleles_hg19.zip" + ascat_loci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/ASCAT/G1000_loci_hg19.zip" + centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" + pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" + bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" } 'CHM13' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" - bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" - gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" - mito_name = "chrM" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" + genome_name = "CHM13" + ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" + ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" + pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" + bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/test.config b/conf/test.config index 4f3f15ad..de54da5b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,12 +25,12 @@ params { // Input data input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" - pon_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/PoN_1000G_chm13.tsv.gz" - bed_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/chm13.bed" - + //pon_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/PoN_1000G_chm13.tsv.gz" + //bed_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/chm13.bed" + genome = "CHM13" // ASCAT files - ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" - ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + //ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" + //ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" ascat_chroms = "19" ascat_min_counts = 2 } diff --git a/nextflow.config b/nextflow.config index a8a03b6a..7fe2fd01 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,14 +45,14 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - genome_name = "CHM13" + genome_name = null ascat_allele_files = null // Zip file with allele files ascat_loci_files = null // Zip file with loci files ascat_gc_files = null // Optional: most likely not needed for long read (zip file) ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) // WAKHAN options - centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" + centromere_bed = null // Severus options pon_file = null diff --git a/nextflow_schema.json b/nextflow_schema.json index bb08dd6a..bf653cef 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -117,8 +117,7 @@ "type": "string", "description": "Path to bed file" } - }, - "required": ["pon_file", "bed_file"] + } }, "ascat_parameters": { "title": "ASCAT parameters", @@ -165,7 +164,6 @@ }, "genome_name": { "type": "string", - "default": "CHM13", "description": "Genome name (hg19, hg38, or CHM13)" }, "ascat_allele_files": { From 6ac2775fa0d6b55c16507bcabf7d5513e995b4d8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 11:52:51 +0200 Subject: [PATCH 196/557] updated readme --- README.md | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ae6860ca..597524ab 100644 --- a/README.md +++ b/README.md @@ -58,26 +58,19 @@ Developed using **Nextflow DSL2**, it offers high portability and scalability ac > [!NOTE] > If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. - +Each row represents a sample. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: - - ```bash nextflow run IntGenomicsLab/lr_somatic \ -profile \ @@ -92,8 +85,6 @@ nextflow run IntGenomicsLab/lr_somatic \ IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pančíková, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. -We thank the following people for their extensive assistance in the development of this pipeline: - ## Pipeline output This pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report. @@ -128,16 +119,13 @@ results └── ascat ``` - - ## Contributions and Support If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). ## Citations - - +If you use IntGenomicsLab/lr_somatic for your analysis, please cite it using the following doi: [10.5281/zenodo.XXXXXX](https://doi.org/10.5281/zenodo.XXXXXX) An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. From e015dba1ec3b91fbf8f69b65ebddbba03aa27a5e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 10 Apr 2025 12:01:22 +0200 Subject: [PATCH 197/557] fixed versioning --- conf/modules.config | 17 ----------------- modules/local/clair3/main.nf | 34 +++++++++++++++++----------------- modules/local/clairs/main.nf | 6 ++---- workflows/lr_somatic.nf | 2 +- 4 files changed, 20 insertions(+), 39 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1d279e26..b4cce25c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -92,29 +92,12 @@ process { params.keep_all_calls ? "--all-calls" : '' ].join(' ').trim() } - publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args - publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } - withName: '.*:FIBERTOOLSRS_NUCLEOSOMES' { - publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/nucleosomes" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } withName: '.*:SEVERUS' { ext.args = '--min-support 3 --output-read-ids ' diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 37cf8590..729e1d85 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,8 +4,8 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': - 'biocontainers/clair3:1.0.10--py39hd649744_1' }" + 'docker://hkubal/clair3:v1.0.10': + 'hkubal/clair3:v1.0.10' }" input: tuple val(meta), path(bam), path(bai), val(packaged_model), path(user_model), val(platform) @@ -23,21 +23,21 @@ process CLAIR3 { task.ext.when == null || task.ext.when script: - def model = "" - if (!user_model) { - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - model = "\${CONDA_PREFIX}/bin/models/${packaged_model}" - } - else { - model = "/usr/local/bin/models/$packaged_model" - } - } - if (!packaged_model) { - model = "$user_model" - } - if (packaged_model && user_model) { - error "Two models specified $user_model and $packaged_model, specify one of them." - } + def model = packaged_model + //if (!user_model) { + // if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + // model = "\${CONDA_PREFIX}/bin/models/${packaged_model}" + // } + // else { + // model = "/usr/local/bin/models/$packaged_model" + // } + //} + //if (!packaged_model) { + // model = "$user_model" + //} + //if (packaged_model && user_model) { + // error "Two models specified $user_model and $packaged_model, specify one of them." + //} // TODO: fix the channel structure so you don't have to do this def download_prefix = ( model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def args = task.ext.args ?: '' diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 372634b7..5d710693 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -36,8 +36,7 @@ process CLAIRS { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs --version |& sed '1!d; s|run_clairs ||' -) + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') END_VERSIONS """ @@ -51,8 +50,7 @@ process CLAIRS { cat <<-END_VERSIONS > versions.yml "${task.process}": - clairs: \$(/opt/bin/run_clairs --version |& sed '1!d; s|run_clairs ||' -) + clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') END_VERSIONS """ } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 5fd8f393..e62c7f3b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -449,8 +449,8 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(WAKHAN.out.versions) } - */ + // // Collate and save software versions // From 8ebdfa803db28f77cd6d2f4f1853021176ef3bf9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 12:57:32 +0200 Subject: [PATCH 198/557] changed modules config --- conf/modules.config | 47 +++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b4cce25c..d00a2b26 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,12 +26,12 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_mapped" } + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() @@ -92,13 +92,13 @@ process { params.keep_all_calls ? "--all-calls" : '' ].join(' ').trim() } + publishDir = [ + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - withName: '.*:FIBERTOOLSRS_FIRE' { - ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args - } - - withName: '.*:SEVERUS' { ext.args = '--min-support 3 --output-read-ids ' publishDir = [ @@ -108,7 +108,14 @@ process { ] } - + withName: '.*:FIBERTOOLSRS_FIRE' { + ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args + publishDir = [ + path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: '.*:CLAIRSTO' { publishDir = [ @@ -125,7 +132,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:CLAIR3' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clair3" }, @@ -142,19 +149,19 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:PREPARE_REFERENCE_FILES' { publishDir = [ enabled: false ] } - + withName: '.*:UNZIP_.*' { publishDir = [ enabled: false ] } - + withName: '.*:METAEXTRACT' { publishDir = [ path: { "${params.outdir}/${meta.id}/metaextract" }, @@ -182,7 +189,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName : '.*:WAKHAN' { ext.args = { [ @@ -193,7 +200,7 @@ process { ].join(' ').trim() } } - + withName: '.*:LONGPHASE_PHASE' { ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ @@ -202,12 +209,10 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: '.*:SAMTOOLS_*' { - publishDir = [ - path: { "${params.outdir}/${meta.id}/samtools" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + + withName: '.*:SAMTOOLS_FAIDX' { + publishDir [ + enabled = false ] } From 96d6fec7f1bccbaae9b05d12b644defb55e77f38 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 13:03:23 +0200 Subject: [PATCH 199/557] typos in prepare_reference_files() --- workflows/lr_somatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index e62c7f3b..2547e211 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -152,8 +152,8 @@ workflow LR_SOMATIC { params.fasta, params.ascat_allele_files, params.ascat_loci_files, - params.ascat_gc_file, - params.ascat_rt_file + params.ascat_gc_files, + params.ascat_rt_files ) ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) From 90194afbae359207879133cc379048e81784d18d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 13:06:07 +0200 Subject: [PATCH 200/557] remove severus skip --- workflows/lr_somatic.nf | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 2547e211..b6e00786 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -341,15 +341,12 @@ workflow LR_SOMATIC { // MODULE: SEVERUS // - if (!params.skip_severus) { - - SEVERUS ( - severus_reformat, - [[:], params.bed_file, params.pon_file] - ) + SEVERUS ( + severus_reformat, + [[:], params.bed_file, params.pon_file] + ) - ch_versions = ch_versions.mix(SEVERUS.out.versions) - } + ch_versions = ch_versions.mix(SEVERUS.out.versions) // // MODULE: CRAMINO From 26c42738b265428cc620ea767d583294542e2989 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 13:42:54 +0200 Subject: [PATCH 201/557] params igenomes fixes --- main.nf | 7 ------- nextflow.config | 9 --------- workflows/lr_somatic.nf | 15 +++++++++++++-- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/main.nf b/main.nf index c51d6604..8f763a30 100644 --- a/main.nf +++ b/main.nf @@ -27,13 +27,6 @@ include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lr_s // TODO nf-core: Remove this line if you don't need a FASTA file // This is an example of how to use getGenomeAttribute() to fetch parameters // from igenomes.config using `--genome` -params.fasta = getGenomeAttribute('fasta') -params.genome_name = getGenomeAttribute('genome_name') -params.ascat_allele_files = getGenomeAttribute('ascat_alles') -params.ascat_loci_files = getGenomeAttribute('ascat_loci') -params.centromere_bed = getGenomeAttribute('centromere_bed') -params.pon_file = getGenomeAttribute('pon_file') -params.bed_file = getGenomeAttribute('bed_file') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/nextflow.config b/nextflow.config index 7fe2fd01..46a7a71b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,18 +45,9 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - genome_name = null - ascat_allele_files = null // Zip file with allele files - ascat_loci_files = null // Zip file with loci files ascat_gc_files = null // Optional: most likely not needed for long read (zip file) ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) - // WAKHAN options - centromere_bed = null - - // Severus options - pon_file = null - bed_file = null // MultiQC options multiqc_config = null diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index b6e00786..7747ebfb 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -8,6 +8,7 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' // // IMPORT MODULES @@ -78,6 +79,15 @@ workflow LR_SOMATIC { 'hifi_revio' : 'hifi_revio_ss' ] + + // Load in igenomes + params.fasta = getGenomeAttribute('fasta') + params.genome_name = getGenomeAttribute('genome_name') + params.ascat_allele_files = getGenomeAttribute('ascat_alleles') + params.ascat_loci_files = getGenomeAttribute('ascat_loci') + params.centromere_bed = getGenomeAttribute('centromere_bed') + params.pon_file = getGenomeAttribute('pon_file') + params.bed_file = getGenomeAttribute('bed_file') ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() @@ -340,7 +350,9 @@ workflow LR_SOMATIC { // // MODULE: SEVERUS // - + println "SEVERUS input channel: $params.pon_file" + println "SEVERUS input channel: $params.bed_file" + SEVERUS ( severus_reformat, [[:], params.bed_file, params.pon_file] @@ -363,7 +375,6 @@ workflow LR_SOMATIC { // Module: MOSDEPTH // - ch_mosdepth_global = Channel.empty() ch_mosdepth_summary = Channel.empty() From e4b83684d83348302585172c269b273605a8ff95 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 14:10:23 +0200 Subject: [PATCH 202/557] fixed ascat and some minor samplesheet stuff --- assets/samplesheet.csv | 10 ++++------ conf/modules.config | 1 - conf/test.config | 9 +++------ modules/nf-core/ascat/ascat.diff | 14 +++++++++++++- modules/nf-core/ascat/main.nf | 2 +- workflows/lr_somatic.nf | 3 +-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 39588668..69db65ba 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,7 +1,5 @@ sample,bam_tumor,bam_normal,platform,sex,fiber -sample1,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_BL2009_ONT_UL_chr19_downsample.bam,ont,female,n -sample2,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578BST_HIFI_chr19.bam,pb,female,n -sample3,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,,ont,female,n -sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,,pb,female,n -sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19_rep2.bam,,pb,female,n -sample5,/scratch/leuven/351/vsc35115/downsampled.bam,,pb,female,y +sample1,tumour1.bam,normal1.bam,ont,female,n +sample2,tumour2.bam,,ont,female,y +sample3,tumour3.bam,,pb,male,n +sample4,tumour4.bam,normal4.bam,pb,male,y diff --git a/conf/modules.config b/conf/modules.config index d00a2b26..b7f1415b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -173,7 +173,6 @@ process { withName : '.*:ASCAT' { ext.args = { [ "gender": meta.sex == 'female' ? 'XX' : 'XY', - "genomeVersion": params.genome_name, "purity": params.ascat_purity, "ploidy": params.ascat_ploidy, "minCounts": params.ascat_min_counts, diff --git a/conf/test.config b/conf/test.config index de54da5b..65171e8e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,12 +25,9 @@ params { // Input data input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" - //pon_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/PoN_1000G_chm13.tsv.gz" - //bed_file = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/chm13.bed" - genome = "CHM13" - // ASCAT files - //ascat_allele_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" - //ascat_loci_files = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + + // Additional params + genome = "CHM13" ascat_chroms = "19" ascat_min_counts = 2 } diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index c0e28cee..79d5c28e 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -3,7 +3,7 @@ Changes in component 'nf-core/ascat' Changes in 'ascat/main.nf': --- modules/nf-core/ascat/main.nf +++ modules/nf-core/ascat/main.nf -@@ -4,8 +4,8 @@ +@@ -4,11 +4,12 @@ conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -14,6 +14,18 @@ Changes in 'ascat/main.nf': input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) ++ val(genomeVersion) + path(allele_files) + path(loci_files) + path(bed_file) // optional +@@ -34,7 +35,6 @@ + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def gender = args.gender ? "$args.gender" : "NULL" +- def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" + def purity = args.purity ? "$args.purity" : "NULL" + def ploidy = args.ploidy ? "$args.ploidy" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" @@ -48,7 +48,12 @@ def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 1e57c29b..89b16853 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -9,6 +9,7 @@ process ASCAT { input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) + val(genomeVersion) path(allele_files) path(loci_files) path(bed_file) // optional @@ -34,7 +35,6 @@ process ASCAT { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def gender = args.gender ? "$args.gender" : "NULL" - def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" def purity = args.purity ? "$args.purity" : "NULL" def ploidy = args.ploidy ? "$args.ploidy" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 7747ebfb..bfd31535 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -350,8 +350,6 @@ workflow LR_SOMATIC { // // MODULE: SEVERUS // - println "SEVERUS input channel: $params.pon_file" - println "SEVERUS input channel: $params.bed_file" SEVERUS ( severus_reformat, @@ -431,6 +429,7 @@ workflow LR_SOMATIC { ASCAT ( ascat_ch, + params.genome_name, allele_files, loci_files, [], From 34fc197cf16c7ef3ff16c375b234e6d026edb751 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 14:13:33 +0200 Subject: [PATCH 203/557] also fixed samtools faidx --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b7f1415b..d3190d31 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -210,8 +210,8 @@ process { } withName: '.*:SAMTOOLS_FAIDX' { - publishDir [ - enabled = false + publishDir = [ + enabled: false ] } From f5219de8343531d4307affe5a9e0431196474a12 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 10 Apr 2025 14:58:31 +0200 Subject: [PATCH 204/557] fixed samtools output --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index d3190d31..a55e1a5e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -214,6 +214,12 @@ process { enabled: false ] } + + withName: '.*:SAMTOOLS_CAT' { + publishDir = [ + enabled: false + ] + } withName: '.*:LONGPHASE_HAPLOTAG' { publishDir = [ From eafb36a4b7ed6dff1c5e11cb0e42b4c0b88267c9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 11:51:13 +0200 Subject: [PATCH 205/557] made 'GRCh38 and CHM13' the only options for --genome --- nextflow_schema.json | 59 ++------------------------------------------ 1 file changed, 2 insertions(+), 57 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index bf653cef..dd39d3d4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,17 +53,8 @@ "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." - }, - "fasta": { - "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/plain", - "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", - "fa_icon": "far fa-file-code" + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details.", + "enum": ["GRCh38", "CHM13"] }, "igenomes_ignore": { "type": "boolean", @@ -103,22 +94,6 @@ } } }, - "severus_parameters": { - "title": "Severus parameters", - "type": "object", - "description": "Severus specific parameters", - "default": "", - "properties": { - "pon_file": { - "type": "string", - "description": "Path to Panel of Normal files" - }, - "bed_file": { - "type": "string", - "description": "Path to bed file" - } - } - }, "ascat_parameters": { "title": "ASCAT parameters", "type": "object", @@ -162,18 +137,6 @@ "type": "string", "description": "Chromosomes to process (automatically inferred, only use if you want to run on a subset)" }, - "genome_name": { - "type": "string", - "description": "Genome name (hg19, hg38, or CHM13)" - }, - "ascat_allele_files": { - "type": "string", - "description": "Path to (zip) of allele files" - }, - "ascat_loci_files": { - "type": "string", - "description": "path to (zip) of loci files" - }, "ascat_gc_files": { "type": "string", "description": "Path to (zip) of GC files" @@ -184,18 +147,6 @@ } } }, - "wakhan_parameters": { - "title": "Wakhan parameters", - "type": "object", - "description": "", - "default": "", - "properties": { - "centromere_bed": { - "type": "string", - "description": "Path to centromere location bed file for Wakhan" - } - } - }, "skip_options": { "title": "Skip options", "type": "object", @@ -388,15 +339,9 @@ { "$ref": "#/$defs/minimap2_options" }, - { - "$ref": "#/$defs/severus_parameters" - }, { "$ref": "#/$defs/ascat_parameters" }, - { - "$ref": "#/$defs/wakhan_parameters" - }, { "$ref": "#/$defs/skip_options" }, From c678bd8aa32db925b770f8b2917ce3ed7322f85f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 11:59:22 +0200 Subject: [PATCH 206/557] changed modules.config formatting and also restructured output files --- README.md | 2 +- conf/modules.config | 222 +++++++++++++++++++++++++------------------- 2 files changed, 129 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index ed85d8cd..c730856a 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ sample3,tumour.bam,,pb,male,n sample4,tumour.bam,normal.bam,pb,male,y ``` -Each row represents a sample. 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. +Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: diff --git a/conf/modules.config b/conf/modules.config index a55e1a5e..0fc37253 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,7 +17,12 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - + + + // + // QC Processes + // + withName: '.*:MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ @@ -27,25 +32,20 @@ process { ] } - withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_mapped" } - ext.args = { - [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : - ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), - params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " - ].join(' ').trim() - } - ext.args4 = "-T '*'" + withName: '.*:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}" } publishDir = [ - enabled: false + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/samtools/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_ubam" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_ubam" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -53,123 +53,195 @@ process { withName: '.*:CRAMINO_POST' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/cramino_aln" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:MODKIT_PILEUP' { + withName: '.*:FIBERTOOLSRS_QC' { + ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/modkit_pileup" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/fibertoolsrs" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:FIBERTOOLSRS_QC' { - ext.args = { params.autocorrelation ? "--acf" : '' } + withName: '.*:MOSDEPTH' { + ext.args = { '-n -x' } publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/fibertoolsrs" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/mosdepth" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: '.*:MOSDEPTH' { - ext.args = { '-n -x' } + + // + // Preprocessing and other processes + // + + withName: '.*:PREPARE_REFERENCE_FILES' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:UNZIP_.*' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:METAEXTRACT' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/mosdepth" }, + path: { "${params.outdir}/${meta.id}/metaextract" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: '.*:FIBERTOOLSRS_PREDICTM6A' { + + withName: '.*:SAMTOOLS_FAIDX' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:SAMTOOLS_CAT' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:VCFSPLIT' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // + // MINIMAP2 + // + + withName: '.*:MINIMAP2_ALIGN' { + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - params.keep_kinetic_data ? "--keep" : '', - params.keep_all_calls ? "--all-calls" : '' + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), + params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " ].join(' ').trim() } + ext.args4 = "-T '*'" + publishDir = [ + enabled: false + ] + } + + // + // Methylation related processes + // + + withName: '.*:MODKIT_PILEUP' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/predictm6a" }, + path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/modkit_pileup" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:SEVERUS' { - ext.args = '--min-support 3 --output-read-ids ' + withName: '.*:FIBERTOOLSRS_PREDICTM6A' { + ext.args = { + [ + params.keep_kinetic_data ? "--keep" : '', + params.keep_all_calls ? "--all-calls" : '' + ].join(' ').trim() + } publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/severus" }, + path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/fibertoolsrs/predictm6a" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:FIBERTOOLSRS_FIRE' { - ext.args = { (meta.platform == "ont") ? "--ont" : "" } //TODO: this won't work. Need to import this module twice with different args + ext.args = { (meta.platform == "ont") ? "--ont" : "" } publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/methylation/fibertoolsrs/fire" }, + path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/fibertoolsrs/fire" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: '.*:CLAIRSTO' { + + // + // Phasing processes + // + + withName: '.*:LONGPHASE_PHASE' { + ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/clairsto" }, + path: { "${params.outdir}/${meta.id}/bamfiles" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + - withName: '.*:CLAIRS' { + withName: '.*:LONGPHASE_HAPLOTAG' { publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/clairs" }, + path: { "${params.outdir}/${meta.id}/bamfiles" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:CLAIR3' { + // + // Structural variant calling processes + // + + withName: '.*:SEVERUS' { + ext.args = '--min-support 3 --output-read-ids ' publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/clair3" }, + path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}" } + // + // Small variant calling processes + // + + withName: '.*:CLAIRSTO' { publishDir = [ - path: { "${params.outdir}/${meta.id}/${meta.type}/qc/samtools/" }, + path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:PREPARE_REFERENCE_FILES' { - publishDir = [ - enabled: false ] } - - withName: '.*:UNZIP_.*' { + + withName: '.*:CLAIRS' { publishDir = [ - enabled: false + path: { "${params.outdir}/${meta.id}/variants/clairs" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:METAEXTRACT' { + withName: '.*:CLAIR3' { publishDir = [ - path: { "${params.outdir}/${meta.id}/metaextract" }, + path: { "${params.outdir}/${meta.id}/variants/clair3" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + // + // Copy number calling processes + // + withName : '.*:ASCAT' { ext.args = { [ "gender": meta.sex == 'female' ? 'XX' : 'XY', @@ -195,45 +267,7 @@ process { "--genome-name ${meta.id}", "--out-dir-plots ./", "--centromere ${params.centromere}", - "--genome-name ${params.genome_name}" ].join(' ').trim() } } - - withName: '.*:LONGPHASE_PHASE' { - ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} - publishDir = [ - path: { "${params.outdir}/${meta.id}/longphase_phase" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:SAMTOOLS_FAIDX' { - publishDir = [ - enabled: false - ] - } - - withName: '.*:SAMTOOLS_CAT' { - publishDir = [ - enabled: false - ] - } - - withName: '.*:LONGPHASE_HAPLOTAG' { - publishDir = [ - path: { "${params.outdir}/${meta.id}/longphase_haplotag" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: '.*:VCFSPLIT' { - publishDir = [ - path: { "${params.outdir}/${meta.id}/variants/clairsto" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} +} \ No newline at end of file From 8e22b27588c452df23c3f59a8ada7781fc041d38 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 12:00:27 +0200 Subject: [PATCH 207/557] added samtools index with disabled publishdir --- conf/modules.config | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 0fc37253..75ccc351 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -112,7 +112,12 @@ process { enabled: false ] } - + + withName: '.*:SAMTOOLS_INDEX' { + publishDir = [ + enabled: false + ] + } withName: '.*:VCFSPLIT' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, From 0da489e57399109eb44aacf3889bcd7bd45bf1a7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 12:03:43 +0200 Subject: [PATCH 208/557] fixed igenomes ascat files --- conf/igenomes.config | 4 ++-- workflows/lr_somatic.nf | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index b72c42fb..d5e166ec 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -14,8 +14,8 @@ params { 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" genome_name = "hg38" - ascat_alleles = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/ASCAT/G1000_alleles_hg19.zip" - ascat_loci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/ASCAT/G1000_loci_hg19.zip" + ascat_alleles = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_alleles_hg38.zip" + ascat_loci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_loci_hg38.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index bfd31535..23d4b172 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -27,7 +27,6 @@ include { LONGPHASE_PHASE } from '../modules/nf-core/longphase/phase/m include { LONGPHASE_HAPLOTAG } from '../modules/nf-core/longphase/haplotag/main' include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { METAEXTRACT } from '../modules/local/metaextract/main' -include { SAMTOOLS_INDEX } from '../modules/nf-core/samtools/index/main.nf' include { WAKHAN } from '../modules/local/wakhan/main' include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' From d155e1c35956b888569a2d0e31e840344b739a6f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 12:04:58 +0200 Subject: [PATCH 209/557] fixed igenomes ascat files --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index d5e166ec..13f859bd 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -12,7 +12,7 @@ params { // illumina iGenomes reference file paths genomes { 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + fasta = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Sequence/WholeGenomeFasta/Homo_sapiens_assembly38.fasta" genome_name = "hg38" ascat_alleles = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_alleles_hg38.zip" ascat_loci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_loci_hg38.zip" From 1368c79a46d5f4d895a15ac62a5b5aaec3f48f73 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 11 Apr 2025 12:10:45 +0200 Subject: [PATCH 210/557] set samtools index to bamfile output --- conf/modules.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 75ccc351..0984a9a0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -115,9 +115,12 @@ process { withName: '.*:SAMTOOLS_INDEX' { publishDir = [ - enabled: false + path: { "${params.outdir}/${meta.id}/bamfiles" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:VCFSPLIT' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, From 01c7b0506b5f05d300b797a2799f81c1f68bff11 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 14 Apr 2025 09:23:43 +0200 Subject: [PATCH 211/557] Update process for FIRE --- modules/local/fibertoolsrs/fire/main.nf | 2 +- workflows/lr_somatic.nf | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index cf58369b..99604f15 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -17,7 +17,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" - label 'process_single' + label 'process_very_high' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index bfd31535..4bee3cfe 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -79,7 +79,7 @@ workflow LR_SOMATIC { 'hifi_revio' : 'hifi_revio_ss' ] - + // Load in igenomes params.fasta = getGenomeAttribute('fasta') params.genome_name = getGenomeAttribute('genome_name') @@ -185,6 +185,7 @@ workflow LR_SOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { + ch_cat_ubams.view() ch_cat_ubams .branch{ meta, bams -> pacBio: meta.platform == "pb" @@ -350,7 +351,7 @@ workflow LR_SOMATIC { // // MODULE: SEVERUS // - + SEVERUS ( severus_reformat, [[:], params.bed_file, params.pon_file] From d6b12d1421a78cc3588a1495743fcda9080e008f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 14 Apr 2025 10:12:18 +0200 Subject: [PATCH 212/557] change process for minimap2 to very_high --- modules/nf-core/minimap2/align/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf index d82dc14d..96504e82 100644 --- a/modules/nf-core/minimap2/align/main.nf +++ b/modules/nf-core/minimap2/align/main.nf @@ -1,6 +1,6 @@ process MINIMAP2_ALIGN { tag "$meta.id" - label 'process_high' + label 'process_very_high' // Note: the versions here need to match the versions used in the mulled container below and minimap2/index conda "${moduleDir}/environment.yml" From 6ba258c419c27a4abddd025e2340af1b81012c92 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 14 Apr 2025 10:13:46 +0200 Subject: [PATCH 213/557] remove view --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 4bee3cfe..4083afbb 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -185,7 +185,7 @@ workflow LR_SOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { - ch_cat_ubams.view() + //ch_cat_ubams.view() ch_cat_ubams .branch{ meta, bams -> pacBio: meta.platform == "pb" From 39d8e7b810835ce4ba0efc5057dc499258e74594 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 14 Apr 2025 10:19:27 +0200 Subject: [PATCH 214/557] process high mem to all fiber tools modules --- modules/local/fibertoolsrs/fire/main.nf | 1 + modules/local/fibertoolsrs/nucleosomes/main.nf | 1 + modules/local/fibertoolsrs/predictm6a/main.nf | 1 + 3 files changed, 3 insertions(+) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 99604f15..08d2dbaf 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -18,6 +18,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' + label 'process_high_memory' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 0c7fd2df..6722aab2 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -18,6 +18,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { tag "$meta.id" label 'process_very_high' + label 'process_high_memory' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 059b31f0..e91572b9 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -18,6 +18,7 @@ process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" label 'process_very_high' + label 'process_high_memory' // TODO nf-core: List required Conda package(s). // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). From 6f8b729492c814b89b4e3b1e12b167758804ca0c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 14 Apr 2025 11:10:33 +0200 Subject: [PATCH 215/557] changed ascat to own github --- conf/igenomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 13f859bd..43b78c2d 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -14,8 +14,8 @@ params { 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Sequence/WholeGenomeFasta/Homo_sapiens_assembly38.fasta" genome_name = "hg38" - ascat_alleles = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_alleles_hg38.zip" - ascat_loci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/G1000_loci_hg38.zip" + ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_hg38.zip" + ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_hg38.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" From 0f6b2781a7af57c83e7916906beb1770efce14d1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 15 Apr 2025 11:48:54 +0200 Subject: [PATCH 216/557] keeps pacbio kinetics info --- conf/modules.config | 55 +++++++++++++++++++++++---------------------- nextflow.config | 12 +++++----- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0984a9a0..3cf9527a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,12 +17,12 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - - + + // // QC Processes // - + withName: '.*:MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ @@ -31,7 +31,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}" } publishDir = [ @@ -40,7 +40,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' @@ -76,37 +76,36 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + // // Preprocessing and other processes // - + withName: '.*:PREPARE_REFERENCE_FILES' { publishDir = [ enabled: false ] } - + withName: '.*:UNZIP_.*' { publishDir = [ enabled: false ] } - + withName: '.*:METAEXTRACT' { publishDir = [ - path: { "${params.outdir}/${meta.id}/metaextract" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:SAMTOOLS_FAIDX' { publishDir = [ enabled: false ] } - + withName: '.*:SAMTOOLS_CAT' { publishDir = [ enabled: false @@ -128,18 +127,20 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + // // MINIMAP2 // - + withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_mapped" } + ext.prefix = { "${meta.id}_mapped" } ext.args = { [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), - params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no " + params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no ", + "-y", + "-Y" ].join(' ').trim() } ext.args4 = "-T '*'" @@ -147,11 +148,11 @@ process { enabled: false ] } - + // // Methylation related processes // - + withName: '.*:MODKIT_PILEUP' { publishDir = [ path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/modkit_pileup" }, @@ -173,7 +174,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { (meta.platform == "ont") ? "--ont" : "" } publishDir = [ @@ -182,11 +183,11 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + // // Phasing processes // - + withName: '.*:LONGPHASE_PHASE' { ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ @@ -195,7 +196,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:LONGPHASE_HAPLOTAG' { publishDir = [ @@ -204,7 +205,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + // // Structural variant calling processes // @@ -237,7 +238,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: '.*:CLAIR3' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clair3" }, @@ -268,7 +269,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName : '.*:WAKHAN' { ext.args = { [ @@ -278,4 +279,4 @@ process { ].join(' ').trim() } } -} \ No newline at end of file +} diff --git a/nextflow.config b/nextflow.config index 46a7a71b..27d949ec 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,28 +26,28 @@ params { skip_ascat = false skip_wakhan = false skip_fiber = false - + // minimap2 options minimap2_ont_model = null minimap2_pb_model = null save_secondary_alignment = true - + // ASCAT options ascat_ploidy = null ascat_min_base_qual = 20 ascat_min_counts = 10 ascat_min_map_qual = 10 ascat_purity = null - ascat_longread_bins = 1000 + ascat_longread_bins = 2000 ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) - + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified ascat_gc_files = null // Optional: most likely not needed for long read (zip file) ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) - + // MultiQC options multiqc_config = null @@ -55,7 +55,7 @@ params { multiqc_logo = null max_multiqc_email_size = '25.MB' multiqc_methods_description = null - + // Boilerplate options outdir = null publish_dir_mode = 'copy' From 27691c91c821006c1136302aa738ba1a2bbc9154 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 15 Apr 2025 11:53:26 +0200 Subject: [PATCH 217/557] fixed metaextract output --- conf/modules.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3cf9527a..fb371831 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -95,8 +95,7 @@ process { withName: '.*:METAEXTRACT' { publishDir = [ - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } From 265a43852ffe8e0c83a97cc151ce700a7f9141fd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 15 Apr 2025 13:13:19 +0200 Subject: [PATCH 218/557] added ascat penalty parameter and removed longphase germline.vcf.gz from final output --- conf/modules.config | 8 +++----- modules/nf-core/ascat/main.nf | 5 +++-- nextflow.config | 1 + 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index fb371831..d16bc9ee 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -190,13 +190,10 @@ process { withName: '.*:LONGPHASE_PHASE' { ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} publishDir = [ - path: { "${params.outdir}/${meta.id}/bamfiles" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } - withName: '.*:LONGPHASE_HAPLOTAG' { publishDir = [ path: { "${params.outdir}/${meta.id}/bamfiles" }, @@ -260,7 +257,8 @@ process { "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual, "longread_bins": params.ascat_longread_bins, - "allele_counter_flags": params.ascat_allelecounter_flags + "allele_counter_flags": params.ascat_allelecounter_flags, + "penalty": params.ascat_penalty ] } publishDir = [ path: { "${params.outdir}/${meta.id}/ascat" }, diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 89b16853..ad0e36cb 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -37,6 +37,7 @@ process ASCAT { def gender = args.gender ? "$args.gender" : "NULL" def purity = args.purity ? "$args.purity" : "NULL" def ploidy = args.ploidy ? "$args.ploidy" : "NULL" + def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" @@ -138,9 +139,9 @@ process ASCAT { #Segment the data if($normal_exists) { - ascat.bc = ascat.aspcf(ascat.bc, seed=42) + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) } else { - ascat.bc = ascat.aspcf(ascat.bc, seed=42, ascat.gg = gg) + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) } #Plot the segmented data diff --git a/nextflow.config b/nextflow.config index 27d949ec..779ae7f8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -37,6 +37,7 @@ params { ascat_min_base_qual = 20 ascat_min_counts = 10 ascat_min_map_qual = 10 + ascat_penalty = 150 ascat_purity = null ascat_longread_bins = 2000 ascat_allelecounter_flags = "-f 0" From b0c545dd044ad74aadfebb75b6aca68c074e65d4 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 15 Apr 2025 13:17:25 +0200 Subject: [PATCH 219/557] updated ascat .diff --- modules/nf-core/ascat/ascat.diff | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index 79d5c28e..9b47a3aa 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -18,15 +18,18 @@ Changes in 'ascat/main.nf': path(allele_files) path(loci_files) path(bed_file) // optional -@@ -34,7 +35,6 @@ +@@ -34,9 +35,9 @@ def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def gender = args.gender ? "$args.gender" : "NULL" - def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" def purity = args.purity ? "$args.purity" : "NULL" def ploidy = args.ploidy ? "$args.ploidy" : "NULL" ++ def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" -@@ -48,7 +48,12 @@ + def rt_input = rt_file ? "$rt_file" : "NULL" + +@@ -48,7 +49,12 @@ def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" @@ -40,7 +43,7 @@ Changes in 'ascat/main.nf': """ #!/usr/bin/env Rscript library(RColorBrewer) -@@ -65,21 +70,22 @@ +@@ -65,21 +71,22 @@ #prepare from BAM files ascat.prepareHTS( tumourseqfile = "$input_tumor", @@ -65,7 +68,7 @@ Changes in 'ascat/main.nf': $skip_allele_counting_tumour_arg $skip_allele_counting_normal_arg, seed = 42 -@@ -87,14 +93,28 @@ +@@ -87,14 +94,28 @@ #Load the data @@ -102,15 +105,15 @@ Changes in 'ascat/main.nf': #Plot the raw data ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) -@@ -117,7 +137,11 @@ +@@ -117,7 +138,11 @@ } #Segment the data - ascat.bc = ascat.aspcf(ascat.bc, seed=42) + if($normal_exists) { -+ ascat.bc = ascat.aspcf(ascat.bc, seed=42) ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) + } else { -+ ascat.bc = ascat.aspcf(ascat.bc, seed=42, ascat.gg = gg) ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) + } #Plot the segmented data From 988d5de9f4eeb4e73481916b45b192b3c1f6522d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 16 Apr 2025 12:11:44 +0200 Subject: [PATCH 220/557] fixed skips --- workflows/lr_somatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 47767ff1..de371f71 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -376,7 +376,7 @@ workflow LR_SOMATIC { ch_mosdepth_global = Channel.empty() ch_mosdepth_summary = Channel.empty() - if (!params.skip_qc && params.skip_mosdepth) { + if (!params.skip_qc && !params.skip_mosdepth) { // prepare mosdepth input channel: we need to specify compulsory path to bed as well @@ -402,7 +402,7 @@ workflow LR_SOMATIC { ch_bam_flagstat = Channel.empty() ch_bam_idxstats = Channel.empty() - if (!params.skip_qc && params.skip_bamstats ) { + if (!params.skip_qc && !params.skip_bamstats ) { BAM_STATS_SAMTOOLS ( ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel From d46b4f63e178b827ab2294679281ebfbfcf17f58 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 18 Apr 2025 13:59:07 +0200 Subject: [PATCH 221/557] Update nextflow_schema.json --- nextflow_schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index dd39d3d4..346f08f0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -108,6 +108,11 @@ "type": "string", "description": "Enforce a purity" }, + "ascat_penalty": { + "type": "integer", + "default": 150, + "description": "Penalty value" + }, "ascat_min_base_qual": { "type": "integer", "default": 20, From 13947ed3f1b357fc32ef2a7d3d38ecd8229ef040 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 May 2025 10:16:36 +0200 Subject: [PATCH 222/557] fix severus typo --- modules/nf-core/severus/main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 9198d8ec..121114a2 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -20,12 +20,12 @@ process SEVERUS { tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf //, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions From a66f6744b72b13d772260668ddb7ad3373dcf951 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 May 2025 10:58:22 +0200 Subject: [PATCH 223/557] add indel flag to phasing --- conf/modules.config | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d16bc9ee..95d6b53e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -188,7 +188,12 @@ process { // withName: '.*:LONGPHASE_PHASE' { - ext.args = {meta.platform == 'pb' ? '--pb' : '--ont'} + ext.args = { + [ + meta.platform == 'pb' ? '--pb' : '--ont', + "-indels", + ].join(' ').trim() + } publishDir = [ enabled: false ] From b627d9f7294b2e3e68b4428ced28022611f033cb Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 13 May 2025 09:46:03 +0200 Subject: [PATCH 224/557] add dash --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 95d6b53e..1af772a4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -191,7 +191,7 @@ process { ext.args = { [ meta.platform == 'pb' ? '--pb' : '--ont', - "-indels", + "--indels", ].join(' ').trim() } publishDir = [ From 1b8c9ab3dc39c1f7e10ee72a2b2a0996ed35e62f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 10:46:16 +0200 Subject: [PATCH 225/557] Adds user specified models to clair models so that i dont have to keep adding new models indefinitely (unlike ONT lmao) --- nextflow.config | 5 +++++ subworkflows/local/tumor_normal_happhase.nf | 2 +- subworkflows/local/tumor_only_happhase.nf | 2 +- workflows/lr_somatic.nf | 15 ++++++++++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/nextflow.config b/nextflow.config index 779ae7f8..8d210a2e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,6 +43,11 @@ params { ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) + // Clair model options + specificed_clair_3_model = null + specificed_clair_S_model = null + specificed_clair_STO_model = null + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 7e1e168d..db164199 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -32,7 +32,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - def clair3_model = clair3_modelMap.get(meta.basecall_model.toString().trim()) + def clair3_model = (params.specificed_clair_3_model == null) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_3_model def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 92a22e78..3a13c3b4 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -16,7 +16,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = clairSTO_modelMap.get(meta.basecall_model.toString().trim()) + def clairSTO_model = (params.specificed_clair_STO_model == null) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_STO_model return [meta, bam, bai, clairSTO_model] } .set{tumor_bams} diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index de371f71..9f223317 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -68,7 +68,6 @@ workflow LR_SOMATIC { 'hifi_revio' : 'hifi_revio' ] - //ClairSTO and ClairS have the same set of models def clairs_modelMap = [ 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', @@ -79,6 +78,16 @@ workflow LR_SOMATIC { ] + def clairsto_modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + // Load in igenomes params.fasta = getGenomeAttribute('fasta') params.genome_name = getGenomeAttribute('genome_name') @@ -316,7 +325,7 @@ workflow LR_SOMATIC { branched_minimap.tumor_only, ch_fasta, ch_fai, - clairs_modelMap + clairsto_modelMap ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -330,7 +339,7 @@ workflow LR_SOMATIC { // Get ClairS input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = clairs_modelMap.get(meta.basecall_model.toString().trim()) + def model = (params.specificed_clair_S_model) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_S_model return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } .set { clairs_input } From 18325e87cf36beb03bf05e781a52e4a4a55e6838 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 13:28:05 +0200 Subject: [PATCH 226/557] Change model input to optional sample sheet param now you just pop it in the sample sheet for clair models if you wish --- assets/schema_input.json | 9 +++++++++ assets/test_sheet.csv | 6 ++++++ nextflow.config | 5 ----- subworkflows/local/tumor_normal_happhase.nf | 2 +- subworkflows/local/tumor_only_happhase.nf | 2 +- .../local/utils_nfcore_lr_somatic_pipeline/main.nf | 7 +++++-- workflows/lr_somatic.nf | 14 ++------------ 7 files changed, 24 insertions(+), 21 deletions(-) create mode 100644 assets/test_sheet.csv diff --git a/assets/schema_input.json b/assets/schema_input.json index f48d9615..afbc7e6e 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -41,6 +41,15 @@ "type": "string", "enum": ["y", "n"], "errorMessage": "Specifiy (y/n) if sample has had fiberseq performed" + }, + "clair3_model":{ + "type": "string" + }, + "clairSTO_model":{ + "type": "string" + }, + "clairS_model":{ + "type": "string" } }, "required": ["sample", "bam_tumor", "platform", "sex"] diff --git a/assets/test_sheet.csv b/assets/test_sheet.csv new file mode 100644 index 00000000..a850fef1 --- /dev/null +++ b/assets/test_sheet.csv @@ -0,0 +1,6 @@ +sample,bam_tumor,bam_normal,platform,sex,fiber, clair3_model, clairSTO_model,clairS_model +sample1,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_BL2009_ONT_UL_chr19_downsample.bam,ont,female,n,r941_prom_hac_g360+g422,r1041_e82_400bps_hac_v420,r1041_e82_400bps_hac_v410 +sample2,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578BST_HIFI_chr19.bam,pb,female,n,r941_prom_hac_g360+g422_1235,r1041_e82_400bps_hac_v420,r1041_e82_400bps_hac_v410 +sample3,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,,ont,female,n,,,r1041_e82_400bps_hac_v410 +sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,,pb,female,n,,, +sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19_rep2.bam,,pb,female,n,,r1041_e82_400bps_hac_v420, diff --git a/nextflow.config b/nextflow.config index 8d210a2e..779ae7f8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,11 +43,6 @@ params { ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) - // Clair model options - specificed_clair_3_model = null - specificed_clair_S_model = null - specificed_clair_STO_model = null - //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index db164199..d531d4b8 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -32,7 +32,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - def clair3_model = (params.specificed_clair_3_model == null) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_3_model + def clair3_model = (meta.clair3_model != '[]') ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 3a13c3b4..c503218c 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -16,7 +16,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (params.specificed_clair_STO_model == null) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_STO_model + def clairSTO_model = (meta.clairSTO_model != '[]') ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } .set{tumor_bams} diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index 9243abbd..f9178c9d 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -74,9 +74,12 @@ workflow PIPELINE_INITIALISATION { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method, sex, fiber -> + .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> + def real_clair3_model = (clair3_model == null ) ? null : clair3_model + def real_clairS_model = (clair3_model == null ) ? null : clairSTO_model + def real_clairSTO_model = (clair3_model == null ) ? null : clairS_model def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber] + def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .map { meta, bam_tumor, bam_normal -> diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 9f223317..d3953d03 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -78,16 +78,6 @@ workflow LR_SOMATIC { ] - def clairsto_modelMap = [ - 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', - 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'hifi_revio' : 'hifi_revio_ss' - - ] - // Load in igenomes params.fasta = getGenomeAttribute('fasta') params.genome_name = getGenomeAttribute('genome_name') @@ -325,7 +315,7 @@ workflow LR_SOMATIC { branched_minimap.tumor_only, ch_fasta, ch_fai, - clairsto_modelMap + clairs_modelMap ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -339,7 +329,7 @@ workflow LR_SOMATIC { // Get ClairS input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = (params.specificed_clair_S_model) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : params.specificed_clair_S_model + def model = (meta.clairS_model != '[]') ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } .set { clairs_input } From 186b978a895a4edb58226a70427d7ee37d23d823 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 14:13:31 +0200 Subject: [PATCH 227/557] remove test sheet minor fixes --- assets/test_sheet.csv | 6 ------ conf/test.config | 5 +++-- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 assets/test_sheet.csv diff --git a/assets/test_sheet.csv b/assets/test_sheet.csv deleted file mode 100644 index a850fef1..00000000 --- a/assets/test_sheet.csv +++ /dev/null @@ -1,6 +0,0 @@ -sample,bam_tumor,bam_normal,platform,sex,fiber, clair3_model, clairSTO_model,clairS_model -sample1,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_BL2009_ONT_UL_chr19_downsample.bam,ont,female,n,r941_prom_hac_g360+g422,r1041_e82_400bps_hac_v420,r1041_e82_400bps_hac_v410 -sample2,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578BST_HIFI_chr19.bam,pb,female,n,r941_prom_hac_g360+g422_1235,r1041_e82_400bps_hac_v420,r1041_e82_400bps_hac_v410 -sample3,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/headered_H2009_ONT_UL_chr19_downsampled.bam,,ont,female,n,,,r1041_e82_400bps_hac_v410 -sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19.bam,,pb,female,n,,, -sample4,https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/data/aligned/HS578T_HIFI_chr19_rep2.bam,,pb,female,n,,r1041_e82_400bps_hac_v420, diff --git a/conf/test.config b/conf/test.config index 65171e8e..59bdbeba 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,9 +23,10 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + input = "/staging/leuven/stg_00096/home/rforsyth/lr_somatic/assets/test_sheet.csv" + //input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" - + // Additional params genome = "CHM13" ascat_chroms = "19" From 617c5448214270b2befb5429256c6d60bd610b30 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 14:14:09 +0200 Subject: [PATCH 228/557] add fiber to required input --- assets/schema_input.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index afbc7e6e..a33a56df 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -52,6 +52,6 @@ "type": "string" } }, - "required": ["sample", "bam_tumor", "platform", "sex"] + "required": ["sample", "bam_tumor", "platform", "sex","fiber"] } } From 2de7ed12ef038a446652f346508f4ac7126d9700 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 15:41:49 +0200 Subject: [PATCH 229/557] add ascat gc rt files --- nextflow.config | 4 ++-- workflows/lr_somatic.nf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index 779ae7f8..7d0af754 100644 --- a/nextflow.config +++ b/nextflow.config @@ -46,8 +46,8 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - ascat_gc_files = null // Optional: most likely not needed for long read (zip file) - ascat_rt_files = null // Optional: Don't think we have these files yet (zip file) + ascat_gc_files = "/staging/leuven/stg_00096/home/rcools/projects/data_Cools_2022/referencemap/GC_G1000_hg38_chr/GC_G1000_hg38.txt" // Optional: most likely not needed for long read (zip file) + ascat_rt_files = "/staging/leuven/stg_00096/home/rcools/projects/data_Cools_2022/referencemap/RT_G1000_hg38_chr/RT_G1000_hg38.txt" // Optional: Don't think we have these files yet (zip file) // MultiQC options diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d3953d03..d43f433d 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -433,8 +433,8 @@ workflow LR_SOMATIC { loci_files, [], [], - [], - [] + params.ascat_gc_files, + params.ascat_rt_files ) ch_versions = ch_versions.mix(ASCAT.out.versions) From 429f9fba36dd9c431a4a8aadcd20836d723606a4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 16:20:40 +0200 Subject: [PATCH 230/557] Update cramino singularity/docker --- modules/local/cramino/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index f5588440..c8078170 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -4,8 +4,8 @@ process CRAMINO { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cramino:0.16.0--h3dc2dae_0': - 'biocontainers/cramino:0.16.0--h3dc2dae_0' }" + 'https://depot.galaxyproject.org/singularity/cramino:1.0.0--h3dc2dae_0': + 'biocontainers/cramino:1.0.0--h3dc2dae_0' }" input: tuple val(meta), path(bam) From 07e16c0bd7f12659be2ec9f2b1c69cc5a9dffb1d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 30 May 2025 16:21:13 +0200 Subject: [PATCH 231/557] Update environment.yml --- modules/local/cramino/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/cramino/environment.yml b/modules/local/cramino/environment.yml index 7e7abacd..c8b4126f 100644 --- a/modules/local/cramino/environment.yml +++ b/modules/local/cramino/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::cramino=0.15.0" + - "bioconda::cramino=1.0.0" From 13120d0a8020f6e5c46636da5df8d59791967196 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 4 Jun 2025 11:13:12 +0200 Subject: [PATCH 232/557] remove gc_rt and add working long read bin size --- modules/nf-core/ascat/main.nf | 7 ++++--- workflows/lr_somatic.nf | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index ad0e36cb..2bc77a69 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -85,6 +85,7 @@ process ASCAT { $chrom_names_arg $min_base_qual_arg $min_map_qual_arg + $longread_bins $fasta_arg $allele_counter_flags $skip_allele_counting_tumour_arg @@ -122,16 +123,16 @@ process ASCAT { # optional LogRCorrection if("$gc_input" != "NULL") { - gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") + gc_input = paste0(normalizePath("$gc_input")) if("$rt_input" != "NULL"){ - rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") + rt_input = paste0(normalizePath("$rt_input")) ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) #Plot raw data after correction ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) } else { - ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) #Plot raw data after correction ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d43f433d..d0b06cd9 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -433,8 +433,10 @@ workflow LR_SOMATIC { loci_files, [], [], - params.ascat_gc_files, - params.ascat_rt_files + [], + [] + //params.ascat_gc_files, + //params.ascat_rt_files ) ch_versions = ch_versions.mix(ASCAT.out.versions) From fe60b3b5ebd9aa5bca5b9227b746717fbdea305e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 4 Jun 2025 11:17:39 +0200 Subject: [PATCH 233/557] remove gc_rt file defaults --- nextflow.config | 4 ++-- workflows/lr_somatic.nf | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index 7d0af754..d795d64f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -46,8 +46,8 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - ascat_gc_files = "/staging/leuven/stg_00096/home/rcools/projects/data_Cools_2022/referencemap/GC_G1000_hg38_chr/GC_G1000_hg38.txt" // Optional: most likely not needed for long read (zip file) - ascat_rt_files = "/staging/leuven/stg_00096/home/rcools/projects/data_Cools_2022/referencemap/RT_G1000_hg38_chr/RT_G1000_hg38.txt" // Optional: Don't think we have these files yet (zip file) + ascat_gc_files = null + ascat_rt_files = null // MultiQC options diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d0b06cd9..d3953d03 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -435,8 +435,6 @@ workflow LR_SOMATIC { [], [], [] - //params.ascat_gc_files, - //params.ascat_rt_files ) ch_versions = ch_versions.mix(ASCAT.out.versions) From b7391b94a1b2de67e4c61cd7b308fa964eb06921 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 4 Jun 2025 12:01:47 +0200 Subject: [PATCH 234/557] Add diff --- modules/nf-core/ascat/ascat.diff | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index 9b47a3aa..6a1e6401 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -43,7 +43,7 @@ Changes in 'ascat/main.nf': """ #!/usr/bin/env Rscript library(RColorBrewer) -@@ -65,21 +71,22 @@ +@@ -65,21 +71,23 @@ #prepare from BAM files ascat.prepareHTS( tumourseqfile = "$input_tumor", @@ -63,12 +63,13 @@ Changes in 'ascat/main.nf': $chrom_names_arg $min_base_qual_arg $min_map_qual_arg ++ $longread_bins $fasta_arg + $allele_counter_flags $skip_allele_counting_tumour_arg $skip_allele_counting_normal_arg, seed = 42 -@@ -87,14 +94,28 @@ +@@ -87,37 +95,55 @@ #Load the data @@ -105,7 +106,25 @@ Changes in 'ascat/main.nf': #Plot the raw data ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) -@@ -117,7 +138,11 @@ + + # optional LogRCorrection + if("$gc_input" != "NULL") { +- gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") ++ gc_input = paste0(normalizePath("$gc_input")) + + if("$rt_input" != "NULL"){ +- rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") ++ rt_input = paste0(normalizePath("$rt_input")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) + } + else { +- ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) ++ ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) + } } #Segment the data From 7da1e8cccc14ca2b186876a99034c3ad042f40f4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 19 Jun 2025 12:17:14 +0200 Subject: [PATCH 235/557] Update tumor_normal_happhase.nf --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d531d4b8..8861747c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -32,7 +32,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - def clair3_model = (meta.clair3_model != '[]') ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model + def clair3_model = (meta.clair3_model == '[]') ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } From 6be731ccb0ca80b191c20574fa386b889dee3b50 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 19 Jun 2025 12:17:49 +0200 Subject: [PATCH 236/557] Update tumor_only_happhase.nf --- subworkflows/local/tumor_only_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index c503218c..b4265631 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -16,7 +16,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (meta.clairSTO_model != '[]') ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model + def clairSTO_model = (meta.clairSTO_model == '[]') ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } .set{tumor_bams} From 2436e858ef30364da6142bf6b0f44bef1ec1001e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Jun 2025 10:34:34 +0200 Subject: [PATCH 237/557] update severus to 1.5 --- modules/nf-core/severus/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 121114a2..3cf191d9 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -4,8 +4,8 @@ process SEVERUS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/severus:1.3--pyhdfd78af_0': - 'biocontainers/severus:1.3--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/severus:1.5--pyhdfd78af_0': + 'biocontainers/severus:1.5--pyhdfd78af_0' }" input: tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) From db0dedc5749fd04fb2cb616a8ef70153ad742c27 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 30 Jun 2025 13:40:10 +0200 Subject: [PATCH 238/557] Add extra catches for Clair models --- subworkflows/local/tumor_normal_happhase.nf | 2 +- subworkflows/local/tumor_only_happhase.nf | 2 +- workflows/lr_somatic.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 8861747c..df00d768 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -32,7 +32,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - def clair3_model = (meta.clair3_model == '[]') ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model + def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index b4265631..f1ee125a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -16,7 +16,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (meta.clairSTO_model == '[]') ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model + def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } .set{tumor_bams} diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d3953d03..1cb4284d 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -329,7 +329,7 @@ workflow LR_SOMATIC { // Get ClairS input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = (meta.clairS_model != '[]') ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model + def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } .set { clairs_input } From 172424f5d16722855aa852800fbe02fac5528b74 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 30 Jun 2025 14:18:13 +0200 Subject: [PATCH 239/557] update samtools memory + diff file --- modules.json | 3 ++- modules/nf-core/samtools/stats/main.nf | 2 +- .../samtools/stats/samtools-stats.diff | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 modules/nf-core/samtools/stats/samtools-stats.diff diff --git a/modules.json b/modules.json index f23ceb3c..01dca2d8 100644 --- a/modules.json +++ b/modules.json @@ -109,7 +109,8 @@ "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", "installed_by": [ "bam_stats_samtools" - ] + ], + "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 4443948b..eac01eeb 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -1,6 +1,6 @@ process SAMTOOLS_STATS { tag "$meta.id" - label 'process_single' + label 'process_medium' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/samtools/stats/samtools-stats.diff b/modules/nf-core/samtools/stats/samtools-stats.diff new file mode 100644 index 00000000..c82fc0f4 --- /dev/null +++ b/modules/nf-core/samtools/stats/samtools-stats.diff @@ -0,0 +1,19 @@ +Changes in component 'nf-core/samtools/stats' +'modules/nf-core/samtools/stats/meta.yml' is unchanged +Changes in 'samtools/stats/main.nf': +--- modules/nf-core/samtools/stats/main.nf ++++ modules/nf-core/samtools/stats/main.nf +@@ -1,6 +1,6 @@ + process SAMTOOLS_STATS { + tag "$meta.id" +- label 'process_single' ++ label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + +'modules/nf-core/samtools/stats/environment.yml' is unchanged +'modules/nf-core/samtools/stats/tests/tags.yml' is unchanged +'modules/nf-core/samtools/stats/tests/main.nf.test' is unchanged +'modules/nf-core/samtools/stats/tests/main.nf.test.snap' is unchanged +************************************************************ From ca0f8e2f2810d1daab71226d9e865a6dfd9eeda0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 31 Jul 2025 14:14:10 +0200 Subject: [PATCH 240/557] fix for latest nextflow release --- conf/test.config | 4 ++-- nextflow.config | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/conf/test.config b/conf/test.config index 59bdbeba..302664fd 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,8 +23,8 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - input = "/staging/leuven/stg_00096/home/rforsyth/lr_somatic/assets/test_sheet.csv" - //input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + //input = "/staging/leuven/stg_00096/home/rforsyth/lr_somatic/assets/test_sheet.csv" + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" // Additional params diff --git a/nextflow.config b/nextflow.config index d795d64f..35a08cd5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -227,14 +227,13 @@ env { } // Set bash options -process.shell = """\ -bash - -set -e # Exit if a tool returns a non-zero status/exit code -set -u # Treat unset variables and parameters as an error -set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute -set -C # No clobber - prevent output redirection from overwriting files. -""" +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o pipefail" // Returns the status of the last command to exit with a non-zero status or zero if all successfully execute +] // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false From 6250457b61265adea100284748b997c13c9bd9fd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 31 Jul 2025 16:31:57 +0200 Subject: [PATCH 241/557] formatting --- workflows/lr_somatic.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1cb4284d..354f911f 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -8,7 +8,7 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' // // IMPORT MODULES @@ -30,9 +30,8 @@ include { METAEXTRACT } from '../modules/local/metaextract/main' include { WAKHAN } from '../modules/local/wakhan/main' include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' -include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' -include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' - +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' // // IMPORT SUBWORKFLOWS From 675ffa9a88f4c8cf3bb62464e7a7167a046d2d57 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 31 Jul 2025 17:35:09 +0200 Subject: [PATCH 242/557] output structure changes --- conf/modules.config | 4 +++- modules/local/clairsto/main.nf | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 1af772a4..26f29cea 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,7 +195,9 @@ process { ].join(' ').trim() } publishDir = [ - enabled: false + path: { "${params.outdir}/${meta.id}/phased_vcfs" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 0d6e95cd..dbfded13 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -35,6 +35,11 @@ process CLAIRSTO { --output_dir $prefix \\ $conda_prefix \\ $args \\ + + mv $prefix/indel.vcf.gz ./indel.vcf.gz + mv $prefix/indel.vcf.gz.tbi ./indel.vcf.gz.tbi + mv $prefix/snv.vcf.gz ./snv.vcf.gz + mv $prefix/snv.vcf.gz.tbi ./snv.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": From 6620911b721def80438618793c5e1ead1f8fb5b8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 1 Aug 2025 16:25:40 +0200 Subject: [PATCH 243/557] adding wakhan --- modules/local/wakhan/main.nf | 6 +++--- workflows/lr_somatic.nf | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 1e673224..b9600386 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -21,8 +21,8 @@ process WAKHAN { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/wakhan:0.1.1--pyhdfd78af_1': - 'biocontainers/wakhan:0.1.1--pyhdfd78af_1' }" + 'https://depot.galaxyproject.org/singularity/wakhan:0.1.2--pyhdfd78af_0 ': + 'biocontainers/wakhan:0.1.2--pyhdfd78af_0 ' }" input: tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) @@ -49,7 +49,7 @@ process WAKHAN { --breakpoints ${breakpoints} \\ --reference ${reference} \\ --genome-name ${prefix} \\ - --outdir-plots ${prefix} \\ + --outdir-plots . \\ ${phased_vcf} \\ ${args} \\ --threads ${task.cpus} diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1cb4284d..be48a915 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -440,23 +440,25 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(ASCAT.out.versions) } - /* // // MODULE: WAKHAN // - if (!skip_wakhan) { + if (!params.skip_wakhan) { + + // Prepare input channel for WAKHAN + severus_reformat + .join(SEVERUS.out.all_vcf) + .set { wakhan_input } WAKHAN ( - severus_reformat, + wakhan_input, ch_fasta ) ch_versions = ch_versions.mix(WAKHAN.out.versions) } - */ - // // Collate and save software versions // From bccbe22ce75e01688fa39823665acc37229ce23b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 4 Aug 2025 13:30:56 +0200 Subject: [PATCH 244/557] fixed ascat reference files so you can now skip it --- subworkflows/local/prepare_reference_files.nf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 664c2e09..372af8d9 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -77,6 +77,11 @@ workflow PREPARE_REFERENCE_FILES { rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = Channel.fromPath(ascat_loci_rt).collect() + } else { + allele_files = Channel.empty() + loci_files = Channel.empty() + gc_file = Channel.empty() + rt_file = Channel.empty() } emit: From c52399fabc6f744eeb18e69419564ba34faec1ac Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 5 Aug 2025 10:46:22 +0200 Subject: [PATCH 245/557] wakhan output and module config --- conf/modules.config | 13 +++++------ modules/local/wakhan/main.nf | 44 ++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1af772a4..bd6ce3e3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -273,12 +273,11 @@ process { } withName : '.*:WAKHAN' { - ext.args = { - [ - "--genome-name ${meta.id}", - "--out-dir-plots ./", - "--centromere ${params.centromere}", - ].join(' ').trim() - } + ext.args = '--pdf-enable ' + publishDir = [ + path: { "${params.outdir}/${meta.id}/wakhan" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index b9600386..5669df86 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -29,10 +29,30 @@ process WAKHAN { tuple val(meta2), path(reference) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels - tuple val(meta), path("*.bam"), emit: bam - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -42,27 +62,17 @@ process WAKHAN { def prefix = task.ext.prefix ?: "${meta.id}" def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-vcf $vcf" // WARN: Version information not provided by tool on CLI. Please update this string when upgrading BLAZE code - def VERSION = "0.1.1" + def VERSION = "0.1.2" """ wakhan \\ --target-bam ${tumor_input} \\ --breakpoints ${breakpoints} \\ --reference ${reference} \\ --genome-name ${prefix} \\ - --outdir-plots . \\ + --out-dir-plots . \\ ${phased_vcf} \\ ${args} \\ --threads ${task.cpus} - - #micromamba run -n wakhan wakhan \ - #--target-bam /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/CLAIR3/D0/D0_long_tagged_bam_prefix.bam \ - #--breakpoints /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/Severus_run2/all_SVs/severus_all.vcf \ - #--normal-phased-vcf /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/CLAIR3/normal_bam/phased_merge_output.vcf.gz \ - #--genome-name D0 \ - #--out-dir-plots ${VSC_SCRATCH}/wakhan_plots \ - #--reference /staging/leuven/stg_00096/references/GRCh38.alt-masked-V2-noALT/fasta/Homo_sapiens_assembly38_masked_noALT.fa \ - #--threads 12 - cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -73,7 +83,7 @@ process WAKHAN { stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "0.1.1" + def VERSION = "0.1.2" // TODO nf-core: A stub section should mimic the execution of the original module as best as possible // Have a look at the following examples: From 82db916c1f3aa46467cca9883fd60483015dcdb1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 5 Aug 2025 10:58:07 +0200 Subject: [PATCH 246/557] just change output dir to wd --- modules/local/clairsto/main.nf | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index dbfded13..cd597d19 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -32,14 +32,11 @@ process CLAIRSTO { --ref_fn $reference \\ --platform $model \\ --threads $task.cpus \\ - --output_dir $prefix \\ + --output_dir . \\ $conda_prefix \\ $args \\ - mv $prefix/indel.vcf.gz ./indel.vcf.gz - mv $prefix/indel.vcf.gz.tbi ./indel.vcf.gz.tbi - mv $prefix/snv.vcf.gz ./snv.vcf.gz - mv $prefix/snv.vcf.gz.tbi ./snv.vcf.gz.tbi + cat <<-END_VERSIONS > versions.yml "${task.process}": From 732ff81bada0b881d1816b7463c2e7b922522569 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 6 Aug 2025 11:15:27 +0200 Subject: [PATCH 247/557] ext arguments wakhan --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index bd6ce3e3..8eaf4102 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -273,6 +273,12 @@ process { } withName : '.*:WAKHAN' { + ext.args = { + [ + meta.sex == 'female' ? '--contigs chr1-22,chrX' : '--contigs chr1-22,chrX,chrY', + "--pdf-enable", + ].join(' ').trim() + } ext.args = '--pdf-enable ' publishDir = [ path: { "${params.outdir}/${meta.id}/wakhan" }, From 3f1862de04afa7cbd956e1fcad7c84663d2da7a1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 6 Aug 2025 11:39:30 +0200 Subject: [PATCH 248/557] add just chr19 to wakhan for test profile --- conf/modules.config | 3 +- conf/test.config | 7 ++-- nextflow.config | 99 +++++++++++++++++++++++---------------------- 3 files changed, 57 insertions(+), 52 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8eaf4102..0b3be63e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -275,7 +275,8 @@ process { withName : '.*:WAKHAN' { ext.args = { [ - meta.sex == 'female' ? '--contigs chr1-22,chrX' : '--contigs chr1-22,chrX,chrY', + params.wakhan_chroms ? '--contigs ${params.wakhan_chroms}' : + (meta.sex == 'female' ? '--contigs chr1-22,chrX' : '--contigs chr1-22,chrX,chrY'), "--pdf-enable", ].join(' ').trim() } diff --git a/conf/test.config b/conf/test.config index 302664fd..5ac0797f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,7 +28,8 @@ params { fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" // Additional params - genome = "CHM13" - ascat_chroms = "19" - ascat_min_counts = 2 + genome = "CHM13" + ascat_chroms = "19" + ascat_min_counts = 2 + wakhan_chroms = "19" } diff --git a/nextflow.config b/nextflow.config index 35a08cd5..f68de4f9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,76 +11,79 @@ params { // TODO nf-core: Specify your pipeline's command line flags // Input options - input = null + input = null // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false + genome = null + igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_ignore = false // Skip options - skip_qc = false - skip_cramino = false - skip_mosdepth = false - skip_bamstats = false - skip_ascat = false - skip_wakhan = false - skip_fiber = false + skip_qc = false + skip_cramino = false + skip_mosdepth = false + skip_bamstats = false + skip_ascat = false + skip_wakhan = false + skip_fiber = false // minimap2 options - minimap2_ont_model = null - minimap2_pb_model = null - save_secondary_alignment = true + minimap2_ont_model = null + minimap2_pb_model = null + save_secondary_alignment = true // ASCAT options - ascat_ploidy = null - ascat_min_base_qual = 20 - ascat_min_counts = 10 - ascat_min_map_qual = 10 - ascat_penalty = 150 - ascat_purity = null - ascat_longread_bins = 2000 - ascat_allelecounter_flags = "-f 0" - ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) - + ascat_ploidy = null + ascat_min_base_qual = 20 + ascat_min_counts = 10 + ascat_min_map_qual = 10 + ascat_penalty = 150 + ascat_purity = null + ascat_longread_bins = 2000 + ascat_allelecounter_flags = "-f 0" + ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) + + // Wakhan options + wakhan_chroms = null + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified - ascat_gc_files = null - ascat_rt_files = null + ascat_gc_files = null + ascat_rt_files = null // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' + multiqc_config = null + multiqc_title = null + multiqc_logo = null + max_multiqc_email_size = '25.MB' multiqc_methods_description = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - help_full = false - show_hidden = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + help_full = false + show_hidden = false + version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options - config_profile_name = null - config_profile_description = null + config_profile_name = null + config_profile_description = null - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Schema validation default options - validate_params = true + validate_params = true } // Load base.config by default for all pipelines From 8d6d1155115f9f30ab6b05eead09eadd17c48fa1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 6 Aug 2025 13:11:28 +0200 Subject: [PATCH 249/557] ascat output fixes --- modules/nf-core/ascat/ascat.diff | 19 +++++++++++++++---- modules/nf-core/ascat/main.nf | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index 6a1e6401..67d68dbf 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -18,7 +18,18 @@ Changes in 'ascat/main.nf': path(allele_files) path(loci_files) path(bed_file) // optional -@@ -34,9 +35,9 @@ +@@ -23,8 +24,10 @@ + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png ++ tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments ++ tuple val(meta), path("*segments_raw.txt"), emit: segments_raw + path "versions.yml", emit: versions + + when: +@@ -34,9 +37,9 @@ def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def gender = args.gender ? "$args.gender" : "NULL" @@ -29,7 +40,7 @@ Changes in 'ascat/main.nf': def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" -@@ -48,7 +49,12 @@ +@@ -48,7 +51,12 @@ def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" @@ -43,7 +54,7 @@ Changes in 'ascat/main.nf': """ #!/usr/bin/env Rscript library(RColorBrewer) -@@ -65,21 +71,23 @@ +@@ -65,21 +73,23 @@ #prepare from BAM files ascat.prepareHTS( tumourseqfile = "$input_tumor", @@ -69,7 +80,7 @@ Changes in 'ascat/main.nf': $skip_allele_counting_tumour_arg $skip_allele_counting_normal_arg, seed = 42 -@@ -87,37 +95,55 @@ +@@ -87,37 +97,55 @@ #Load the data diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 2bc77a69..0fb5d542 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -24,8 +24,10 @@ process ASCAT { tuple val(meta), path("*LogR.txt"), emit: logrs tuple val(meta), path("*metrics.txt"), emit: metrics tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true tuple val(meta), path("*purityploidy.txt"), emit: purityploidy tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw path "versions.yml", emit: versions when: From a418276de8611c4e7874a6338657b1d7f1f3f1f3 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 10:00:20 +0200 Subject: [PATCH 250/557] update severus to 1.6 --- modules/nf-core/severus/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 3cf191d9..6bd54394 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -4,8 +4,8 @@ process SEVERUS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/severus:1.5--pyhdfd78af_0': - 'biocontainers/severus:1.5--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/severus:1.6--pyhdfd78af_0': + 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) From 82521887d6c1bcdda51f003f87de17b7ed0896cd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 15:40:40 +0200 Subject: [PATCH 251/557] normals fiber optional --- workflows/lr_somatic.nf | 182 +++++++++++++++++++++++++++++----------- 1 file changed, 132 insertions(+), 50 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 354f911f..7b4c4b52 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -183,73 +183,155 @@ workflow LR_SOMATIC { if (!params.skip_fiber) { //ch_cat_ubams.view() - ch_cat_ubams - .branch{ meta, bams -> - pacBio: meta.platform == "pb" - ont: meta.platform == "ont" - } - .set{ch_cat_ubams} - pacbio_bams = ch_cat_ubams.pacBio - pacbio_bams - .branch{meta, bams -> - kinetics: meta.kinetics == "true" - noKinetics: meta.kinetics == "false" - } - .set{pacbio_bams} + if(!params.normal_fiber){ + ch_cat_ubams + .branch { meta, bams -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set { ch_cat_ubams } + ch_cat_ubams.tumor + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams} + + pacbio_bams = ch_cat_ubams.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} + + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} - FIBERTOOLSRS_PREDICTM6A ( - pacbio_bams.kinetics - ) - pacbio_bams.noKinetics - .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) - .set{predicted_bams} + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + + ch_cat_ubams.ont + .mix(predicted_bams) + .set{fiber_branch} + + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + + // + // MODULE: FIBERTOOLSRS_FIRE + // - ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) - ch_cat_ubams.ont - .mix(predicted_bams) - .set{fiber_branch} + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .join(ch_cat_ubams.normal) + .set{ch_cat_ubams} - fiber_branch - .branch{ meta, bams -> - fiber: meta.fiber == "y" - nonFiber: meta.fiber == "n" + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) } - .set{fiber_branch} - // - // MODULE: FIBERTOOLSRS_NUCLEOSOMES - // + } + else{ + ch_cat_ubams + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams} + + pacbio_bams = ch_cat_ubams.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} + + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} - FIBERTOOLSRS_NUCLEOSOMES ( - fiber_branch.fiber - ) + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) - ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + ch_cat_ubams.ont + .mix(predicted_bams) + .set{fiber_branch} - // - // MODULE: FIBERTOOLSRS_FIRE - // + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} - FIBERTOOLSRS_FIRE ( - FIBERTOOLSRS_NUCLEOSOMES.out.bam - ) + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // - ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) - fiber_branch.nonFiber - .mix(FIBERTOOLSRS_FIRE.out.bam) - .set{ch_cat_ubams} + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) - if(!params.skip_qc) { // - // MODULE: FIBERTOOLSRS_QC + // MODULE: FIBERTOOLSRS_FIRE // - FIBERTOOLSRS_QC ( - FIBERTOOLSRS_FIRE.out.bam + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam ) - ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + } } } // From c85b519755fa4110f12b5c0d80d114a5383988fd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 15:44:42 +0200 Subject: [PATCH 252/557] add param --- nextflow.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nextflow.config b/nextflow.config index 35a08cd5..fdb6bfe0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,6 +18,8 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false + normal_fiber = false + // Skip options skip_qc = false skip_cramino = false From c12559ba5e811e4797a2255142e40299a1fe4078 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 15:48:15 +0200 Subject: [PATCH 253/557] update channel structure --- workflows/lr_somatic.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 7b4c4b52..48591554 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -190,6 +190,7 @@ workflow LR_SOMATIC { tumor: meta.type == "tumor" } .set { ch_cat_ubams } + normal_bams = ch_cat_ubams.normal ch_cat_ubams.tumor .branch{ meta, bams -> pacBio: meta.platform == "pb" @@ -247,7 +248,7 @@ workflow LR_SOMATIC { fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) - .join(ch_cat_ubams.normal) + .join(normal_bams) .set{ch_cat_ubams} if(!params.skip_qc) { From 5ffeda7813fe6d66fb8b3e43928f75d04d1413fc Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 15:56:26 +0200 Subject: [PATCH 254/557] change structure --- workflows/lr_somatic.nf | 79 +++++------------------------------------ 1 file changed, 8 insertions(+), 71 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 48591554..e0a0aa00 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -191,7 +191,9 @@ workflow LR_SOMATIC { } .set { ch_cat_ubams } normal_bams = ch_cat_ubams.normal - ch_cat_ubams.tumor + } + + ch_cat_ubams .branch{ meta, bams -> pacBio: meta.platform == "pb" ont: meta.platform == "ont" @@ -218,87 +220,22 @@ workflow LR_SOMATIC { ch_cat_ubams.ont .mix(predicted_bams) .set{fiber_branch} - - fiber_branch - .branch{ meta, bams -> - fiber: meta.fiber == "y" - nonFiber: meta.fiber == "n" - } - .set{fiber_branch} - - // - // MODULE: FIBERTOOLSRS_NUCLEOSOMES - // - - FIBERTOOLSRS_NUCLEOSOMES ( - fiber_branch.fiber - ) - - ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) - - // - // MODULE: FIBERTOOLSRS_FIRE - // - - FIBERTOOLSRS_FIRE ( - FIBERTOOLSRS_NUCLEOSOMES.out.bam - ) - - ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) - + if(!params.normal_fiber){ fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) .join(normal_bams) .set{ch_cat_ubams} - - if(!params.skip_qc) { - // - // MODULE: FIBERTOOLSRS_QC - // - FIBERTOOLSRS_QC ( - FIBERTOOLSRS_FIRE.out.bam - ) - - ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) - } - } - else{ - ch_cat_ubams - .branch{ meta, bams -> - pacBio: meta.platform == "pb" - ont: meta.platform == "ont" - } - .set{ch_cat_ubams} - - pacbio_bams = ch_cat_ubams.pacBio - pacbio_bams - .branch{meta, bams -> - kinetics: meta.kinetics == "true" - noKinetics: meta.kinetics == "false" - } - .set{pacbio_bams} - - FIBERTOOLSRS_PREDICTM6A ( - pacbio_bams.kinetics - ) - pacbio_bams.noKinetics - .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) - .set{predicted_bams} - - ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) - - ch_cat_ubams.ont - .mix(predicted_bams) - .set{fiber_branch} - + else { fiber_branch .branch{ meta, bams -> fiber: meta.fiber == "y" nonFiber: meta.fiber == "n" } .set{fiber_branch} + } + // // MODULE: FIBERTOOLSRS_NUCLEOSOMES // @@ -333,7 +270,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) } - } + } // // MODULE: MINIMAP2_ALIGN From 2b13ed284199308f03003229605b61eeb3f0978a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 16:09:09 +0200 Subject: [PATCH 255/557] change syntax --- workflows/lr_somatic.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index e0a0aa00..10bca84e 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -189,10 +189,10 @@ workflow LR_SOMATIC { normal: meta.type == "normal" tumor: meta.type == "tumor" } - .set { ch_cat_ubams } - normal_bams = ch_cat_ubams.normal + .set { ch_cat_ubams_normal_branching } + normal_bams = ch_cat_ubams_normal_branching.normal + ch_cat_ubams = ch_cat_ubams_normal_branching.tumor } - ch_cat_ubams .branch{ meta, bams -> pacBio: meta.platform == "pb" From 611e48bca87d4f0c7a71c5b2870593eb5ed3d143 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 13 Aug 2025 16:15:06 +0200 Subject: [PATCH 256/557] add --- workflows/lr_somatic.nf | 129 ++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 10bca84e..a055bc12 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -194,82 +194,85 @@ workflow LR_SOMATIC { ch_cat_ubams = ch_cat_ubams_normal_branching.tumor } ch_cat_ubams - .branch{ meta, bams -> - pacBio: meta.platform == "pb" - ont: meta.platform == "ont" - } - .set{ch_cat_ubams} - - pacbio_bams = ch_cat_ubams.pacBio - pacbio_bams - .branch{meta, bams -> - kinetics: meta.kinetics == "true" - noKinetics: meta.kinetics == "false" - } - .set{pacbio_bams} + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams} + pacbio_bams = ch_cat_ubams.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} - FIBERTOOLSRS_PREDICTM6A ( - pacbio_bams.kinetics - ) - pacbio_bams.noKinetics - .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) - .set{predicted_bams} + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} + + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + + ch_cat_ubams.ont + .mix(predicted_bams) + .set{fiber_branch} - ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + + // + // MODULE: FIBERTOOLSRS_FIRE + // + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) - ch_cat_ubams.ont - .mix(predicted_bams) - .set{fiber_branch} + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) if(!params.normal_fiber){ fiber_branch.nonFiber - .mix(FIBERTOOLSRS_FIRE.out.bam) - .join(normal_bams) - .set{ch_cat_ubams} + .join(normal_bams) + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + } else { - fiber_branch - .branch{ meta, bams -> - fiber: meta.fiber == "y" - nonFiber: meta.fiber == "n" - } - .set{fiber_branch} - } - - - // - // MODULE: FIBERTOOLSRS_NUCLEOSOMES - // - - FIBERTOOLSRS_NUCLEOSOMES ( - fiber_branch.fiber - ) + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} - ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + } + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + if(!params.skip_qc) { // - // MODULE: FIBERTOOLSRS_FIRE + // MODULE: FIBERTOOLSRS_QC // - - FIBERTOOLSRS_FIRE ( - FIBERTOOLSRS_NUCLEOSOMES.out.bam + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam ) - ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) - - fiber_branch.nonFiber - .mix(FIBERTOOLSRS_FIRE.out.bam) - .set{ch_cat_ubams} - - if(!params.skip_qc) { - // - // MODULE: FIBERTOOLSRS_QC - // - FIBERTOOLSRS_QC ( - FIBERTOOLSRS_FIRE.out.bam - ) - - ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) - } + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + } } // From 6b66ead37b96c12c0fbbf1cddf6fc710560324b1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 14 Aug 2025 10:21:36 +0200 Subject: [PATCH 257/557] fix clairsto main.nf --- modules/local/clairsto/main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index cd597d19..ac2ca2a7 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -13,10 +13,10 @@ process CLAIRSTO { tuple val(meta3), path(index) output: - tuple val(meta), path("*/indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("*/indel.vcf.gz.tbi"), emit: indel_tbi - tuple val(meta), path("*/snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("*/snv.vcf.gz.tbi"), emit: snv_tbi + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi when: task.ext.when == null || task.ext.when From bc7142abcb3dc95e1a4a72a1345cff23826ee51b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 14 Aug 2025 10:34:57 +0200 Subject: [PATCH 258/557] fix clairsto output paths --- modules/local/clairsto/main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index cd597d19..ac2ca2a7 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -13,10 +13,10 @@ process CLAIRSTO { tuple val(meta3), path(index) output: - tuple val(meta), path("*/indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("*/indel.vcf.gz.tbi"), emit: indel_tbi - tuple val(meta), path("*/snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("*/snv.vcf.gz.tbi"), emit: snv_tbi + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi when: task.ext.when == null || task.ext.when From f71e101ee662527ba7bdb01dc13801d36984a9e2 Mon Sep 17 00:00:00 2001 From: Tim Yu Date: Fri, 15 Aug 2025 14:47:37 +0100 Subject: [PATCH 259/557] Add support to new dorado models --- workflows/lr_somatic.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 354f911f..9a905cb7 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -59,6 +59,7 @@ workflow LR_SOMATIC { main: def clair3_modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'r1041_e82_400bps_sup_v520', 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', @@ -73,6 +74,7 @@ workflow LR_SOMATIC { 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'ont_r10_dorado_sup_5khz_ssrs', 'hifi_revio' : 'hifi_revio_ss' ] From 97a3229478c6f8d6ef5dce92f232b4c30485a582 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 10:13:33 +0200 Subject: [PATCH 260/557] change names add view() to channels --- workflows/lr_somatic.nf | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index a055bc12..beb5008b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -189,22 +189,30 @@ workflow LR_SOMATIC { normal: meta.type == "normal" tumor: meta.type == "tumor" } + .view() .set { ch_cat_ubams_normal_branching } + normal_bams = ch_cat_ubams_normal_branching.normal - ch_cat_ubams = ch_cat_ubams_normal_branching.tumor + ubams = ch_cat_ubams_normal_branching.tumor } - ch_cat_ubams + else { + ubams = ch_cat_ubams + } + ubams .branch{ meta, bams -> pacBio: meta.platform == "pb" ont: meta.platform == "ont" } - .set{ch_cat_ubams} - pacbio_bams = ch_cat_ubams.pacBio + .view() + .set{ch_cat_ubams_pacbio_ont_branching} + + pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio pacbio_bams .branch{meta, bams -> kinetics: meta.kinetics == "true" noKinetics: meta.kinetics == "false" } + .view() .set{pacbio_bams} FIBERTOOLSRS_PREDICTM6A ( @@ -225,6 +233,7 @@ workflow LR_SOMATIC { fiber: meta.fiber == "y" nonFiber: meta.fiber == "n" } + .view() .set{fiber_branch} // @@ -246,16 +255,19 @@ workflow LR_SOMATIC { ) ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + if(!params.normal_fiber){ fiber_branch.nonFiber .join(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) + .view() .set{ch_cat_ubams} } else { fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) + .view() .set{ch_cat_ubams} } From da27014f2254dff73c28fb71485c95836d7dc1ad Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 11:30:32 +0200 Subject: [PATCH 261/557] change views --- workflows/lr_somatic.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index beb5008b..73b7319b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -189,11 +189,12 @@ workflow LR_SOMATIC { normal: meta.type == "normal" tumor: meta.type == "tumor" } - .view() .set { ch_cat_ubams_normal_branching } normal_bams = ch_cat_ubams_normal_branching.normal + normal_bams.view() ubams = ch_cat_ubams_normal_branching.tumor + ubams.view() } else { ubams = ch_cat_ubams @@ -203,16 +204,15 @@ workflow LR_SOMATIC { pacBio: meta.platform == "pb" ont: meta.platform == "ont" } - .view() .set{ch_cat_ubams_pacbio_ont_branching} pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + pacbio_bams.view() pacbio_bams .branch{meta, bams -> kinetics: meta.kinetics == "true" noKinetics: meta.kinetics == "false" } - .view() .set{pacbio_bams} FIBERTOOLSRS_PREDICTM6A ( @@ -233,7 +233,6 @@ workflow LR_SOMATIC { fiber: meta.fiber == "y" nonFiber: meta.fiber == "n" } - .view() .set{fiber_branch} // From b5bb1033f2bca3fc42da5cd3580d9d4440b360f3 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 11:33:31 +0200 Subject: [PATCH 262/557] change name --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 73b7319b..d8b2a314 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -224,7 +224,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) - ch_cat_ubams.ont + ubams.ont .mix(predicted_bams) .set{fiber_branch} From 3f16cd97950f40a904cac8b26ebd71faa4d2701b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 11:36:23 +0200 Subject: [PATCH 263/557] change name --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d8b2a314..07a06dea 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -224,7 +224,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) - ubams.ont + ch_cat_ubams_pacbio_ont_branching.ont .mix(predicted_bams) .set{fiber_branch} From 51d7700cdfdb4b840356d5656f1bb8d17e7e082f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 12:58:51 +0200 Subject: [PATCH 264/557] add views() --- subworkflows/local/tumor_normal_happhase.nf | 3 +++ workflows/lr_somatic.nf | 1 + 2 files changed, 4 insertions(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index df00d768..935b48bd 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -20,6 +20,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal: meta.type == "normal" tumor: meta.type == "tumor" } + .view() .set{mixed_bams} // Get normal bams and add platform/model info for Clair3 usage @@ -36,6 +37,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } + .view() .set{normal_bams} // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] @@ -58,6 +60,7 @@ workflow TUMOR_NORMAL_HAPPHASE { basecall_model: meta.basecall_model] return[new_meta, bam, bai] } + .view() .set{tumor_bams} // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 07a06dea..c8aba2fb 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -318,6 +318,7 @@ workflow LR_SOMATIC { paired: meta.paired_data tumor_only: !meta.paired_data } + .view() .set { branched_minimap } From cdb959ee790f1120c9c54218fa945a7c3bd6aebd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 13:46:47 +0200 Subject: [PATCH 265/557] change view --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 935b48bd..5556203f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -20,7 +20,6 @@ workflow TUMOR_NORMAL_HAPPHASE { normal: meta.type == "normal" tumor: meta.type == "tumor" } - .view() .set{mixed_bams} // Get normal bams and add platform/model info for Clair3 usage From 1dde874a5e74f12588958cbac17ede5b86127e33 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 18 Aug 2025 13:55:08 +0200 Subject: [PATCH 266/557] change view --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index c8aba2fb..07a06dea 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -318,7 +318,6 @@ workflow LR_SOMATIC { paired: meta.paired_data tumor_only: !meta.paired_data } - .view() .set { branched_minimap } From 08b5d258624752605255c067fa6ab454a9c5ce4e Mon Sep 17 00:00:00 2001 From: Tim Yu Date: Mon, 18 Aug 2025 15:27:06 +0100 Subject: [PATCH 267/557] Fix the Missing output file segments_raw.txt The segments_raw was not optional and it was not outputted --- modules/nf-core/ascat/main.nf | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 0fb5d542..1a097698 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -27,7 +27,7 @@ process ASCAT { tuple val(meta), path("*pdf"), emit: pdf, optional: true tuple val(meta), path("*purityploidy.txt"), emit: purityploidy tuple val(meta), path("*segments.txt"), emit: segments - tuple val(meta), path("*segments_raw.txt"), emit: segments_raw + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true path "versions.yml", emit: versions when: @@ -167,6 +167,17 @@ process ASCAT { #Write out segmented regions (including regions with one copy of each allele) write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out raw segmented regions (including regions with one copy of each allele) + tryCatch({ # In case segments_raw is not selected + write.table( + ascat.output[["segments_raw"]], + file = paste0(prefix, ".segments_raw.txt"), + sep = "\t", quote = FALSE, row.names = FALSE + ) + }, error = function(e) { + message("Error in writing segments_raw: ", conditionMessage(e)) + }) #Write out CNVs in bed format cnvs=ascat.output[["segments"]][2:6] From 804a84f4509af53fe04ba175c93374e86204a083 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 19 Aug 2025 10:26:33 +0200 Subject: [PATCH 268/557] fix channel resetting --- workflows/lr_somatic.nf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 07a06dea..1117483b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -266,13 +266,9 @@ workflow LR_SOMATIC { else { fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) - .view() .set{ch_cat_ubams} } - fiber_branch.nonFiber - .mix(FIBERTOOLSRS_FIRE.out.bam) - .set{ch_cat_ubams} if(!params.skip_qc) { // From 5183c476b26970e6d064de2b7166244913d4e783 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 19 Aug 2025 11:46:00 +0200 Subject: [PATCH 269/557] add schema --- nextflow_schema.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 346f08f0..fc627243 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -330,6 +330,13 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "normal_fiber": { + "type": "boolean", + "default": false, + "description": "do fiber-seq on normal samples", + "fa_icon": "fas fa-fiber", + "hidden": true } } } From ce221d9517c92ea25231927297c0cde47a1f9d79 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 19 Aug 2025 13:14:07 +0200 Subject: [PATCH 270/557] change join to mix --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1117483b..75e52355 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -257,7 +257,7 @@ workflow LR_SOMATIC { if(!params.normal_fiber){ fiber_branch.nonFiber - .join(normal_bams) + .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) .view() .set{ch_cat_ubams} From b72a8db03eec2e233de2f543eb7f57dcad408d3d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 19 Aug 2025 14:29:47 +0200 Subject: [PATCH 271/557] removed unneeded ext.args --- conf/modules.config | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0b3be63e..3be3f450 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -278,9 +278,7 @@ process { params.wakhan_chroms ? '--contigs ${params.wakhan_chroms}' : (meta.sex == 'female' ? '--contigs chr1-22,chrX' : '--contigs chr1-22,chrX,chrY'), "--pdf-enable", - ].join(' ').trim() - } - ext.args = '--pdf-enable ' + ].join(' ').trim() } publishDir = [ path: { "${params.outdir}/${meta.id}/wakhan" }, mode: params.publish_dir_mode, From d07894e187ae5140144e576ba0888570393b9879 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 19 Aug 2025 14:40:02 +0200 Subject: [PATCH 272/557] Template update for nf-core/tools version 3.3.2 --- .editorconfig | 37 ----- .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 +++++++++ .github/actions/nf-test/action.yml | 109 ++++++++++++++ .github/workflows/ci.yml | 85 ----------- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 48 +++--- .../{fix-linting.yml => fix_linting.yml} | 4 +- .github/workflows/linting.yml | 17 +-- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 140 ++++++++++++++++++ ...mment.yml => template-version-comment.yml} | 2 +- .nf-core.yml | 39 +++-- .pre-commit-config.yaml | 26 +++- .prettierrc.yml | 5 + README.md | 13 +- assets/schema_input.json | 4 +- conf/base.config | 6 +- conf/test.config | 4 +- docs/output.md | 4 +- modules.json | 2 +- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++++------ .../nf-core/multiqc/tests/main.nf.test.snap | 24 +-- nextflow.config | 36 +++-- nf-test.config | 24 +++ ro-crate-metadata.json | 18 +-- .../utils_nfcore_lr_somatic_pipeline/main.nf | 1 - .../tests/nextflow.config | 2 +- tests/.nftignore | 9 ++ tests/default.nf.test | 35 +++++ tests/nextflow.config | 14 ++ 33 files changed, 614 insertions(+), 289 deletions(-) delete mode 100644 .editorconfig create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix-linting.yml => fix_linting.yml} (96%) create mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template_version_comment.yml => template-version-comment.yml} (95%) create mode 100644 nf-test.config create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 720724b7..40462906 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -71,7 +71,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..bf44d961 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,109 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 1ad5fc3a..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'IntGenomicsLab/lr_somatic') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..ac030fd5 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 13b51e2c..999bcc38 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -34,6 +26,17 @@ jobs: REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} + steps: + - name: Get the repository name and current branch + id: get_repo_properties + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + + download: + runs-on: ubuntu-latest + needs: configure steps: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -41,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: Setup Apptainer @@ -56,21 +59,10 @@ jobs: python -m pip install --upgrade pip pip install git+https://github.com/nf-core/tools.git@dev - - name: Get the repository name and current branch set as environment variable - id: get_repo_properties - run: | - echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" - echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" - echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" - - name: Make a cache directory for the container images run: | mkdir -p ./singularity_container_images - download: - runs-on: ubuntu-latest - needs: configure - steps: - name: Download the pipeline env: NXF_SINGULARITY_CACHEDIR: ./singularity_container_images @@ -87,6 +79,9 @@ jobs: - name: Inspect download run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} + - name: Inspect container images + run: tree ./singularity_container_images | tee ./container_initial + - name: Count the downloaded number of container images id: count_initial run: | @@ -117,14 +112,23 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} difference=$((final_count - initial_count)) echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" - tree ./singularity_container_images + tree ./singularity_container_images > ./container_afterwards + diff ./container_initial ./container_afterwards exit 1 else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 96% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index 0075e577..3d5d07a4 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..8b0f88c3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -16,10 +13,10 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - name: Set up Python 3.13 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit @@ -36,13 +33,13 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bed96d3..d43797d9 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@80620a5d27ce0ae443b965134db88467fc607b43 # v7 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..593c9360 --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,140 @@ +name: Run nf-test +on: + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.2" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use GitHub runners + - "ubuntu-latest" + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use GitHub runners + - "ubuntu-latest" + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "24.10.5" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use GitHub runners + - "ubuntu-latest" + steps: + - name: One or more tests failed (excluding latest-everything) + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 95% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..beb5c77f 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -14,7 +14,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.nf-core.yml b/.nf-core.yml index 80948bbf..2670a3be 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,8 +1,12 @@ -repository_type: pipeline - -nf_core_version: 3.1.1 - lint: + files_exist: + - CODE_OF_CONDUCT.md + - assets/nf-core-lr_somatic_logo_light.png + - docs/images/nf-core-lr_somatic_logo_light.png + - docs/images/nf-core-lr_somatic_logo_dark.png + - .github/ISSUE_TEMPLATE/config.yml + - .github/workflows/awstest.yml + - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md - assets/nf-core-lr_somatic_logo_light.png @@ -13,6 +17,8 @@ lint: - .github/PULL_REQUEST_TEMPLATE.md - assets/email_template.txt - docs/README.md + multiqc_config: + - report_comment nextflow_config: - manifest.name - manifest.homePage @@ -20,25 +26,16 @@ lint: - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText - multiqc_config: - - report_comment - files_exist: - - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png - - .github/ISSUE_TEMPLATE/config.yml - - .github/workflows/awstest.yml - - .github/workflows/awsfulltest.yml - +nf_core_version: 3.3.2 +repository_type: pipeline template: - org: IntGenomicsLab - name: lr_somatic - description: Workflow for somatic variant calling of long read data author: Jonas Demeulemeester - version: 1.0.0dev - force: true + description: Workflow for somatic variant calling of long read data + force: false + is_nfcore: false + name: lr_somatic + org: IntGenomicsLab outdir: . skip_features: - fastqc - is_nfcore: false + version: 1.0.0dev diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e9f0e1c..bb41beec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.0.3" + - prettier@3.6.2 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/README.md b/README.md index 3b4672ea..cfe53061 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # IntGenomicsLab/lr_somatic -[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -21,13 +22,13 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> 2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage > [!NOTE] -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. +> 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. - + + + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/schema_input.json b/assets/schema_input.json index fda49a3f..f35055e5 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -17,14 +17,14 @@ "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" } }, diff --git a/conf/base.config b/conf/base.config index 8bc8e250..faf3ca1c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -59,4 +59,8 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } + } } diff --git a/conf/test.config b/conf/test.config index ec9b4d95..16c15c34 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,8 +25,6 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - - // Genome references + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv'// Genome references genome = 'R64-1-1' } diff --git a/docs/output.md b/docs/output.md index fc35fed4..ed388b30 100644 --- a/docs/output.md +++ b/docs/output.md @@ -29,7 +29,9 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +### Pipeline information
Output files diff --git a/modules.json b/modules.json index 99f2f4e0..3d579e49 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "multiqc": { "branch": "master", - "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 6f5b867b..812fc4c5 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.25.1 + - bioconda::multiqc=1.29 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index cc0643e1..0ac3c369 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : - 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : + 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 2fcbb5ff..88e90571 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.2" }, - "timestamp": "2024-10-02T17:51:46.317523" + "timestamp": "2025-05-22T11:50:41.182332996" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.2" }, - "timestamp": "2024-10-02T17:52:20.680978" + "timestamp": "2025-05-22T11:51:22.448739369" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.2" }, - "timestamp": "2024-10-02T17:52:09.185842" + "timestamp": "2025-05-22T11:51:06.198928424" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index bcf75c6f..e72ca43d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -160,16 +160,25 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load IntGenomicsLab/lr_somatic custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + // Load IntGenomicsLab/lr_somatic custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/lr_somatic.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lr_somatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -195,14 +204,14 @@ env { } // Set bash options -process.shell = """\ -bash - -set -e # Exit if a tool returns a non-zero status/exit code -set -u # Treat unset variables and parameters as an error -set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute -set -C # No clobber - prevent output redirection from overwriting files. -""" +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o", // Returns the status of the last command to exit.. + "pipefail" // ..with a non-zero status or zero if all successfully execute +] // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false @@ -226,7 +235,6 @@ dag { manifest { name = 'IntGenomicsLab/lr_somatic' - author = """Jonas Demeulemeester""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -242,14 +250,14 @@ manifest { description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'main' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=24.10.5' version = '1.0.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.1.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..3a1fff59 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' + + // run all test with defined profile(s) from the main nextflow.config + profile "test" + + // list of filenames or patterns that should be trigger a full test run + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 792a7686..6520c297 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-02-04T09:18:13+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-08-19T12:39:59+00:00", + "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4" + "@id": "#ef3a7c8f-cc15-4757-90ce-2dfc1f672de5" } ], "name": "IntGenomicsLab/lr_somatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-02-04T10:18:13Z", + "dateModified": "2025-08-19T14:39:59Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -144,7 +144,7 @@ "https://nf-co.re/IntGenomicsLab/lr_somatic/dev/" ], "version": [ - "0.0.1dev" + "1.0.0dev" ] }, { @@ -160,11 +160,11 @@ "version": "!>=24.04.2" }, { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4", + "@id": "#ef3a7c8f-cc15-4757-90ce-2dfc1f672de5", "@type": "TestSuite", "instance": [ { - "@id": "#50633232-76d9-47a1-a630-a13639384949" + "@id": "#23e1bab1-a9c5-4fed-9ddb-4aff67e35763" } ], "mainEntity": { @@ -173,10 +173,10 @@ "name": "Test suite for IntGenomicsLab/lr_somatic" }, { - "@id": "#50633232-76d9-47a1-a630-a13639384949", + "@id": "#23e1bab1-a9c5-4fed-9ddb-4aff67e35763", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lr_somatic", - "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml", + "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf index d366b8f6..a3dc87c5 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf @@ -259,4 +259,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..09ef842a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..16409f40 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,9 @@ +.DS_Store +multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..047ddd98 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/lr_somatic_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..1316177c --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,14 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/lr_somatic' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From 3261a07a1a4f84987e47366c341330731709c127 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 19 Aug 2025 14:50:34 +0200 Subject: [PATCH 273/557] Template update for nf-core/tools version 3.3.2 --- ro-crate-metadata.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 6520c297..6853f2b9 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-08-19T12:39:59+00:00", + "datePublished": "2025-08-19T12:50:31+00:00", "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#ef3a7c8f-cc15-4757-90ce-2dfc1f672de5" + "@id": "#a139db82-4b01-4551-b52e-f123de74eaff" } ], "name": "IntGenomicsLab/lr_somatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-08-19T14:39:59Z", + "dateModified": "2025-08-19T14:50:31Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +160,11 @@ "version": "!>=24.04.2" }, { - "@id": "#ef3a7c8f-cc15-4757-90ce-2dfc1f672de5", + "@id": "#a139db82-4b01-4551-b52e-f123de74eaff", "@type": "TestSuite", "instance": [ { - "@id": "#23e1bab1-a9c5-4fed-9ddb-4aff67e35763" + "@id": "#b060d05a-473b-4855-a269-4c85c86160bf" } ], "mainEntity": { @@ -173,7 +173,7 @@ "name": "Test suite for IntGenomicsLab/lr_somatic" }, { - "@id": "#23e1bab1-a9c5-4fed-9ddb-4aff67e35763", + "@id": "#b060d05a-473b-4855-a269-4c85c86160bf", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lr_somatic", "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml", From 5efbed0a52379bf3b22441dcc41465f414d05ca5 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 19 Aug 2025 16:12:43 +0200 Subject: [PATCH 274/557] linting --- modules.json | 86 ++++++++++++-------------------------------- nextflow_schema.json | 2 +- 2 files changed, 23 insertions(+), 65 deletions(-) diff --git a/modules.json b/modules.json index 01dca2d8..b3cd7801 100644 --- a/modules.json +++ b/modules.json @@ -8,123 +8,89 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "c70357ea249a541df53dd5b479b3c32b0c26c4d2", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -133,33 +99,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "763d4b5c05ffda3ac1ac969dc67f7458cfb2eb1d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 346f08f0..eb7634e7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -130,7 +130,7 @@ }, "ascat_longread_bins": { "type": "integer", - "default": 1000, + "default": 2000, "description": "Binsize for long-read" }, "ascat_allelecounter_flags": { From 6c097c50a55e690fd97dbf21e6bd6840a8f0ecdf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 19 Aug 2025 16:15:50 +0200 Subject: [PATCH 275/557] fix json linting --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 6853f2b9..26b1dbfc 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-08-19T12:50:31+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n \nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. \n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n**1) Pre-processing:**\n\n a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\n b.\tAlignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\n c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\n d. 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 \n a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\n b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\n a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\n b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\n a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\n b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\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/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pan\u010d\u00edkov\u00e1, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\nresults\n|\n\u251c\u2500\u2500 multiqc\n\u2502\n\u251c\u2500\u2500 sample1\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumour\n\u2502 \u2502 \u2514\u2500\u2500 normal\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u2502 \u2514\u2500\u2500 clairs\n\u2502 \u2514\u2500\u2500 ascat\n\u2502\n\u2514\u2500\u2500 sample2\n \u251c\u2500\u2500 bamfiles\n \u251c\u2500\u2500 qc\n \u2502 \u251c\u2500\u2500 tumour\n \u2502 \u2514\u2500\u2500 normal\n \u251c\u2500\u2500 variants\n \u2502 \u251c\u2500\u2500 severus\n \u2502 \u2514\u2500\u2500 clairs\n \u2514\u2500\u2500 ascat\n```\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From 10effa0e50e2841492f76b1e9a5cbfda7db066c1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 15:44:11 +0200 Subject: [PATCH 276/557] restructured modules.config minimap2 --- conf/modules.config | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 26f29cea..49880ac8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -134,10 +134,14 @@ process { withName: '.*:MINIMAP2_ALIGN' { ext.prefix = { "${meta.id}_mapped" } ext.args = { + def alignmentModel = meta.platform == 'pb' + ? (params.minimap2_pb_model ? "-ax ${params.minimap2_pb_model}" : "-ax map-hifi") + : (params.minimap2_ont_model ? "-ax ${params.minimap2_ont_model}" : "-ax lr:hq") + + def secondaryFlag = (params.save_secondary_alignment == true) ? "--secondary=yes" : "--secondary=no" [ - meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : - ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), - params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no ", + alignmentModel, + secondaryFlag, "-y", "-Y" ].join(' ').trim() From 526c33a44bfdb642bd9de0e915d083434d69ef42 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:20:49 +0200 Subject: [PATCH 277/557] bulk modules updates --- conf/modules.config | 1 + modules.json | 120 ++++-- modules/nf-core/longphase/haplotag/main.nf | 2 +- modules/nf-core/longphase/haplotag/meta.yml | 29 +- .../nf-core/longphase/haplotag/tests/tags.yml | 2 - modules/nf-core/longphase/phase/main.nf | 11 +- modules/nf-core/longphase/phase/meta.yml | 25 +- .../nf-core/longphase/phase/tests/tags.yml | 2 - .../nf-core/minimap2/align/environment.yml | 5 +- modules/nf-core/minimap2/align/main.nf | 4 +- modules/nf-core/minimap2/align/meta.yml | 57 +-- .../minimap2/align/minimap2-align.diff | 18 + .../minimap2/align/tests/main.nf.test.snap | 122 +++--- modules/nf-core/minimap2/align/tests/tags.yml | 2 - .../nf-core/minimap2/index/environment.yml | 2 +- modules/nf-core/minimap2/index/main.nf | 4 +- modules/nf-core/minimap2/index/meta.yml | 18 +- .../minimap2/index/tests/main.nf.test.snap | 43 +-- modules/nf-core/minimap2/index/tests/tags.yml | 2 - modules/nf-core/modkit/pileup/environment.yml | 2 +- modules/nf-core/modkit/pileup/main.nf | 6 +- modules/nf-core/modkit/pileup/meta.yml | 36 +- .../nf-core/modkit/pileup/tests/main.nf.test | 54 +-- .../modkit/pileup/tests/main.nf.test.snap | 358 +++++++++--------- modules/nf-core/modkit/pileup/tests/tags.yml | 2 - modules/nf-core/mosdepth/meta.yml | 76 ++-- modules/nf-core/mosdepth/tests/tags.yml | 2 - modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 20 +- modules/nf-core/multiqc/tests/tags.yml | 2 - modules/nf-core/pigz/uncompress/main.nf | 7 +- modules/nf-core/pigz/uncompress/meta.yml | 19 +- .../pigz/uncompress/tests/main.nf.test | 25 ++ .../pigz/uncompress/tests/main.nf.test.snap | 43 ++- .../nf-core/pigz/uncompress/tests/tags.yml | 2 - modules/nf-core/samtools/cat/meta.yml | 23 +- modules/nf-core/samtools/cat/tests/tags.yml | 2 - modules/nf-core/samtools/faidx/main.nf | 13 +- modules/nf-core/samtools/faidx/meta.yml | 50 ++- .../nf-core/samtools/faidx/tests/main.nf.test | 107 +++++- .../samtools/faidx/tests/main.nf.test.snap | 336 +++++++++++++++- modules/nf-core/samtools/faidx/tests/tags.yml | 2 - modules/nf-core/samtools/flagstat/meta.yml | 19 +- .../nf-core/samtools/flagstat/tests/tags.yml | 2 - modules/nf-core/samtools/idxstats/main.nf | 1 + modules/nf-core/samtools/idxstats/meta.yml | 19 +- .../nf-core/samtools/idxstats/tests/tags.yml | 2 - modules/nf-core/samtools/index/main.nf | 2 +- modules/nf-core/samtools/index/meta.yml | 28 +- modules/nf-core/samtools/index/tests/tags.yml | 2 - modules/nf-core/samtools/stats/meta.yml | 20 +- .../samtools/stats/samtools-stats.diff | 1 - modules/nf-core/samtools/stats/tests/tags.yml | 2 - modules/nf-core/severus/severus.diff | 61 +++ modules/nf-core/unzip/meta.yml | 18 +- modules/nf-core/unzip/tests/tags.yml | 2 - .../nf-core/bam_stats_samtools/tests/tags.yml | 2 - 58 files changed, 1245 insertions(+), 598 deletions(-) delete mode 100644 modules/nf-core/longphase/haplotag/tests/tags.yml delete mode 100644 modules/nf-core/longphase/phase/tests/tags.yml create mode 100644 modules/nf-core/minimap2/align/minimap2-align.diff delete mode 100644 modules/nf-core/minimap2/align/tests/tags.yml delete mode 100644 modules/nf-core/minimap2/index/tests/tags.yml delete mode 100644 modules/nf-core/modkit/pileup/tests/tags.yml delete mode 100644 modules/nf-core/mosdepth/tests/tags.yml delete mode 100644 modules/nf-core/multiqc/tests/tags.yml delete mode 100644 modules/nf-core/pigz/uncompress/tests/tags.yml delete mode 100644 modules/nf-core/samtools/cat/tests/tags.yml delete mode 100644 modules/nf-core/samtools/faidx/tests/tags.yml delete mode 100644 modules/nf-core/samtools/flagstat/tests/tags.yml delete mode 100644 modules/nf-core/samtools/idxstats/tests/tags.yml delete mode 100644 modules/nf-core/samtools/index/tests/tags.yml delete mode 100644 modules/nf-core/samtools/stats/tests/tags.yml create mode 100644 modules/nf-core/severus/severus.diff delete mode 100644 modules/nf-core/unzip/tests/tags.yml delete mode 100644 subworkflows/nf-core/bam_stats_samtools/tests/tags.yml diff --git a/conf/modules.config b/conf/modules.config index 49880ac8..11cd12d4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -206,6 +206,7 @@ process { } withName: '.*:LONGPHASE_HAPLOTAG' { + ext.prefix = { "${meta.id}_${meta_type}" } publishDir = [ path: { "${params.outdir}/${meta.id}/bamfiles" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index b3cd7801..3372f736 100644 --- a/modules.json +++ b/modules.json @@ -8,89 +8,125 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "longphase/haplotag": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", - "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", - "installed_by": ["modules"] + "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", - "git_sha": "c70357ea249a541df53dd5b479b3c32b0c26c4d2", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", - "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", - "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", - "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", - "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", - "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", - "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": ["bam_stats_samtools"], + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/severus/severus.diff" }, "unzip": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": [ + "modules" + ] } } }, @@ -98,26 +134,34 @@ "nf-core": { "bam_stats_samtools": { "branch": "master", - "git_sha": "763d4b5c05ffda3ac1ac969dc67f7458cfb2eb1d", - "installed_by": ["subworkflows"] + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 73320550..86ba0592 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -23,7 +23,7 @@ process LONGPHASE_HAPLOTAG { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}" + def prefix = task.ext.prefix ?: "${meta.id}" def sv_file = svs ? "--sv-file ${svs}" : "" def mod_file = mods ? "--mod-file ${mods}" : "" diff --git a/modules/nf-core/longphase/haplotag/meta.yml b/modules/nf-core/longphase/haplotag/meta.yml index d2f2ec8d..63368b31 100644 --- a/modules/nf-core/longphase/haplotag/meta.yml +++ b/modules/nf-core/longphase/haplotag/meta.yml @@ -28,22 +28,27 @@ input: type: file description: Sorted BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - bai: type: file description: Index of sorted BAM/CRAM file pattern: "*.{bai,crai,csi}" + ontologies: [] - snps: type: file description: VCF file with SNPs (and INDELs) pattern: "*.{vcf,vcf.gz}" + ontologies: [] - svs: type: file description: VCF file with SVs pattern: "*.{vcf,vcf.gz}" + ontologies: [] - mods: type: file description: modcall-generated VCF with modifications pattern: "*.{vcf,vcf.gz}" + ontologies: [] - - meta2: type: map description: | @@ -53,6 +58,7 @@ input: type: file description: Reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -62,9 +68,10 @@ input: type: file description: Reference fai index pattern: "*.fai" + ontologies: [] output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -73,8 +80,9 @@ output: type: file description: BAM file with haplotagged reads pattern: "*.bam" - - log: - - meta: + ontologies: [] + log: + - - meta: type: map description: | Groovy Map containing sample information @@ -83,11 +91,14 @@ output: type: file description: Log file pattern: "*.log" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@fellen31" maintainers: diff --git a/modules/nf-core/longphase/haplotag/tests/tags.yml b/modules/nf-core/longphase/haplotag/tests/tags.yml deleted file mode 100644 index 117e16a5..00000000 --- a/modules/nf-core/longphase/haplotag/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -longphase/haplotag: - - "modules/nf-core/longphase/haplotag/**" diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 8fa49a30..7c604ab8 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -23,15 +23,10 @@ process LONGPHASE_PHASE { script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}_germline" + def prefix = task.ext.prefix ?: "${meta.id}" def sv_file = svs ? "--sv-file ${svs}" : "" def mod_file = mods ? "--mod-file ${mods}" : "" - - def bamList = [] - for (file in bam) { - bamList.add("-b") - bamList.add(file) - } + def bams = bam.collectMany { file -> ["-b", file] }.join(" ") """ longphase \\ phase \\ @@ -40,7 +35,7 @@ process LONGPHASE_PHASE { -o ${prefix} \\ --reference ${fasta} \\ --snp-file ${snps} \\ - ${bamList.join(" ")} \\ + ${bams} \\ ${sv_file} \\ ${mod_file} \\ diff --git a/modules/nf-core/longphase/phase/meta.yml b/modules/nf-core/longphase/phase/meta.yml index 823645d4..93963d58 100644 --- a/modules/nf-core/longphase/phase/meta.yml +++ b/modules/nf-core/longphase/phase/meta.yml @@ -28,22 +28,27 @@ input: type: file description: Sorted BAM/CRAM file(s) pattern: "*.{bam,cram}" + ontologies: [] - bai: type: file description: Index of sorted BAM/CRAM file(s) pattern: "*.{bai,crai,csi}" + ontologies: [] - snps: type: file description: VCF file with SNPs (and INDELs) pattern: "*.{vcf,vcf.gz}" + ontologies: [] - svs: type: file description: VCF file with SVs pattern: "*.{vcf,vcf.gz}" + ontologies: [] - mods: type: file description: modcall-generated VCF with modifications pattern: "*.{vcf,vcf.gz}" + ontologies: [] - - meta2: type: map description: | @@ -53,6 +58,7 @@ input: type: file description: Reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -62,9 +68,10 @@ input: type: file description: Reference fai index pattern: "*.fai" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -73,11 +80,15 @@ output: type: file description: Compressed VCF file with phased variants pattern: "*.vcf.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@fellen31" maintainers: diff --git a/modules/nf-core/longphase/phase/tests/tags.yml b/modules/nf-core/longphase/phase/tests/tags.yml deleted file mode 100644 index 260a0d08..00000000 --- a/modules/nf-core/longphase/phase/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -longphase/phase: - - "modules/nf-core/longphase/phase/**" diff --git a/modules/nf-core/minimap2/align/environment.yml b/modules/nf-core/minimap2/align/environment.yml index 60677e65..17886061 100644 --- a/modules/nf-core/minimap2/align/environment.yml +++ b/modules/nf-core/minimap2/align/environment.yml @@ -5,6 +5,5 @@ channels: - bioconda dependencies: - - bioconda::htslib=1.20 - - bioconda::minimap2=2.28 - - bioconda::samtools=1.20 + - bioconda::minimap2=2.29 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf index 96504e82..453d4566 100644 --- a/modules/nf-core/minimap2/align/main.nf +++ b/modules/nf-core/minimap2/align/main.nf @@ -5,8 +5,8 @@ process MINIMAP2_ALIGN { // Note: the versions here need to match the versions used in the mulled container below and minimap2/index conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:3161f532a5ea6f1dec9be5667c9efc2afdac6104-0' : - 'biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:3161f532a5ea6f1dec9be5667c9efc2afdac6104-0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/66/66dc96eff11ab80dfd5c044e9b3425f52d818847b9c074794cf0c02bfa781661/data' : + 'community.wave.seqera.io/library/minimap2_samtools:33bb43c18d22e29c' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml index a4cfc891..b501526e 100644 --- a/modules/nf-core/minimap2/align/meta.yml +++ b/modules/nf-core/minimap2/align/meta.yml @@ -26,6 +26,7 @@ input: description: | List of input FASTA or FASTQ files of size 1 and 2 for single-end and paired-end data, respectively. + ontologies: [] - - meta2: type: map description: | @@ -35,23 +36,24 @@ input: type: file description: | Reference database in FASTA format. - - - bam_format: - type: boolean - description: Specify that output should be in BAM format - - - bam_index_extension: - type: string - description: BAM alignment index extension (e.g. "bai") - - - cigar_paf_format: - type: boolean - description: Specify that output CIGAR should be in PAF format - - - cigar_bam: - type: boolean - description: | - Write CIGAR with >65535 ops at the CG tag. This is recommended when - doing XYZ (https://github.com/lh3/minimap2#working-with-65535-cigar-operations) + ontologies: [] + - bam_format: + type: boolean + description: Specify that output should be in BAM format + - bam_index_extension: + type: string + description: BAM alignment index extension (e.g. "bai") + - cigar_paf_format: + type: boolean + description: Specify that output CIGAR should be in PAF format + - cigar_bam: + type: boolean + description: | + Write CIGAR with >65535 ops at the CG tag. This is recommended when + doing XYZ (https://github.com/lh3/minimap2#working-with-65535-cigar-operations) output: - - paf: - - meta: + paf: + - - meta: type: map description: | Groovy Map containing sample information @@ -60,8 +62,9 @@ output: type: file description: Alignment in PAF format pattern: "*.paf" - - bam: - - meta: + ontologies: [] + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -70,8 +73,9 @@ output: type: file description: Alignment in BAM format pattern: "*.bam" - - index: - - meta: + ontologies: [] + index: + - - meta: type: map description: | Groovy Map containing sample information @@ -80,11 +84,14 @@ output: type: file description: BAM alignment index pattern: "*.bam.*" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@heuermh" - "@sofstam" diff --git a/modules/nf-core/minimap2/align/minimap2-align.diff b/modules/nf-core/minimap2/align/minimap2-align.diff new file mode 100644 index 00000000..967bb654 --- /dev/null +++ b/modules/nf-core/minimap2/align/minimap2-align.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/minimap2/align' +'modules/nf-core/minimap2/align/meta.yml' is unchanged +Changes in 'minimap2/align/main.nf': +--- modules/nf-core/minimap2/align/main.nf ++++ modules/nf-core/minimap2/align/main.nf +@@ -1,6 +1,6 @@ + process MINIMAP2_ALIGN { + tag "$meta.id" +- label 'process_high' ++ label 'process_very_high' + + // Note: the versions here need to match the versions used in the mulled container below and minimap2/index + conda "${moduleDir}/environment.yml" + +'modules/nf-core/minimap2/align/environment.yml' is unchanged +'modules/nf-core/minimap2/align/tests/main.nf.test' is unchanged +'modules/nf-core/minimap2/align/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test.snap b/modules/nf-core/minimap2/align/tests/main.nf.test.snap index 12264a85..89f20336 100644 --- a/modules/nf-core/minimap2/align/tests/main.nf.test.snap +++ b/modules/nf-core/minimap2/align/tests/main.nf.test.snap @@ -4,20 +4,20 @@ [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:MT192765.1\tLN:29829", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta -", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" ], "5d426b9a5f5b2c54f1d7f1e4c238ae94", "test.bam.bai", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-25T09:03:00.827260362" + "timestamp": "2025-04-22T14:48:23.829797899" }, "sarscov2 - bam, fasta, true, 'bai', false, false - stub": { "content": [ @@ -44,7 +44,7 @@ ] ], "3": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ], "bam": [ [ @@ -68,15 +68,15 @@ ], "versions": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:21:37.92353539" + "timestamp": "2025-04-22T14:48:54.665655242" }, "sarscov2 - fastq, fasta, true, 'bai', false, false - stub": { "content": [ @@ -103,7 +103,7 @@ ] ], "3": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ], "bam": [ [ @@ -127,15 +127,15 @@ ], "versions": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-03T11:29:44.669021368" + "timestamp": "2025-04-22T14:48:38.492212433" }, "sarscov2 - fastq, fasta, false, [], false, false - stub": { "content": [ @@ -156,7 +156,7 @@ ], "3": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ], "bam": [ @@ -174,15 +174,15 @@ ] ], "versions": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-03T11:15:52.738781039" + "timestamp": "2025-04-22T14:48:43.879647142" }, "sarscov2 - fastq, fasta, true, [], false, false - stub": { "content": [ @@ -203,7 +203,7 @@ ], "3": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ], "bam": [ [ @@ -221,92 +221,92 @@ ], "versions": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-03T11:15:23.033808223" + "timestamp": "2025-04-22T14:48:33.262333471" }, "sarscov2 - [fastq1, fastq2], fasta, true, false, false": { "content": [ [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:MT192765.1\tLN:29829", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz test_2.fastq.gz", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz test_2.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "1bc392244f228bf52cf0b5a8f6a654c9", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:18:18.964586894" + "timestamp": "2025-04-22T14:48:07.571731983" }, "sarscov2 - fastq, fasta, true, [], false, false": { "content": [ [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:MT192765.1\tLN:29829", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "f194745c0ccfcb2a9c0aee094a08750", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:17:48.667488325" + "timestamp": "2025-04-22T14:47:56.497792473" }, "sarscov2 - fastq, fasta, true, 'bai', false, false": { "content": [ [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:MT192765.1\tLN:29829", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam##idx##test.bam.bai --write-index" ], "f194745c0ccfcb2a9c0aee094a08750", "test.bam.bai", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:18:02.517416733" + "timestamp": "2025-04-22T14:48:01.888544427" }, "sarscov2 - bam, fasta, true, [], false, false": { "content": [ [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:MT192765.1\tLN:29829", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a genome.fasta -", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a genome.fasta -", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "5d426b9a5f5b2c54f1d7f1e4c238ae94", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-25T09:02:49.64829488" + "timestamp": "2025-04-22T14:48:18.376062313" }, "sarscov2 - bam, fasta, true, [], false, false - stub": { "content": [ @@ -327,7 +327,7 @@ ], "3": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ], "bam": [ [ @@ -345,15 +345,15 @@ ], "versions": [ - "versions.yml:md5,98b8f5f36aa54b82210094f0b0d11938" + "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:21:22.162291795" + "timestamp": "2025-04-22T14:48:49.268693724" }, "sarscov2 - fastq, [], true, false, false": { "content": [ @@ -459,18 +459,18 @@ "@SQ\tSN:ERR5069949.3258358\tLN:151", "@SQ\tSN:ERR5069949.1476386\tLN:151", "@SQ\tSN:ERR5069949.2415814\tLN:150", - "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -t 2 -a test_1.fastq.gz test_1.fastq.gz", - "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.20\tCL:samtools sort -@ 1 -o test.bam" + "@PG\tID:minimap2\tPN:minimap2\tVN:2.29-r1283\tCL:minimap2 -t 2 -a test_1.fastq.gz test_1.fastq.gz", + "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "16c1c651f8ec67383bcdee3c55aed94f", [ - "versions.yml:md5,3548eeba9066efbf8d78ea99f8d813fd" + "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-07-23T11:18:34.246998277" + "timestamp": "2025-04-22T14:48:12.942360555" } } \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/tests/tags.yml b/modules/nf-core/minimap2/align/tests/tags.yml deleted file mode 100644 index 39dba374..00000000 --- a/modules/nf-core/minimap2/align/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/align: - - "modules/nf-core/minimap2/align/**" diff --git a/modules/nf-core/minimap2/index/environment.yml b/modules/nf-core/minimap2/index/environment.yml index c2dd2cfd..2f3ba0eb 100644 --- a/modules/nf-core/minimap2/index/environment.yml +++ b/modules/nf-core/minimap2/index/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::minimap2=2.28 + - bioconda::minimap2=2.29 diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf index 38320214..56cb0efd 100644 --- a/modules/nf-core/minimap2/index/main.nf +++ b/modules/nf-core/minimap2/index/main.nf @@ -4,8 +4,8 @@ process MINIMAP2_INDEX { // Note: the versions here need to match the versions used in minimap2/align conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/minimap2:2.28--he4a0461_0' : - 'biocontainers/minimap2:2.28--he4a0461_0' }" + 'https://depot.galaxyproject.org/singularity/minimap2:2.29--h577a1d6_0' : + 'biocontainers/minimap2:2.29--h577a1d6_0' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml index 57c80e29..0d6a2d86 100644 --- a/modules/nf-core/minimap2/index/meta.yml +++ b/modules/nf-core/minimap2/index/meta.yml @@ -22,9 +22,10 @@ input: type: file description: | Reference database in FASTA format. + ontologies: [] output: - - index: - - meta: + index: + - - meta: type: map description: | Groovy Map containing sample information @@ -33,11 +34,14 @@ output: type: file description: Minimap2 fasta index. pattern: "*.mmi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@yuukiiwa" - "@drpatelh" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test.snap b/modules/nf-core/minimap2/index/tests/main.nf.test.snap index 0b098828..dbb32049 100644 --- a/modules/nf-core/minimap2/index/tests/main.nf.test.snap +++ b/modules/nf-core/minimap2/index/tests/main.nf.test.snap @@ -1,37 +1,4 @@ { - "Should run without failures": { - "content": [ - { - "0": [ - [ - { - "id": "test_ref" - }, - "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" - ] - ], - "1": [ - "versions.yml:md5,0fced0ee8015e7f50b82566e3db8f7b0" - ], - "index": [ - [ - { - "id": "test_ref" - }, - "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" - ] - ], - "versions": [ - "versions.yml:md5,0fced0ee8015e7f50b82566e3db8f7b0" - ] - } - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-03-18T11:46:30.000058092" - }, "minimap2 index": { "content": [ { @@ -44,7 +11,7 @@ ] ], "1": [ - "versions.yml:md5,2f8340380c6741e9261a284262a90bde" + "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" ], "index": [ [ @@ -55,14 +22,14 @@ ] ], "versions": [ - "versions.yml:md5,2f8340380c6741e9261a284262a90bde" + "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-04-05T10:58:29.828187662" + "timestamp": "2025-04-22T14:50:37.213379742" } } \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/tests/tags.yml b/modules/nf-core/minimap2/index/tests/tags.yml deleted file mode 100644 index e5ef8e19..00000000 --- a/modules/nf-core/minimap2/index/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/index: - - modules/nf-core/minimap2/index/** diff --git a/modules/nf-core/modkit/pileup/environment.yml b/modules/nf-core/modkit/pileup/environment.yml index 7a87bce9..7b7a0ca3 100644 --- a/modules/nf-core/modkit/pileup/environment.yml +++ b/modules/nf-core/modkit/pileup/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - ont-modkit=0.3.0 + - ont-modkit=0.4.4 diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf index 284f8d50..df6ff59d 100644 --- a/modules/nf-core/modkit/pileup/main.nf +++ b/modules/nf-core/modkit/pileup/main.nf @@ -4,12 +4,12 @@ process MODKIT_PILEUP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ont-modkit:0.4.3--hcdda2d0_0': - 'biocontainers/ont-modkit:0.4.3--hcdda2d0_0' }" + 'https://depot.galaxyproject.org/singularity/ont-modkit:0.4.4--hcdda2d0_0': + 'biocontainers/ont-modkit:0.4.4--hcdda2d0_0' }" input: tuple val(meta), path(bam), path(bai) - tuple val(meta2), path(fasta) + tuple val(meta2), path(fasta), path(fai) tuple val(meta3), path(bed) output: diff --git a/modules/nf-core/modkit/pileup/meta.yml b/modules/nf-core/modkit/pileup/meta.yml index 2f274d0c..32aba6ad 100644 --- a/modules/nf-core/modkit/pileup/meta.yml +++ b/modules/nf-core/modkit/pileup/meta.yml @@ -23,10 +23,12 @@ input: type: file description: Sorted BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - bai: type: file description: Associated index file for BAM pattern: "*.bai" + ontologies: [] - - meta2: type: map description: | @@ -37,6 +39,12 @@ input: description: Reference sequence in FASTA format. Required for motif (e.g. CpG) filtering pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Associated index file for FASTA + pattern: "*.fai" + ontologies: [] - - meta3: type: map description: | @@ -47,9 +55,10 @@ input: description: BED file that will restrict threshold estimation and pileup results to positions overlapping intervals in the file pattern: "*.bed" + ontologies: [] output: - - bed: - - meta: + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -58,8 +67,9 @@ output: type: file description: bedMethyl output file(s) pattern: "*.bed" - - bedgraph: - - meta: + ontologies: [] + bedgraph: + - - meta: type: map description: | Groovy Map containing sample information @@ -68,8 +78,9 @@ output: type: file description: bedgraph output files pattern: "*.bedgraph" - - log: - - meta: + ontologies: [] + log: + - - meta: type: map description: | Groovy Map containing sample information @@ -78,11 +89,14 @@ output: type: file description: File for debug logs to be written to pattern: "*.log" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@Michal-Babins" - "@fellen31" diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test b/modules/nf-core/modkit/pileup/tests/main.nf.test index 371cc3b9..6ce8dfe2 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test @@ -18,7 +18,7 @@ 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] = [[],[]] """ } @@ -33,7 +33,7 @@ nextflow_process { } - test("[bam, bai], fasta, []") { + test("[bam, bai], [fasta, fai], []") { when { process { @@ -45,7 +45,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = [[],[]] """ @@ -61,7 +62,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed") { + test("[bam, bai], [fasta, fai], bed") { when { process { @@ -73,7 +74,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -91,7 +93,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional") { + test("[bam, bai], [fasta, fai], bed - traditional") { config "./nextflow.traditional.config" @@ -105,7 +107,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -123,7 +126,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional, HP") { + test("[bam, bai], [fasta, fai], bed - traditional, HP") { config "./nextflow.traditional_hp.config" @@ -137,7 +140,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -155,7 +159,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional, HP, bedgraph") { + test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph") { config "./nextflow.traditional_hp_bedgraph.config" @@ -169,7 +173,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -199,7 +204,7 @@ 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] = [[],[]] """ } @@ -214,7 +219,7 @@ nextflow_process { } - test("[bam, bai], fasta, [] - stub") { + test("[bam, bai], [fasta, fai], [] - stub") { options "-stub" @@ -228,7 +233,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = [[],[]] """ @@ -244,7 +250,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - stub") { + test("[bam, bai], [fasta, fai], bed - stub") { options "-stub" @@ -258,7 +264,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -276,7 +283,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional - stub") { + test("[bam, bai], [fasta, fai], bed - traditional - stub") { config "./nextflow.traditional.config" options "-stub" @@ -291,7 +298,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -309,7 +317,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional, HP - stub") { + test("[bam, bai], [fasta, fai], bed - traditional, HP - stub") { config "./nextflow.traditional_hp.config" options "-stub" @@ -324,7 +332,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) @@ -342,7 +351,7 @@ nextflow_process { } - test("[bam, bai], fasta, bed - traditional, HP, bedgraph - stub") { + test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub") { config "./nextflow.traditional_hp_bedgraph.config" options "-stub" @@ -357,7 +366,8 @@ nextflow_process { ] 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', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] input[2] = Channel.of('chr22\t0\t1000') .collectFile(name: 'chr22.bed', newLine: true) 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 b960409d..af80c6ec 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -1,5 +1,5 @@ { - "[bam, bai], fasta, bed - traditional, HP": { + "[bam, bai], [fasta, fai], bed": { "content": [ { "0": [ @@ -7,10 +7,7 @@ { "id": "test" }, - [ - "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", - "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" - ] + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" ] ], "1": [ @@ -20,17 +17,14 @@ ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ { "id": "test" }, - [ - "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", - "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" - ] + "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" ] ], "bedgraph": [ @@ -40,17 +34,17 @@ ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:09:40.272533628" + "timestamp": "2025-04-15T15:01:47.27240322" }, - "[bam, bai], fasta, bed - traditional, HP, bedgraph - stub": { + "[bam, bai], [fasta, fai], [] - stub": { "content": [ { "0": [ @@ -78,7 +72,7 @@ ] ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ @@ -105,62 +99,68 @@ ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:11:33.234594142" + "timestamp": "2025-04-15T15:02:14.786526107" }, - "[bam, bai], fasta, []": { + "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph": { "content": [ { "0": [ + + ], + "1": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] ] - ], - "1": [ - ], "2": [ ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ + + ], + "bedgraph": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + [ + "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", + "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + ] ] - ], - "bedgraph": [ - ], "log": [ ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:09:03.537667806" + "timestamp": "2025-04-15T15:02:04.393035124" }, - "[bam, bai], fasta, bed - traditional - stub": { + "[bam, bai], [fasta, fai], bed - traditional, HP": { "content": [ { "0": [ @@ -168,64 +168,95 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "2": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + [ + "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", + "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" + ] ] ], "bedgraph": [ + + ], + "log": [ + + ], + "versions": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-04-15T15:01:58.76489375" + }, + "[bam, bai], [fasta, fai], []": { + "content": [ + { + "0": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed:md5,f973de342df883efc1656c82a3a3978d" ] ], - "log": [ + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,8527c1177696459470aef23905cfb6af" + ], + "bed": [ [ { "id": "test" }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed:md5,f973de342df883efc1656c82a3a3978d" ] + ], + "bedgraph": [ + + ], + "log": [ + ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:10:45.47904997" + "timestamp": "2025-04-15T15:01:41.559902964" }, - "[bam, bai], fasta, bed - traditional, HP - stub": { + "[bam, bai], [fasta, fai], bed - traditional, HP - stub": { "content": [ { "0": [ @@ -253,7 +284,7 @@ ] ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ @@ -280,17 +311,17 @@ ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:11:06.023194848" + "timestamp": "2025-04-15T15:02:31.123304033" }, - "[bam, bai], fasta, [] - stub": { + "[bam, bai], [], []": { "content": [ { "0": [ @@ -298,64 +329,44 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed:md5,f973de342df883efc1656c82a3a3978d" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "2": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed:md5,f973de342df883efc1656c82a3a3978d" ] ], "bedgraph": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "log": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:10:17.995261822" + "timestamp": "2025-04-15T15:01:35.512266692" }, - "[bam, bai], fasta, bed - stub": { + "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub": { "content": [ { "0": [ @@ -383,7 +394,7 @@ ] ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ @@ -410,17 +421,17 @@ ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:10:30.574897879" + "timestamp": "2025-04-15T15:02:37.027692372" }, - "[bam, bai], [], []": { + "[bam, bai], [], [] - stub": { "content": [ { "0": [ @@ -428,44 +439,64 @@ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ - + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "2": [ - + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "bedgraph": [ - + [ + { + "id": "test" + }, + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "log": [ - + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:08:51.291346508" + "timestamp": "2025-04-15T15:02:09.515064105" }, - "[bam, bai], [], [] - stub": { + "[bam, bai], [fasta, fai], bed - traditional - stub": { "content": [ { "0": [ @@ -493,7 +524,7 @@ ] ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ @@ -520,17 +551,17 @@ ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:10:05.670301111" + "timestamp": "2025-04-15T15:02:25.6273826" }, - "[bam, bai], fasta, bed": { + "[bam, bai], [fasta, fai], bed - stub": { "content": [ { "0": [ @@ -538,95 +569,64 @@ { "id": "test" }, - "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" - ], - "bed": [ [ { "id": "test" }, - "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "bedgraph": [ - - ], - "log": [ - - ], - "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" - ] - } - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2024-06-10T09:09:15.042805699" - }, - "[bam, bai], fasta, bed - traditional, HP, bedgraph": { - "content": [ - { - "0": [ - - ], - "1": [ + "2": [ [ { "id": "test" }, - [ - "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", - "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" - ] + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "2": [ - ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ - + [ + { + "id": "test" + }, + "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "bedgraph": [ [ { "id": "test" }, - [ - "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", - "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" - ] + "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "log": [ - + [ + { + "id": "test" + }, + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:09:52.968133216" + "timestamp": "2025-04-15T15:02:20.328195604" }, - "[bam, bai], fasta, bed - traditional": { + "[bam, bai], [fasta, fai], bed - traditional": { "content": [ { "0": [ @@ -644,7 +644,7 @@ ], "3": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ], "bed": [ [ @@ -661,14 +661,14 @@ ], "versions": [ - "versions.yml:md5,aa9f1fd8a0c9ab9709f381f864f6cdbe" + "versions.yml:md5,8527c1177696459470aef23905cfb6af" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "24.10.5" }, - "timestamp": "2024-06-10T09:09:27.735400826" + "timestamp": "2025-04-15T15:01:52.925069493" } } \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/tags.yml b/modules/nf-core/modkit/pileup/tests/tags.yml deleted file mode 100644 index 578e48b1..00000000 --- a/modules/nf-core/modkit/pileup/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -modkit/pileup: - - "modules/nf-core/modkit/pileup/**" diff --git a/modules/nf-core/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml index dc783c90..af1ea44a 100644 --- a/modules/nf-core/mosdepth/meta.yml +++ b/modules/nf-core/mosdepth/meta.yml @@ -23,14 +23,17 @@ input: type: file description: Input BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - bai: type: file description: Index for BAM/CRAM file pattern: "*.{bai,crai}" + ontologies: [] - bed: type: file description: BED file with intersected intervals pattern: "*.{bed}" + ontologies: [] - - meta2: type: map description: | @@ -40,9 +43,10 @@ input: type: file description: Reference genome FASTA file pattern: "*.{fa,fasta}" + ontologies: [] output: - - global_txt: - - meta: + global_txt: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +55,9 @@ output: type: file description: Text file with global cumulative coverage distribution pattern: "*.{global.dist.txt}" - - summary_txt: - - meta: + ontologies: [] + summary_txt: + - - meta: type: map description: | Groovy Map containing sample information @@ -61,8 +66,9 @@ output: type: file description: Text file with summary mean depths per chromosome and regions pattern: "*.{summary.txt}" - - regions_txt: - - meta: + ontologies: [] + regions_txt: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,8 +77,9 @@ output: type: file description: Text file with region cumulative coverage distribution pattern: "*.{region.dist.txt}" - - per_base_d4: - - meta: + ontologies: [] + per_base_d4: + - - meta: type: map description: | Groovy Map containing sample information @@ -81,8 +88,9 @@ output: type: file description: D4 file with per-base coverage pattern: "*.{per-base.d4}" - - per_base_bed: - - meta: + ontologies: [] + per_base_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,8 +99,9 @@ output: type: file description: BED file with per-base coverage pattern: "*.{per-base.bed.gz}" - - per_base_csi: - - meta: + ontologies: [] + per_base_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -101,8 +110,9 @@ output: type: file description: Index file for BED file with per-base coverage pattern: "*.{per-base.bed.gz.csi}" - - regions_bed: - - meta: + ontologies: [] + regions_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -111,8 +121,9 @@ output: type: file description: BED file with per-region coverage pattern: "*.{regions.bed.gz}" - - regions_csi: - - meta: + ontologies: [] + regions_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -121,8 +132,9 @@ output: type: file description: Index file for BED file with per-region coverage pattern: "*.{regions.bed.gz.csi}" - - quantized_bed: - - meta: + ontologies: [] + quantized_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -131,8 +143,9 @@ output: type: file description: BED file with binned coverage pattern: "*.{quantized.bed.gz}" - - quantized_csi: - - meta: + ontologies: [] + quantized_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -141,8 +154,9 @@ output: type: file description: Index file for BED file with binned coverage pattern: "*.{quantized.bed.gz.csi}" - - thresholds_bed: - - meta: + ontologies: [] + thresholds_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -152,8 +166,9 @@ output: description: BED file with the number of bases in each region that are covered at or above each threshold pattern: "*.{thresholds.bed.gz}" - - thresholds_csi: - - meta: + ontologies: [] + thresholds_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -162,11 +177,14 @@ output: type: file description: Index file for BED file with threshold coverage pattern: "*.{thresholds.bed.gz.csi}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/mosdepth/tests/tags.yml b/modules/nf-core/mosdepth/tests/tags.yml deleted file mode 100644 index 5cd2e08e..00000000 --- a/modules/nf-core/mosdepth/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -mosdepth: - - "modules/nf-core/mosdepth/**" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 812fc4c5..f8937048 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.29 + - bioconda::multiqc=1.30 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 0ac3c369..67460de9 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : - 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.30--pyhdfd78af_1' : + 'biocontainers/multiqc:1.30--pyhdfd78af_1' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 88e90571..0d3f288b 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.3" }, - "timestamp": "2025-05-22T11:50:41.182332996" + "timestamp": "2025-07-10T08:06:23.563041241" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.3" }, - "timestamp": "2025-05-22T11:51:22.448739369" + "timestamp": "2025-07-10T08:06:48.96226832" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,e65ce731db2128b8e4dd43d6e880fc1c" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.3" }, - "timestamp": "2025-05-22T11:51:06.198928424" + "timestamp": "2025-07-10T08:06:40.627008706" } -} \ No newline at end of file +} diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/modules/nf-core/pigz/uncompress/main.nf b/modules/nf-core/pigz/uncompress/main.nf index c7528f86..db712811 100644 --- a/modules/nf-core/pigz/uncompress/main.nf +++ b/modules/nf-core/pigz/uncompress/main.nf @@ -1,4 +1,5 @@ process PIGZ_UNCOMPRESS { + tag "$meta.id" label 'process_low' //stageInMode 'copy' // this directive can be set in case the original input should be kept @@ -30,7 +31,7 @@ process PIGZ_UNCOMPRESS { cat <<-END_VERSIONS > versions.yml "${task.process}": - pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) END_VERSIONS """ @@ -38,11 +39,11 @@ process PIGZ_UNCOMPRESS { def args = task.ext.args ?: '' uncompressed_filename = zip.toString() - '.gz' """ - touch ${zip.dropRight(3)} + touch $uncompressed_filename cat <<-END_VERSIONS > versions.yml "${task.process}": - pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz\\w*//' )) + pigz: \$(echo \$(pigz --version 2>&1) | sed 's/^.*pigz[[:space:]]*//' ) END_VERSIONS """ } diff --git a/modules/nf-core/pigz/uncompress/meta.yml b/modules/nf-core/pigz/uncompress/meta.yml index 3f583b22..cddd0a3b 100644 --- a/modules/nf-core/pigz/uncompress/meta.yml +++ b/modules/nf-core/pigz/uncompress/meta.yml @@ -22,9 +22,11 @@ input: type: file description: Gzipped file pattern: "*.{gzip}" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format output: - - file: - - meta: + file: + - - meta: type: map description: | Groovy Map containing sample information @@ -33,10 +35,13 @@ output: type: file description: File to compress pattern: "*" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@lrauschning" diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test b/modules/nf-core/pigz/uncompress/tests/main.nf.test index 62ab27e2..9c3289bc 100644 --- a/modules/nf-core/pigz/uncompress/tests/main.nf.test +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test @@ -29,5 +29,30 @@ nextflow_process { } } + + test("Should run without failures - stub") { + + options "-stub" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [ id:'test'], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } } \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap index 126dd7d6..384a574f 100644 --- a/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test.snap @@ -1,4 +1,37 @@ { + "Should run without failures - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ], + "file": [ + [ + { + "id": "test" + }, + "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T11:24:38.144787334" + }, "Should run without failures": { "content": [ { @@ -11,7 +44,7 @@ ] ], "1": [ - "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" ], "file": [ [ @@ -22,14 +55,14 @@ ] ], "versions": [ - "versions.yml:md5,a2d5ce72baa8b303f25afb9cf094f683" + "versions.yml:md5,e0c776f8d0bfa6d8e49e02aeb0728355" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nf-test": "0.9.0", + "nextflow": "24.10.5" }, - "timestamp": "2024-05-15T16:43:21.55056643" + "timestamp": "2025-03-11T11:23:17.620127425" } } \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/tags.yml b/modules/nf-core/pigz/uncompress/tests/tags.yml deleted file mode 100644 index 6719a90a..00000000 --- a/modules/nf-core/pigz/uncompress/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -pigz/uncompress: - - modules/nf-core/pigz/uncompress/** diff --git a/modules/nf-core/samtools/cat/meta.yml b/modules/nf-core/samtools/cat/meta.yml index dfb0f78c..a2ac0e21 100644 --- a/modules/nf-core/samtools/cat/meta.yml +++ b/modules/nf-core/samtools/cat/meta.yml @@ -27,9 +27,10 @@ input: type: file description: BAM/CRAM files pattern: "*.{bam,cram}" + ontologies: [] output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -38,8 +39,9 @@ output: type: file description: Concatenated BAM file pattern: "*.{bam}" - - cram: - - meta: + ontologies: [] + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -48,11 +50,14 @@ output: type: file description: Concatenated CRAM file pattern: "*.{cram}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@matthdsm" maintainers: diff --git a/modules/nf-core/samtools/cat/tests/tags.yml b/modules/nf-core/samtools/cat/tests/tags.yml deleted file mode 100644 index 97605570..00000000 --- a/modules/nf-core/samtools/cat/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/cat: - - "modules/nf-core/samtools/cat/**" diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 28c0a81c..6de0095d 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -10,9 +10,11 @@ process SAMTOOLS_FAIDX { input: tuple val(meta), path(fasta) tuple val(meta2), path(fai) + val get_sizes output: - tuple val(meta), path ("*.{fa,fasta}") , emit: fa , optional: true + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true path "versions.yml" , emit: versions @@ -22,12 +24,15 @@ process SAMTOOLS_FAIDX { script: def args = task.ext.args ?: '' + def get_sizes_command = get_sizes ? "cut -f 1,2 ${fasta}.fai > ${fasta}.sizes" : '' """ samtools \\ faidx \\ $fasta \\ $args + ${get_sizes_command} + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') @@ -37,9 +42,15 @@ process SAMTOOLS_FAIDX { stub: def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() def fastacmd = match[0] ? "touch ${match[0][1]}" : '' + def get_sizes_command = get_sizes ? "touch ${fasta}.sizes" : '' """ ${fastacmd} touch ${fasta}.fai + if [[ "${fasta.extension}" == "gz" ]]; then + touch ${fasta}.gzi + fi + + ${get_sizes_command} cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index 6721b2cb..b7a2e0c1 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -1,9 +1,10 @@ name: samtools_faidx -description: Index FASTA file +description: Index FASTA file, and optionally generate a file of chromosome sizes keywords: - index - fasta - faidx + - chromosome tools: - samtools: description: | @@ -25,6 +26,7 @@ input: type: file description: FASTA file pattern: "*.{fa,fasta}" + ontologies: [] - - meta2: type: map description: | @@ -34,9 +36,14 @@ input: type: file description: FASTA index file pattern: "*.{fai}" + ontologies: [] + - get_sizes: + type: boolean + description: use cut to get the sizes of the index (true) or not (false) + output: - - fa: - - meta: + fa: + - - meta: type: map description: | Groovy Map containing sample information @@ -45,8 +52,20 @@ output: type: file description: FASTA file pattern: "*.{fa}" - - fai: - - meta: + ontologies: [] + sizes: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.sizes": + type: file + description: File containing chromosome lengths + pattern: "*.{sizes}" + ontologies: [] + fai: + - - meta: type: map description: | Groovy Map containing sample information @@ -55,8 +74,9 @@ output: type: file description: FASTA index file pattern: "*.{fai}" - - gzi: - - meta: + ontologies: [] + gzi: + - - meta: type: map description: | Groovy Map containing sample information @@ -65,16 +85,18 @@ output: type: file description: Optional gzip index file for compressed inputs pattern: "*.gzi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@ewels" - "@phue" maintainers: - - "@drpatelh" - - "@ewels" + - "@maxulysse" - "@phue" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index 17244ef2..64219b7d 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -16,8 +16,8 @@ nextflow_process { """ input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [[],[]] + input[2] = false """ } } @@ -37,8 +37,8 @@ nextflow_process { """ input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true)] - input[1] = [[],[]] + input[2] = false """ } } @@ -60,9 +60,9 @@ nextflow_process { """ input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + input[2] = false """ } } @@ -84,9 +84,9 @@ nextflow_process { """ input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] + input[2] = false """ } } @@ -106,8 +106,8 @@ nextflow_process { """ input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [[],[]] + input[2] = false """ } } @@ -119,4 +119,101 @@ nextflow_process { ) } } + + test("test_samtools_faidx_get_sizes") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_get_sizes_bgzip - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ]) + input[1] = [[],[]] + input[2] = true + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap index 1bbb3ec2..73722414 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -6,6 +6,9 @@ ], "1": [ + + ], + "2": [ [ { "id": "test", @@ -14,10 +17,10 @@ "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" ] ], - "2": [ + "3": [ ], - "3": [ + "4": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" ], "fa": [ @@ -34,6 +37,9 @@ ], "gzi": [ + ], + "sizes": [ + ], "versions": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" @@ -41,10 +47,142 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:31:48.258623157" + }, + "test_samtools_faidx_get_sizes_bgzip - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-09-16T07:57:47.450887871" + "timestamp": "2024-11-20T17:32:41.122428188" + }, + "test_samtools_faidx_get_sizes": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:34:02.353546697" }, "test_samtools_faidx_bgzip": { "content": [ @@ -53,6 +191,9 @@ ], "1": [ + + ], + "2": [ [ { "id": "test", @@ -61,7 +202,7 @@ "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" ] ], - "2": [ + "3": [ [ { "id": "test", @@ -70,7 +211,7 @@ "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" ] ], - "3": [ + "4": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" ], "fa": [ @@ -93,6 +234,9 @@ }, "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" ] + ], + "sizes": [ + ], "versions": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" @@ -100,10 +244,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-09-16T07:58:04.804905659" + "timestamp": "2024-11-20T17:31:55.157487176" }, "test_samtools_faidx_fasta": { "content": [ @@ -124,6 +268,9 @@ ], "3": [ + + ], + "4": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" ], "fa": [ @@ -140,6 +287,9 @@ ], "gzi": [ + ], + "sizes": [ + ], "versions": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" @@ -147,10 +297,71 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-09-16T07:58:23.831268154" + "timestamp": "2024-11-20T17:32:02.149455586" + }, + "test_samtools_faidx_get_sizes - stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gzi": [ + + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:34.29376776" }, "test_samtools_faidx_stub_fasta": { "content": [ @@ -171,6 +382,9 @@ ], "3": [ + + ], + "4": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" ], "fa": [ @@ -187,6 +401,9 @@ ], "gzi": [ + ], + "sizes": [ + ], "versions": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" @@ -194,10 +411,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-09-16T07:58:35.600243706" + "timestamp": "2024-11-20T17:32:09.125065185" }, "test_samtools_faidx_stub_fai": { "content": [ @@ -206,6 +423,9 @@ ], "1": [ + + ], + "2": [ [ { "id": "test", @@ -214,10 +434,10 @@ "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" ] ], - "2": [ + "3": [ ], - "3": [ + "4": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" ], "fa": [ @@ -234,6 +454,80 @@ ], "gzi": [ + ], + "sizes": [ + + ], + "versions": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-20T17:32:16.274287863" + }, + "test_samtools_faidx_get_sizes_bgzip": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "3": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "4": [ + "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "sizes": [ + [ + { + "id": "test" + }, + "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" + ] ], "versions": [ "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" @@ -241,9 +535,9 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-09-16T07:58:54.705460167" + "timestamp": "2024-11-20T17:32:28.117654855" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/tags.yml b/modules/nf-core/samtools/faidx/tests/tags.yml deleted file mode 100644 index e4a83948..00000000 --- a/modules/nf-core/samtools/faidx/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/faidx: - - modules/nf-core/samtools/faidx/** diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml index cdc4c254..ebbc15f2 100644 --- a/modules/nf-core/samtools/flagstat/meta.yml +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -29,13 +29,15 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + ontologies: [] - bai: type: file description: Index for BAM/CRAM/SAM file pattern: "*.{bai,crai,sai}" + ontologies: [] output: - - flagstat: - - meta: + flagstat: + - - meta: type: map description: | Groovy Map containing sample information @@ -44,11 +46,14 @@ output: type: file description: File containing samtools flagstat output pattern: "*.{flagstat}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" maintainers: diff --git a/modules/nf-core/samtools/flagstat/tests/tags.yml b/modules/nf-core/samtools/flagstat/tests/tags.yml deleted file mode 100644 index 2d2b7255..00000000 --- a/modules/nf-core/samtools/flagstat/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/flagstat: - - modules/nf-core/samtools/flagstat/** diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index e2bb6b20..3d5bf4bd 100644 --- a/modules/nf-core/samtools/idxstats/main.nf +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -21,6 +21,7 @@ process SAMTOOLS_IDXSTATS { def prefix = task.ext.prefix ?: "${meta.id}" """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). samtools \\ idxstats \\ --threads ${task.cpus-1} \\ diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml index f0a6bcb2..96d42746 100644 --- a/modules/nf-core/samtools/idxstats/meta.yml +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -29,13 +29,15 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + ontologies: [] - bai: type: file description: Index for BAM/CRAM/SAM file pattern: "*.{bai,crai,sai}" + ontologies: [] output: - - idxstats: - - meta: + idxstats: + - - meta: type: map description: | Groovy Map containing sample information @@ -44,11 +46,14 @@ output: type: file description: File containing samtools idxstats output pattern: "*.{idxstats}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" maintainers: diff --git a/modules/nf-core/samtools/idxstats/tests/tags.yml b/modules/nf-core/samtools/idxstats/tests/tags.yml deleted file mode 100644 index d3057c61..00000000 --- a/modules/nf-core/samtools/idxstats/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/idxstats: - - modules/nf-core/samtools/idxstats/** diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 31175610..7019a72e 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -24,7 +24,7 @@ process SAMTOOLS_INDEX { """ samtools \\ index \\ - -@ ${task.cpus-1} \\ + -@ ${task.cpus} \\ $args \\ $input diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index db8df0d5..1bed6bca 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -25,9 +25,10 @@ input: - input: type: file description: input file + ontologies: [] output: - - bai: - - meta: + bai: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,8 +37,9 @@ output: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" - - csi: - - meta: + ontologies: [] + csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -46,8 +48,9 @@ output: type: file description: CSI index file pattern: "*.{csi}" - - crai: - - meta: + ontologies: [] + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -56,11 +59,14 @@ output: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/index/tests/tags.yml b/modules/nf-core/samtools/index/tests/tags.yml deleted file mode 100644 index e0f58a7a..00000000 --- a/modules/nf-core/samtools/index/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/index: - - modules/nf-core/samtools/index/** diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 77b020f7..6dc51885 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -27,10 +27,12 @@ input: type: file description: BAM/CRAM file from alignment pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" + ontologies: [] - - meta2: type: map description: | @@ -40,9 +42,10 @@ input: type: file description: Reference file the CRAM was created with (optional) pattern: "*.{fasta,fa}" + ontologies: [] output: - - stats: - - meta: + stats: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,11 +54,14 @@ output: type: file description: File containing samtools stats output pattern: "*.{stats}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@FriederikeHanssen" diff --git a/modules/nf-core/samtools/stats/samtools-stats.diff b/modules/nf-core/samtools/stats/samtools-stats.diff index c82fc0f4..f6a5b76c 100644 --- a/modules/nf-core/samtools/stats/samtools-stats.diff +++ b/modules/nf-core/samtools/stats/samtools-stats.diff @@ -13,7 +13,6 @@ Changes in 'samtools/stats/main.nf': container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'modules/nf-core/samtools/stats/environment.yml' is unchanged -'modules/nf-core/samtools/stats/tests/tags.yml' is unchanged 'modules/nf-core/samtools/stats/tests/main.nf.test' is unchanged 'modules/nf-core/samtools/stats/tests/main.nf.test.snap' is unchanged ************************************************************ diff --git a/modules/nf-core/samtools/stats/tests/tags.yml b/modules/nf-core/samtools/stats/tests/tags.yml deleted file mode 100644 index 7c28e30f..00000000 --- a/modules/nf-core/samtools/stats/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -samtools/stats: - - modules/nf-core/samtools/stats/** diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff new file mode 100644 index 00000000..e016d2cd --- /dev/null +++ b/modules/nf-core/severus/severus.diff @@ -0,0 +1,61 @@ +Changes in component 'nf-core/severus' +'modules/nf-core/severus/meta.yml' is unchanged +Changes in 'severus/main.nf': +--- modules/nf-core/severus/main.nf ++++ modules/nf-core/severus/main.nf +@@ -4,12 +4,12 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/severus:1.3--pyhdfd78af_0': +- 'biocontainers/severus:1.3--pyhdfd78af_0' }" ++ 'https://depot.galaxyproject.org/singularity/severus:1.6--pyhdfd78af_0': ++ 'biocontainers/severus:1.6--pyhdfd78af_0' }" + + input: + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) +- tuple val(meta2), path(bed) ++ tuple val(meta2), path(bed), path(pon_path) + + output: + tuple val(meta), path("${prefix}/severus.log") , emit: log +@@ -20,12 +20,12 @@ + tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true +- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true +- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf //, optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + +@@ -39,12 +39,14 @@ + def control = control_input ? "--control-bam ${control_input}" : "" + def vntr_bed = bed ? "--vntr-bed ${bed}" : "" + def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" ++ def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" + """ + severus \\ + $args \\ + --threads $task.cpus \\ + --target-bam $target_input \\ + $vntr_bed \\ ++ $pon \\ + $control \\ + $phasing_vcf \\ + --out-dir ${prefix} + +'modules/nf-core/severus/environment.yml' is unchanged +'modules/nf-core/severus/tests/tags.yml' is unchanged +'modules/nf-core/severus/tests/main.nf.test' is unchanged +'modules/nf-core/severus/tests/main.nf.test.snap' is unchanged +'modules/nf-core/severus/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/unzip/meta.yml b/modules/nf-core/unzip/meta.yml index 426fccb7..ba1eb912 100644 --- a/modules/nf-core/unzip/meta.yml +++ b/modules/nf-core/unzip/meta.yml @@ -24,9 +24,11 @@ input: type: file description: ZIP file pattern: "*.zip" + ontologies: + - edam: http://edamontology.org/format_3987 # ZIP format output: - - unzipped_archive: - - meta: + unzipped_archive: + - - meta: type: map description: | Groovy Map containing sample information @@ -35,11 +37,13 @@ output: type: directory description: Directory contents of the unzipped archive pattern: "${archive.baseName}/" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@jfy133" maintainers: diff --git a/modules/nf-core/unzip/tests/tags.yml b/modules/nf-core/unzip/tests/tags.yml deleted file mode 100644 index 7f5647e1..00000000 --- a/modules/nf-core/unzip/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -unzip: - - "modules/nf-core/unzip/**" diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml deleted file mode 100644 index ec2f2d68..00000000 --- a/subworkflows/nf-core/bam_stats_samtools/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/bam_stats_samtools: - - subworkflows/nf-core/bam_stats_samtools/** From db3871f5ae19d49c6812b738ec6c1e889f36ad06 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:24:39 +0200 Subject: [PATCH 278/557] adjusted subworkflow for updated samtools_faidx --- subworkflows/local/prepare_reference_files.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 664c2e09..99b4bc3f 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -37,7 +37,8 @@ workflow PREPARE_REFERENCE_FILES { SAMTOOLS_FAIDX ( ch_prepared_fasta, - [ [:], "$projectDir/assets/dummy_file.txt" ] + [ [:], "$projectDir/assets/dummy_file.txt" ], + false ) ch_prepared_fai = SAMTOOLS_FAIDX.out.fai From 33f2cfd82cfcdee0f00efa9438d9a3d2c31b5d2f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:36:50 +0200 Subject: [PATCH 279/557] added versions to all tools and emit version in lr_somatic.nf --- subworkflows/local/tumor_only_happhase.nf | 91 +++++++++++++---------- workflows/lr_somatic.nf | 2 +- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index f1ee125a..63ecc838 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -1,7 +1,7 @@ -include { CLAIRSTO } from '../../modules/local/clairsto/main.nf' -include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { CLAIRSTO } from '../../modules/local/clairsto/main.nf' +include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' workflow TUMOR_ONLY_HAPPHASE { @@ -13,13 +13,15 @@ workflow TUMOR_ONLY_HAPPHASE { clairSTO_modelMap main: - + + ch_versions = Channel.empty() + tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } - .set{tumor_bams} + .set{ tumor_bams } // // MODULE: CLAIRSTO @@ -27,15 +29,17 @@ workflow TUMOR_ONLY_HAPPHASE { // call somatic/non-somatic variants // (* not called as germline * just non-somatic) - CLAIRSTO( + CLAIRSTO ( tumor_bams, fasta, fai ) + ch_versions = ch_versions.mix(CLAIRSTO.out.versions) + CLAIRSTO.out.indel_vcf .join(CLAIRSTO.out.snv_vcf) - .set{clairsto_vcf} + .set{ clairsto_vcf } // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // indel_vcf: vcf for indels @@ -47,20 +51,22 @@ workflow TUMOR_ONLY_HAPPHASE { // ClairSTO gives outputs in snv.vcf and indel.vcf // reformats them to be in somatic.vcf and nonsomatic.vcf - VCFSPLIT( + VCFSPLIT ( clairsto_vcf ) + ch_versions = ch_versions.mix(VCFSPLIT.out.versions) + // Add the nonsomatic vcf info // remove model info tumor_bams - .join(VCFSPLIT.out.germline_vcf) - .map{ meta, bam, bai, model, snps -> - def svs = [] - def mods = [] - return[meta, bam, bai, snps, svs, mods] - } - .set{tumor_bams_germlinevcf} + .join(VCFSPLIT.out.germline_vcf) + .map{ meta, bam, bai, model, snps -> + def svs = [] + def mods = [] + return[meta, bam, bai, snps, svs, mods] + } + .set{ tumor_bams_germlinevcf } // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -74,22 +80,24 @@ workflow TUMOR_ONLY_HAPPHASE { // // Phase tumor bams on nonsomatic vcf - LONGPHASE_PHASE( + LONGPHASE_PHASE ( tumor_bams_germlinevcf, fasta, fai ) + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + // Add phased nonsomatic vcf info // remove model info tumor_bams - .join(LONGPHASE_PHASE.out.vcf) - .map{ meta, bam, bai, model, snps -> - def svs = [] - def mods = [] - return [meta, bam, bai, snps, svs, mods] - } - .set{tumor_bams_phasedvcf} + .join(LONGPHASE_PHASE.out.vcf) + .map{ meta, bam, bai, model, snps -> + def svs = [] + def mods = [] + return [meta, bam, bai, snps, svs, mods] + } + .set{ tumor_bams_phasedvcf } // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -103,15 +111,17 @@ workflow TUMOR_ONLY_HAPPHASE { // // Haplotag the tumor bams - LONGPHASE_HAPLOTAG( + LONGPHASE_HAPLOTAG ( tumor_bams_phasedvcf, fasta, fai ) + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) + // grab phased bams LONGPHASE_HAPLOTAG.out.bam - .set{haplotagged_bams} + .set{ haplotagged_bams } // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: list of concatenated aligned bams @@ -120,24 +130,26 @@ workflow TUMOR_ONLY_HAPPHASE { // MODULES: SAMTOOLS_INDEX // // index the haplotagged bams - SAMTOOLS_INDEX( + SAMTOOLS_INDEX ( haplotagged_bams ) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + // join information and the phased VCF file haplotagged_bams - .join(SAMTOOLS_INDEX.out.bai) - .join(LONGPHASE_PHASE.out.vcf) - .map{meta, hap_bam, hap_bai, vcf -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - basecall_model: meta.basecall_model] - return[new_meta, hap_bam, hap_bai, [],[], vcf] - } - .set{tumor_only_severus} + .join(SAMTOOLS_INDEX.out.bai) + .join(LONGPHASE_PHASE.out.vcf) + .map{meta, hap_bam, hap_bai, vcf -> + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model] + return[new_meta, hap_bam, hap_bai, [],[], vcf] + } + .set{ tumor_only_severus } // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // hap_bam: haplotagged aligned bam for tumor @@ -148,5 +160,6 @@ workflow TUMOR_ONLY_HAPPHASE { emit: tumor_only_severus + versions = ch_versions } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 9a905cb7..3ebb43ab 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -319,7 +319,7 @@ workflow LR_SOMATIC { clairs_modelMap ) - ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus From 3132011602152621ce9961c60a12244808aad61a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:37:00 +0200 Subject: [PATCH 280/557] formatting and linting --- subworkflows/local/tumor_normal_happhase.nf | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index df00d768..e209468c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -20,7 +20,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal: meta.type == "normal" tumor: meta.type == "tumor" } - .set{mixed_bams} + .set{ mixed_bams } // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later @@ -36,7 +36,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def platform = (meta.platform == "pb") ? "hifi" : "ont" return[new_meta, bam, bai, clair3_model, [], platform] } - .set{normal_bams} + .set{ normal_bams } // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -58,13 +58,12 @@ workflow TUMOR_NORMAL_HAPPHASE { basecall_model: meta.basecall_model] return[new_meta, bam, bai] } - .set{tumor_bams} + .set{ tumor_bams } // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files - // // MODULE: CLAIR3 // @@ -88,7 +87,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def mods = [] return [meta, bam, bai, vcf, svs, mods] } - .set{normalbams_germlinevcf} + .set{ normal_bams_germlinevcf } // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -123,7 +122,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def mods = [] return[new_meta, bam, bai, vcf, snvs, mods] } - .set{normal_bams} + .set{ normal_bams } // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -145,7 +144,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [new_meta, bam, bai, vcf, snvs, mods] } .mix(normal_bams) - .set{mixed_bams_vcf} + .set{ mixed_bams_vcf } // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -184,20 +183,18 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_hapbams ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) // Add index to channel mixed_bams_vcf .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) - .set{mixed_hapbams} + .set{ mixed_hapbams } // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams // bais: indexes for bam files - // Group everything back together in one channel mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> @@ -219,7 +216,8 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } .join(LONGPHASE_PHASE.out.vcf) - .set{tumor_normal_severus} + .set{ tumor_normal_severus } + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files From 833fb36e9454e64555a7fd3da08dcbcfb28f6600 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:40:55 +0200 Subject: [PATCH 281/557] prettier linting --- CHANGELOG.md | 4 +- README.md | 32 +-- assets/schema_input.json | 8 +- docs/output.md | 22 +- modules.json | 86 ++----- modules/local/clair3/meta.yml | 226 +++++++++--------- modules/local/cramino/meta.yml | 49 ++-- modules/local/fibertoolsrs/fire/meta.yml | 49 ++-- .../local/fibertoolsrs/nucleosomes/meta.yml | 49 ++-- .../local/fibertoolsrs/predictm6a/meta.yml | 49 ++-- modules/local/fibertoolsrs/qc/meta.yml | 49 ++-- modules/local/metaextract/meta.yml | 49 ++-- modules/local/vcfsplit/meta.yml | 49 ++-- modules/local/wakhan/meta.yml | 49 ++-- 14 files changed, 363 insertions(+), 407 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b09d339..8952e3af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` + - ClairS-TO Module - cramino module -- modkit pileup module +- modkit pileup module - mosdepth module - minimap2/index module - minimap2/align module @@ -22,6 +23,7 @@ Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https:/ - add longphase/tag and longphase/phase modules ### `Fixed` + - New channel structure - No longer possible to have duplicated naming after samtools cat - restructured minimap2 diff --git a/README.md b/README.md index 6fdf4a15..f7122746 100644 --- a/README.md +++ b/README.md @@ -14,43 +14,44 @@ ## Introduction **IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. - -This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. + +This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. It can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design. Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. ## Pipeline summary + **1) Pre-processing:** - a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) +a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) - b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) +b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) - c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) +c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) - d. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs)) +d. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs)) **2i) Matched mode: small variant calling:** - - a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) - b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) +a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) - c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) +b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) **2ii) Tumour only mode: small variant calling:** - a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) +a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) - b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) +b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) **3) Large variant calling:** - a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) +a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) - b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) +b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) @@ -62,6 +63,7 @@ Developed using **Nextflow DSL2**, it offers high portability and scalability ac > 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. First prepare a samplesheet with your input data that looks as follows: + ```csv sample,bam_tumor,bam_normal,platform,sex,fiber sample1,tumour.bam,normal.bam,ont,female,n @@ -70,7 +72,7 @@ sample3,tumour.bam,,pb,male,n sample4,tumour.bam,normal.bam,pb,male,y ``` -Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. +Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: diff --git a/assets/schema_input.json b/assets/schema_input.json index a33a56df..cf6e80a9 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -42,16 +42,16 @@ "enum": ["y", "n"], "errorMessage": "Specifiy (y/n) if sample has had fiberseq performed" }, - "clair3_model":{ + "clair3_model": { "type": "string" }, - "clairSTO_model":{ + "clairSTO_model": { "type": "string" }, - "clairS_model":{ + "clairS_model": { "type": "string" } }, - "required": ["sample", "bam_tumor", "platform", "sex","fiber"] + "required": ["sample", "bam_tumor", "platform", "sex", "fiber"] } } diff --git a/docs/output.md b/docs/output.md index d4a8110f..e36ad4f0 100644 --- a/docs/output.md +++ b/docs/output.md @@ -16,7 +16,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [minimap2/index](#minimap2) - Creating minimap2 index - [minimap2/align](#minimap2) - Aligning long-read samples to the reference genome - [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files -- [Modkit](#modkit) - Tool to process methylation data +- [Modkit](#modkit) - Tool to process methylation data - [Mosdepth](#mosdepth) - Tool to check the sequencing depth - [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples - [Severus](#severus) - Tool to call somatic and germline structural variants @@ -31,6 +31,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . ### Cramino +
Output files @@ -41,23 +42,22 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [Cramino](https://github.com/wdecoster/cramino) is a tool for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . - - ### Modkit +
Output files - `modkit/` - `*.bed`: bed file with genomic positions with modified bases - `*.bedgraph`: bedgraph file with genomic positions with modified bases - - `*log`: log file + - `*log`: log file
[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see . - ### Mosdepth +
Output files @@ -85,30 +85,32 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
### Severus +
Output files - `severus` - - `severus.log`: severus log file - - `read_qual.txt`: the read quality - - `breakpoints_double.csv`: the breakpoint file +- `severus.log`: severus log file +- `read_qual.txt`: the read quality +- `breakpoints_double.csv`: the breakpoint file
[Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . ### Longphase +
Output files TODO - add description ot output file + - `longphase/`
[Longphase](https://github.com/twolinin/longphase) isa tool to phase your input variant calls and haplotag your bam. To see more, see . - ### MultiQC
@@ -152,4 +154,4 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. \ No newline at end of file +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/modules.json b/modules.json index 3372f736..b5400534 100644 --- a/modules.json +++ b/modules.json @@ -8,125 +8,91 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -135,33 +101,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/modules/local/clair3/meta.yml b/modules/local/clair3/meta.yml index 5ba5105b..cecf7564 100644 --- a/modules/local/clair3/meta.yml +++ b/modules/local/clair3/meta.yml @@ -2,122 +2,122 @@ name: "clair3" description: Clair3 is a germline small variant caller for long-reads keywords: -- germline -- variant -- Indel -- SNV + - germline + - variant + - Indel + - SNV tools: -- "clair3": - description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER - (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≤30-fold of ONT data - (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally - four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment - as input for deep-learning based long-read small variant calling. Clair3 is - simple and modular for easy deployment and integration." - homepage: "https://github.com/HKU-BAL/Clair3" - documentation: "https://github.com/HKU-BAL/Clair3" - tool_dev_url: "https://github.com/HKU-BAL/Clair3" - doi: "10.1038/s43588-022-00387-x" - licence: ['BSD-3-clause'] - identifier: biotools:clair3 + - "clair3": + description: "Clair3 is a small variant caller for long-reads. Compare to PEPPER + (r0.4), Clair3 (v0.1) shows a better SNP F1-score with ≤30-fold of ONT data + (precisionFDA Truth Challenge V2), and a better Indel F1-score, while runs generally + four times faster. Clair3 makes the best of both worlds of using pileup or full-alignment + as input for deep-learning based long-read small variant calling. Clair3 is + simple and modular for easy deployment and integration." + homepage: "https://github.com/HKU-BAL/Clair3" + documentation: "https://github.com/HKU-BAL/Clair3" + tool_dev_url: "https://github.com/HKU-BAL/Clair3" + doi: "10.1038/s43588-022-00387-x" + licence: ["BSD-3-clause"] + identifier: biotools:clair3 input: -- - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - - bai: - type: file - description: BAM index file - pattern: "*.bai" - - packaged_model: - type: string - description: string containing the name of a prepackaged Clair3 model - full list of models and their descriptions is provided at https://github.com/HKU-BAL/Clair3?tab=readme-ov-file#pre-trained-models - - user_model: - type: directory - description: directory containing Clair3 model files - - platform: - type: string - description: val in ['hifi','ont', 'ilmn'] to indicate pacbio, ONT, or illumina - respectively -- - meta2: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - reference: - type: file - description: reference fasta file - pattern: "*.fasta" -- - meta3: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - index: - type: file - description: reference index file - pattern: "*.fai" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - bai: + type: file + description: BAM index file + pattern: "*.bai" + - packaged_model: + type: string + description: string containing the name of a prepackaged Clair3 model + full list of models and their descriptions is provided at https://github.com/HKU-BAL/Clair3?tab=readme-ov-file#pre-trained-models + - user_model: + type: directory + description: directory containing Clair3 model files + - platform: + type: string + description: val in ['hifi','ont', 'ilmn'] to indicate pacbio, ONT, or illumina + respectively + - - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - reference: + type: file + description: reference fasta file + pattern: "*.fasta" + - - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - index: + type: file + description: reference index file + pattern: "*.fai" output: -- vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - pattern: "*.{vcf,vcf.gz}" - - '*merge_output.vcf.gz': - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - pattern: "*.{vcf,vcf.gz}" -- tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - '*merge_output.vcf.gz.tbi': - type: file - description: index for vcf files - pattern: "*.{vcf.tbi,vcf.tbi.gz}" -- phased_vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - '*phased_merge_output.vcf.gz': - type: file - description: phased vcf - pattern: "*.{vcf,vcf.gz}" -- phased_tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - '*phased_merge_output.vcf.gz.tbi': - type: file - description: index for vcf files - pattern: "*.{vcf.tbi,vcf.tbi.gz}" -- versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + - vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - "*merge_output.vcf.gz": + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + - phased_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz": + type: file + description: phased vcf + pattern: "*.{vcf,vcf.gz}" + - phased_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: -- "@robert-a-forsyth" + - "@robert-a-forsyth" maintainers: -- "@robert-a-forsyth" + - "@robert-a-forsyth" diff --git a/modules/local/cramino/meta.yml b/modules/local/cramino/meta.yml index abe5d891..b63a18af 100644 --- a/modules/local/cramino/meta.yml +++ b/modules/local/cramino/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "None" tool_dev_url: "None" doi: "" - licence: ['MIT'] - identifier: + licence: ["MIT"] + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@alexanRNA" diff --git a/modules/local/fibertoolsrs/fire/meta.yml b/modules/local/fibertoolsrs/fire/meta.yml index a754c57b..63f0a8b0 100644 --- a/modules/local/fibertoolsrs/fire/meta.yml +++ b/modules/local/fibertoolsrs/fire/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" doi: "" - licence: ['MIT'] - identifier: + licence: ["MIT"] + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/nucleosomes/meta.yml b/modules/local/fibertoolsrs/nucleosomes/meta.yml index bc5a5889..1863d9f1 100644 --- a/modules/local/fibertoolsrs/nucleosomes/meta.yml +++ b/modules/local/fibertoolsrs/nucleosomes/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "" tool_dev_url: "" doi: "" - licence: - identifier: + licence: + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@robert-a-forsyth" diff --git a/modules/local/fibertoolsrs/predictm6a/meta.yml b/modules/local/fibertoolsrs/predictm6a/meta.yml index 55ea7cca..f9b25d64 100644 --- a/modules/local/fibertoolsrs/predictm6a/meta.yml +++ b/modules/local/fibertoolsrs/predictm6a/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" doi: "" - licence: ['MIT'] - identifier: + licence: ["MIT"] + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/qc/meta.yml b/modules/local/fibertoolsrs/qc/meta.yml index c38e9b66..3a15bee4 100644 --- a/modules/local/fibertoolsrs/qc/meta.yml +++ b/modules/local/fibertoolsrs/qc/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" doi: "" - licence: ['MIT'] - identifier: + licence: ["MIT"] + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@MariosEft97" diff --git a/modules/local/metaextract/meta.yml b/modules/local/metaextract/meta.yml index b26bf98b..542861a6 100644 --- a/modules/local/metaextract/meta.yml +++ b/modules/local/metaextract/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "" tool_dev_url: "" doi: "" - licence: - identifier: + licence: + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@robert-a-forsyth" diff --git a/modules/local/vcfsplit/meta.yml b/modules/local/vcfsplit/meta.yml index 2ed845aa..8f115005 100644 --- a/modules/local/vcfsplit/meta.yml +++ b/modules/local/vcfsplit/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "" tool_dev_url: "" doi: "" - licence: - identifier: + licence: + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@robert-a-forsyth" diff --git a/modules/local/wakhan/meta.yml b/modules/local/wakhan/meta.yml index 0d0cc2aa..6695af4a 100644 --- a/modules/local/wakhan/meta.yml +++ b/modules/local/wakhan/meta.yml @@ -15,8 +15,8 @@ tools: documentation: "None" tool_dev_url: "None" doi: "" - licence: ['MIT'] - identifier: + licence: ["MIT"] + identifier: ## TODO nf-core: Add a description of all of the variables used as input input: @@ -26,8 +26,8 @@ input: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input + + ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,32 +36,31 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - ## TODO nf-core: Add a description of all of the variables used as output output: - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" - + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + ## TODO nf-core: Delete / customise this example output + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" + - "versions.yml": + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@ljwharbers" From 884fbbe326fe776b0a785808b52095f3c131e3e4 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:45:24 +0200 Subject: [PATCH 282/557] linting --- modules/local/clair3/tests/main.nf.test | 2 +- modules/local/clairs/tests/main.nf.test | 2 +- modules/local/clairsto/main.nf | 2 +- modules/local/clairsto/tests/main.nf.test | 2 +- modules/local/cramino/main.nf | 2 +- modules/local/cramino/tests/main.nf.test | 4 ++-- .../fibertoolsrs/fire/tests/main.nf.test | 4 ++-- .../nucleosomes/tests/main.nf.test | 4 ++-- .../predictm6a/tests/main.nf.test | 4 ++-- .../local/fibertoolsrs/qc/tests/main.nf.test | 4 ++-- modules/local/metaextract/tests/main.nf.test | 4 ++-- modules/local/vcfsplit/tests/main.nf.test | 4 ++-- modules/local/wakhan/main.nf | 4 ++-- modules/local/wakhan/tests/main.nf.test | 4 ++-- subworkflows/local/prepare_reference_files.nf | 20 +++++++++---------- subworkflows/local/tumor_only_happhase.nf | 4 ++-- 16 files changed, 35 insertions(+), 35 deletions(-) diff --git a/modules/local/clair3/tests/main.nf.test b/modules/local/clair3/tests/main.nf.test index 8e9c8cc3..5ed08490 100644 --- a/modules/local/clair3/tests/main.nf.test +++ b/modules/local/clair3/tests/main.nf.test @@ -180,4 +180,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/local/clairs/tests/main.nf.test b/modules/local/clairs/tests/main.nf.test index b17c769d..9db10ed9 100644 --- a/modules/local/clairs/tests/main.nf.test +++ b/modules/local/clairs/tests/main.nf.test @@ -86,4 +86,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index ac2ca2a7..3ad00912 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -35,7 +35,7 @@ process CLAIRSTO { --output_dir . \\ $conda_prefix \\ $args \\ - + cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/clairsto/tests/main.nf.test b/modules/local/clairsto/tests/main.nf.test index 75e14709..f15d3ed9 100644 --- a/modules/local/clairsto/tests/main.nf.test +++ b/modules/local/clairsto/tests/main.nf.test @@ -83,4 +83,4 @@ nextflow_process { } } -} \ No newline at end of file +} diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index c8078170..ce64c8e7 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -20,7 +20,7 @@ process CRAMINO { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - + diff --git a/modules/local/cramino/tests/main.nf.test b/modules/local/cramino/tests/main.nf.test index e5d85d24..c142404e 100644 --- a/modules/local/cramino/tests/main.nf.test +++ b/modules/local/cramino/tests/main.nf.test @@ -22,7 +22,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -51,7 +51,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/fibertoolsrs/fire/tests/main.nf.test b/modules/local/fibertoolsrs/fire/tests/main.nf.test index 280ad8ce..e930f17d 100644 --- a/modules/local/fibertoolsrs/fire/tests/main.nf.test +++ b/modules/local/fibertoolsrs/fire/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -52,7 +52,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test b/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test index e558b3a6..0f1fc94e 100644 --- a/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test +++ b/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -52,7 +52,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test b/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test index 0131559d..45e366c1 100644 --- a/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test +++ b/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -52,7 +52,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/fibertoolsrs/qc/tests/main.nf.test b/modules/local/fibertoolsrs/qc/tests/main.nf.test index a63ba4ee..ebea055d 100644 --- a/modules/local/fibertoolsrs/qc/tests/main.nf.test +++ b/modules/local/fibertoolsrs/qc/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -52,7 +52,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/metaextract/tests/main.nf.test b/modules/local/metaextract/tests/main.nf.test index 8cae2607..960c18b1 100644 --- a/modules/local/metaextract/tests/main.nf.test +++ b/modules/local/metaextract/tests/main.nf.test @@ -22,7 +22,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -51,7 +51,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/vcfsplit/tests/main.nf.test b/modules/local/vcfsplit/tests/main.nf.test index 9b650ca7..c0307351 100644 --- a/modules/local/vcfsplit/tests/main.nf.test +++ b/modules/local/vcfsplit/tests/main.nf.test @@ -22,7 +22,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -51,7 +51,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 1e673224..d72eea45 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -27,7 +27,7 @@ process WAKHAN { input: tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) tuple val(meta2), path(reference) - + output: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam @@ -53,7 +53,7 @@ process WAKHAN { ${phased_vcf} \\ ${args} \\ --threads ${task.cpus} - + #micromamba run -n wakhan wakhan \ #--target-bam /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/CLAIR3/D0/D0_long_tagged_bam_prefix.bam \ #--breakpoints /staging/leuven/stg_00096/home/projects/2023_Cools_B-ALL/FINAL_DNA_ANALYSIS/Variant_calling/Severus_run2/all_SVs/severus_all.vcf \ diff --git a/modules/local/wakhan/tests/main.nf.test b/modules/local/wakhan/tests/main.nf.test index e483da03..cbbdc8dc 100644 --- a/modules/local/wakhan/tests/main.nf.test +++ b/modules/local/wakhan/tests/main.nf.test @@ -22,7 +22,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), @@ -51,7 +51,7 @@ nextflow_process { process { """ // TODO nf-core: define inputs of the process here. Example: - + input[0] = [ [ id:'test', single_end:false ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 99b4bc3f..9b204b8a 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -30,25 +30,25 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } - + // // MODULE: Index the fasta // - - SAMTOOLS_FAIDX ( + + SAMTOOLS_FAIDX ( ch_prepared_fasta, [ [:], "$projectDir/assets/dummy_file.txt" ], false ) - + ch_prepared_fai = SAMTOOLS_FAIDX.out.fai - + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) - + // // Prepare ASCAT files // - + // prepare ascat and controlfreec reference files if ( !params.skip_ascat ) { if (!ascat_alleles) allele_files = Channel.empty() @@ -83,11 +83,11 @@ workflow PREPARE_REFERENCE_FILES { emit: prepped_fasta = ch_prepared_fasta prepped_fai = ch_prepared_fai - + allele_files loci_files gc_file rt_file - + versions = ch_versions -} \ No newline at end of file +} diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 63ecc838..008a40e4 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -13,9 +13,9 @@ workflow TUMOR_ONLY_HAPPHASE { clairSTO_modelMap main: - + ch_versions = Channel.empty() - + tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model From 9c53285f4dd2fa42bb0f81f32f62a1741ea6e91c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:52:16 +0200 Subject: [PATCH 283/557] added versioning of clairsto --- modules/local/clairsto/main.nf | 9 +++++---- subworkflows/local/tumor_normal_happhase.nf | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 3ad00912..5735c6eb 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -13,10 +13,11 @@ process CLAIRSTO { tuple val(meta3), path(index) output: - tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi - tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index e209468c..45ac5844 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -103,7 +103,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Phase normals LONGPHASE_PHASE ( - normalbams_germlinevcf, + normal_bams_germlinevcf, fasta, fai ) From ec95289e64464506320365c490bb458d1420c387 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 16:52:27 +0200 Subject: [PATCH 284/557] fix ro-crate linting --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 26b1dbfc..8552e4d8 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-08-19T12:50:31+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n \nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. \n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n**1) Pre-processing:**\n\n a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\n b.\tAlignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\n c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\n d. 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 \n a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\n b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\n a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\n b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\n a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\n b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\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/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pan\u010d\u00edkov\u00e1, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\nresults\n|\n\u251c\u2500\u2500 multiqc\n\u2502\n\u251c\u2500\u2500 sample1\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumour\n\u2502 \u2502 \u2514\u2500\u2500 normal\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u2502 \u2514\u2500\u2500 clairs\n\u2502 \u2514\u2500\u2500 ascat\n\u2502\n\u2514\u2500\u2500 sample2\n \u251c\u2500\u2500 bamfiles\n \u251c\u2500\u2500 qc\n \u2502 \u251c\u2500\u2500 tumour\n \u2502 \u2514\u2500\u2500 normal\n \u251c\u2500\u2500 variants\n \u2502 \u251c\u2500\u2500 severus\n \u2502 \u2514\u2500\u2500 clairs\n \u2514\u2500\u2500 ascat\n```\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\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/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pan\u010d\u00edkov\u00e1, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\nresults\n|\n\u251c\u2500\u2500 multiqc\n\u2502\n\u251c\u2500\u2500 sample1\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumour\n\u2502 \u2502 \u2514\u2500\u2500 normal\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u2502 \u2514\u2500\u2500 clairs\n\u2502 \u2514\u2500\u2500 ascat\n\u2502\n\u2514\u2500\u2500 sample2\n \u251c\u2500\u2500 bamfiles\n \u251c\u2500\u2500 qc\n \u2502 \u251c\u2500\u2500 tumour\n \u2502 \u2514\u2500\u2500 normal\n \u251c\u2500\u2500 variants\n \u2502 \u251c\u2500\u2500 severus\n \u2502 \u2514\u2500\u2500 clairs\n \u2514\u2500\u2500 ascat\n```\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From f80f98d13c077c78911183b106fda58ba6ec6539 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 20 Aug 2025 17:21:11 +0200 Subject: [PATCH 285/557] baby change --- modules/local/clairs/tests/main.nf.test.snap | 30 +++++++------------- modules/local/clairsto/tests/main.nf.test | 2 +- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/modules/local/clairs/tests/main.nf.test.snap b/modules/local/clairs/tests/main.nf.test.snap index a7b3da39..d0f197eb 100644 --- a/modules/local/clairs/tests/main.nf.test.snap +++ b/modules/local/clairs/tests/main.nf.test.snap @@ -86,47 +86,37 @@ "bam - stub": { "content": [ [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] + ], [ - [ - { - "id": "test" - }, - "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], [ - "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.6" }, - "timestamp": "2025-04-04T11:45:37.043057294" + "timestamp": "2025-08-20T17:16:21.204921545" }, "bam - packaged_model": { "content": [ [ - "test.vcf.gz" + ], [ - "test.vcf.gz.tbi" + ], [ - "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" + ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.6" }, - "timestamp": "2025-04-04T11:20:25.090597153" + "timestamp": "2025-08-20T17:12:23.55400911" } } \ No newline at end of file diff --git a/modules/local/clairsto/tests/main.nf.test b/modules/local/clairsto/tests/main.nf.test index f15d3ed9..b58ac00a 100644 --- a/modules/local/clairsto/tests/main.nf.test +++ b/modules/local/clairsto/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_process { - name "Test Process CLAIRSTP" + name "Test Process CLAIRSTO" script "../main.nf" process "CLAIRSTO" From 244bd41aa6d2909f7175c5f6b58f82dc6622a553 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 21 Aug 2025 09:55:41 +0200 Subject: [PATCH 286/557] fix ascat --- modules/nf-core/ascat/main.nf | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 0fb5d542..366a4ba4 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -27,7 +27,7 @@ process ASCAT { tuple val(meta), path("*pdf"), emit: pdf, optional: true tuple val(meta), path("*purityploidy.txt"), emit: purityploidy tuple val(meta), path("*segments.txt"), emit: segments - tuple val(meta), path("*segments_raw.txt"), emit: segments_raw + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true path "versions.yml", emit: versions when: @@ -167,6 +167,17 @@ process ASCAT { #Write out segmented regions (including regions with one copy of each allele) write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out raw segmented regions (including regions with one copy of each allele) + tryCatch({ # In case segments_raw is not selected + write.table( + ascat.output[["segments_raw"]], + file = paste0(prefix, ".segments_raw.txt"), + sep = "\t", quote = FALSE, row.names = FALSE + ) + }, error = function(e) { + message("Error in writing segments_raw: ", conditionMessage(e)) + }) #Write out CNVs in bed format cnvs=ascat.output[["segments"]][2:6] @@ -225,4 +236,4 @@ process ASCAT { """ -} +} \ No newline at end of file From d7db137cc9998bbe07d6d7a919bf04dcbd84dbe8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 21 Aug 2025 13:59:56 +0200 Subject: [PATCH 287/557] change filter to PASS in germline vcfs out VCFSPLIT --- modules/local/vcfsplit/main.nf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 29abd98d..adbe3dc0 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -62,7 +62,6 @@ process VCFSPLIT { // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ - # Extract PASS entries from both VCF files, compress, index, and merge bcftools view -i 'FILTER="PASS"' $indel_vcf | bgzip -c > indels_pass.vcf.gz bcftools view -i 'FILTER="PASS"' $snv_vcf | bgzip -c > snv_pass.vcf.gz tabix -p vcf indels_pass.vcf.gz @@ -70,17 +69,18 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - # Extract ONLY NonSomatic entries, compress, index, and merge - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz - tabix -p vcf indels_nonsomatic.vcf.gz - tabix -p vcf snv_nonsomatic.vcf.gz - bcftools concat -a -Oz -o germline.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + # Extract NonSomatic entries from both VCFs, concat, set all FILTER columns to PASS, compress, index + bcftools concat -a $( + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf + ) | \ + awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { $7="PASS"; print }' | \ + bgzip -c > germline.vcf.gz tabix -p vcf germline.vcf.gz # Cleanup intermediate files - rm indels_pass.vcf.gz snv_pass.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz - rm indels_pass.vcf.gz.tbi snv_pass.vcf.gz.tbi indels_nonsomatic.vcf.gz.tbi snv_nonsomatic.vcf.gz.tbi + rm indels_pass.vcf.gz snv_pass.vcf.gz + rm indels_pass.vcf.gz.tbi snv_pass.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": From e2bb68c8c6e6385eaf838111187f852db08ef699 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 21 Aug 2025 14:01:13 +0200 Subject: [PATCH 288/557] clean --- modules/local/vcfsplit/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index adbe3dc0..bb53ee4c 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,7 +69,6 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - # Extract NonSomatic entries from both VCFs, concat, set all FILTER columns to PASS, compress, index bcftools concat -a $( bcftools view -i 'FILTER="NonSomatic"' $indel_vcf bcftools view -i 'FILTER="NonSomatic"' $snv_vcf From 45b703fc73dc9924afebf41739d1fd6f8118d39e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 21 Aug 2025 14:04:46 +0200 Subject: [PATCH 289/557] move clairs to subworkflow --- subworkflows/local/tumor_normal_happhase.nf | 30 ++++++++++++++++++--- workflows/lr_somatic.nf | 28 +++---------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index df00d768..f69f0e22 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -1,7 +1,8 @@ -include { CLAIR3 } from '../../modules/local/clair3/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { CLAIR3 } from '../../modules/local/clair3/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { CLAIRS } from '../../modules/local/clairs/main.nf' workflow TUMOR_NORMAL_HAPPHASE { take: @@ -9,6 +10,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta fai clair3_modelMap + clairs_modelMap main: @@ -220,6 +222,26 @@ workflow TUMOR_NORMAL_HAPPHASE { } .join(LONGPHASE_PHASE.out.vcf) .set{tumor_normal_severus} + + // Get ClairS input channel + tumor_normal_severus + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] + } + .set { clairs_input } + + // + // MODULE: CLAIRS + // + + CLAIRS ( + clairs_input, + fasta, + fai + ) + + ch_versions = ch_versions.mix(CLAIRS.out.versions) // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 9a905cb7..f14a3c49 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -15,16 +15,12 @@ include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_l // include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { CLAIRSTO } from '../modules/local/clairsto/main' -include { CLAIRS } from '../modules/local/clairs/main.nf' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' include { ASCAT } from '../modules/nf-core/ascat/main' include { CLAIR3 } from '../modules/local/clair3/main' -include { LONGPHASE_PHASE } from '../modules/nf-core/longphase/phase/main' -include { LONGPHASE_HAPLOTAG } from '../modules/nf-core/longphase/haplotag/main' include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { METAEXTRACT } from '../modules/local/metaextract/main' include { WAKHAN } from '../modules/local/wakhan/main' @@ -302,7 +298,8 @@ workflow LR_SOMATIC { branched_minimap.paired, ch_fasta, ch_fai, - clair3_modelMap + clair3_modelMap, + clairs_modelMap ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -319,7 +316,7 @@ workflow LR_SOMATIC { clairs_modelMap ) - ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + //ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus @@ -327,25 +324,6 @@ workflow LR_SOMATIC { .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - // Get ClairS input channel - TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] - } - .set { clairs_input } - - // - // MODULE: CLAIRS - // - - CLAIRS ( - clairs_input, - ch_fasta, - ch_fai - ) - - ch_versions = ch_versions.mix(CLAIRS.out.versions) // // MODULE: SEVERUS From 041b705790b3dd8cb1663ab189c6b6de23728ebd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 22 Aug 2025 10:39:42 +0200 Subject: [PATCH 290/557] adjusting test config, and fixing vcfsplit --- conf/modules.config | 4 ++-- conf/test.config | 14 ++++++++------ modules/local/vcfsplit/main.nf | 14 +++++++++----- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 122f0c8e..5843906f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -277,8 +277,8 @@ process { withName : '.*:WAKHAN' { ext.args = { [ - params.wakhan_chroms ? '--contigs ${params.wakhan_chroms}' : - (meta.sex == 'female' ? '--contigs chr1-22,chrX' : '--contigs chr1-22,chrX,chrY'), + params.wakhan_chroms ? "--contigs ${params.wakhan_chroms}" : + (meta.sex == "female" ? "--contigs chr1-22,chrX" : "--contigs chr1-22,chrX,chrY"), "--pdf-enable", ].join(' ').trim() } publishDir = [ diff --git a/conf/test.config b/conf/test.config index 5ac0797f..06d76eb7 100644 --- a/conf/test.config +++ b/conf/test.config @@ -11,11 +11,13 @@ */ process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h' - ] + withName: '.*' { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] + } } params { @@ -31,5 +33,5 @@ params { genome = "CHM13" ascat_chroms = "19" ascat_min_counts = 2 - wakhan_chroms = "19" + wakhan_chroms = "chr19" } diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index bb53ee4c..48229a81 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,11 +69,15 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools concat -a $( - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf - ) | \ - awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { $7="PASS"; print }' | \ + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz + tabix -p vcf indels_nonsomatic.vcf.gz + tabix -p vcf snv_nonsomatic.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + tabix -p vcf germline_tmp.vcf.gz + + + bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ bgzip -c > germline.vcf.gz tabix -p vcf germline.vcf.gz From 834b2cc91a554010a056d17a0f2fce34a65ae5eb Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 22 Aug 2025 14:50:28 +0200 Subject: [PATCH 291/557] fix vcf split modules --- modules/local/vcfsplit/main.nf | 16 ++++++++++------ subworkflows/local/tumor_only_happhase.nf | 7 +++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index bb53ee4c..1cca14ba 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,11 +69,15 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools concat -a $( - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf - ) | \ - awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { $7="PASS"; print }' | \ + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz + tabix -p vcf indels_nonsomatic.vcf.gz + tabix -p vcf snv_nonsomatic.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + tabix -p vcf germline_tmp.vcf.gz + + + bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ bgzip -c > germline.vcf.gz tabix -p vcf germline.vcf.gz @@ -102,4 +106,4 @@ process VCFSPLIT { vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') END_VERSIONS """ -} +} \ No newline at end of file diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index f1ee125a..c4ecefcb 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -14,6 +14,8 @@ workflow TUMOR_ONLY_HAPPHASE { main: + ch_versions = Channel.empty() + tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model @@ -37,6 +39,7 @@ workflow TUMOR_ONLY_HAPPHASE { .join(CLAIRSTO.out.snv_vcf) .set{clairsto_vcf} + ch_versions = ch_versions.mix(CLAIRSTO.out.versions) // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // indel_vcf: vcf for indels // snv_vcf: vcf for snvs @@ -50,6 +53,7 @@ workflow TUMOR_ONLY_HAPPHASE { VCFSPLIT( clairsto_vcf ) + ch_versions = ch_versions.mix(VCFSPLIT.out.versions) // Add the nonsomatic vcf info // remove model info @@ -79,6 +83,7 @@ workflow TUMOR_ONLY_HAPPHASE { fasta, fai ) + ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) // Add phased nonsomatic vcf info // remove model info @@ -108,6 +113,7 @@ workflow TUMOR_ONLY_HAPPHASE { fasta, fai ) + ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) // grab phased bams LONGPHASE_HAPLOTAG.out.bam @@ -123,6 +129,7 @@ workflow TUMOR_ONLY_HAPPHASE { SAMTOOLS_INDEX( haplotagged_bams ) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) // join information and the phased VCF file haplotagged_bams From b0e4c65ad212071375257e86c50a8f96e63c56d0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 22 Aug 2025 15:05:00 +0200 Subject: [PATCH 292/557] revert change and disable linting of schema params --- .nf-core.yml | 1 + conf/modules.config | 10 +++------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 2670a3be..fabff9ad 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,4 +1,5 @@ lint: + schema_params: false files_exist: - CODE_OF_CONDUCT.md - assets/nf-core-lr_somatic_logo_light.png diff --git a/conf/modules.config b/conf/modules.config index 11cd12d4..d8cf5042 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -134,14 +134,10 @@ process { withName: '.*:MINIMAP2_ALIGN' { ext.prefix = { "${meta.id}_mapped" } ext.args = { - def alignmentModel = meta.platform == 'pb' - ? (params.minimap2_pb_model ? "-ax ${params.minimap2_pb_model}" : "-ax map-hifi") - : (params.minimap2_ont_model ? "-ax ${params.minimap2_ont_model}" : "-ax lr:hq") - - def secondaryFlag = (params.save_secondary_alignment == true) ? "--secondary=yes" : "--secondary=no" [ - alignmentModel, - secondaryFlag, + meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : + ( params.minimap2_ont_model ? "-ax $params.minimap2_ont_model" : "-ax lr:hq " ), + params.save_secondary_alignment ? "--secondary=yes " : "--secondary=no ", "-y", "-Y" ].join(' ').trim() From eb5a7b9cee42f196f240f1447d0b2cd9b4bcd0a9 Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Fri, 22 Aug 2025 15:18:19 +0200 Subject: [PATCH 293/557] Update modules/local/vcfsplit/main.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- modules/local/vcfsplit/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 1cca14ba..832706a6 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -76,7 +76,6 @@ process VCFSPLIT { bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz tabix -p vcf germline_tmp.vcf.gz - bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ bgzip -c > germline.vcf.gz tabix -p vcf germline.vcf.gz From 63bdba958995d914b6a42f7c26cdfceb5c2d4354 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 22 Aug 2025 15:21:30 +0200 Subject: [PATCH 294/557] add versions to be emitted and fix ch_versions in lr_somatic.nf --- subworkflows/local/tumor_only_happhase.nf | 2 +- workflows/lr_somatic.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index c4ecefcb..cbc947c6 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -155,5 +155,5 @@ workflow TUMOR_ONLY_HAPPHASE { emit: tumor_only_severus - + versions = ch_versions } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 9a905cb7..3ebb43ab 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -319,7 +319,7 @@ workflow LR_SOMATIC { clairs_modelMap ) - ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus From 4fe799a9240399d6bb1f803e7d5cd5a02ae01788 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 25 Aug 2025 13:19:22 +0200 Subject: [PATCH 295/557] force empty channel --- subworkflows/local/prepare_reference_files.nf | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 372af8d9..27b6111c 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -20,6 +20,10 @@ workflow PREPARE_REFERENCE_FILES { main: ch_versions = Channel.empty() ch_prepared_fasta = Channel.empty() + allele_files = Channel.empty() + loci_files = Channel.empty() + gc_file = Channel.empty() + rt_file = Channel.empty() // Check if fasta and gtf are zipped if (fasta.endsWith('.gz')){ @@ -30,24 +34,24 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } - + // // MODULE: Index the fasta // - - SAMTOOLS_FAIDX ( + + SAMTOOLS_FAIDX ( ch_prepared_fasta, [ [:], "$projectDir/assets/dummy_file.txt" ] ) - + ch_prepared_fai = SAMTOOLS_FAIDX.out.fai - + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) - + // // Prepare ASCAT files // - + // prepare ascat and controlfreec reference files if ( !params.skip_ascat ) { if (!ascat_alleles) allele_files = Channel.empty() @@ -77,21 +81,16 @@ workflow PREPARE_REFERENCE_FILES { rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = Channel.fromPath(ascat_loci_rt).collect() - } else { - allele_files = Channel.empty() - loci_files = Channel.empty() - gc_file = Channel.empty() - rt_file = Channel.empty() } emit: prepped_fasta = ch_prepared_fasta prepped_fai = ch_prepared_fai - + allele_files loci_files gc_file rt_file - + versions = ch_versions -} \ No newline at end of file +} From 5d66a91b75c8dbec12d16ac749ecb43a9b19d328 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 25 Aug 2025 15:11:07 +0200 Subject: [PATCH 296/557] added clairsto version --- modules/local/clairsto/main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index ac2ca2a7..e75139c1 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -17,6 +17,8 @@ process CLAIRSTO { tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + when: task.ext.when == null || task.ext.when @@ -35,7 +37,7 @@ process CLAIRSTO { --output_dir . \\ $conda_prefix \\ $args \\ - + cat <<-END_VERSIONS > versions.yml From 4d66175884f8657d6503d1d0d3a55509de9b3134 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 10:22:21 +0200 Subject: [PATCH 297/557] skip wakhan in test profile --- conf/test.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/test.config b/conf/test.config index 302664fd..70edc648 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,4 +31,5 @@ params { genome = "CHM13" ascat_chroms = "19" ascat_min_counts = 2 + skip_wakhan = true } From 06b0606455c910337bdb0702921db126413703c0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 10:37:47 +0200 Subject: [PATCH 298/557] linting --- nextflow.config | 4 ++-- workflows/lr_somatic.nf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 92300327..86df4cfa 100644 --- a/nextflow.config +++ b/nextflow.config @@ -42,10 +42,10 @@ params { ascat_longread_bins = 2000 ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) - + // Wakhan options wakhan_chroms = null - + //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version // and allele/loci(/gc/rt) files. For now they need to be specified diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 936d295a..ec26cd0a 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -446,7 +446,7 @@ workflow LR_SOMATIC { // if (!params.skip_wakhan) { - + // Prepare input channel for WAKHAN severus_reformat .join(SEVERUS.out.all_vcf) From 16e3b2acf1ac0db4844201a07d4ffdcbd205f90d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 11:03:38 +0200 Subject: [PATCH 299/557] remove tests --- modules/local/clair3/tests/main.nf.test | 183 ------------------ modules/local/clair3/tests/main.nf.test.snap | 100 ---------- modules/local/cramino/tests/main.nf.test | 73 ------- .../fibertoolsrs/fire/tests/main.nf.test | 74 ------- .../nucleosomes/tests/main.nf.test | 74 ------- .../predictm6a/tests/main.nf.test | 74 ------- .../local/fibertoolsrs/qc/tests/main.nf.test | 74 ------- modules/local/metaextract/tests/main.nf.test | 73 ------- modules/local/vcfsplit/tests/main.nf.test | 73 ------- modules/local/wakhan/tests/main.nf.test | 73 ------- 10 files changed, 871 deletions(-) delete mode 100644 modules/local/clair3/tests/main.nf.test delete mode 100644 modules/local/clair3/tests/main.nf.test.snap delete mode 100644 modules/local/cramino/tests/main.nf.test delete mode 100644 modules/local/fibertoolsrs/fire/tests/main.nf.test delete mode 100644 modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test delete mode 100644 modules/local/fibertoolsrs/predictm6a/tests/main.nf.test delete mode 100644 modules/local/fibertoolsrs/qc/tests/main.nf.test delete mode 100644 modules/local/metaextract/tests/main.nf.test delete mode 100644 modules/local/vcfsplit/tests/main.nf.test delete mode 100644 modules/local/wakhan/tests/main.nf.test diff --git a/modules/local/clair3/tests/main.nf.test b/modules/local/clair3/tests/main.nf.test deleted file mode 100644 index 5ed08490..00000000 --- a/modules/local/clair3/tests/main.nf.test +++ /dev/null @@ -1,183 +0,0 @@ -nextflow_process { - - name "Test Process CLAIR3" - script "../main.nf" - process "CLAIR3" - - tag "modules" - tag "modules_nfcore" - tag "clair3" - tag "untar" - - setup { - run("UNTAR") { - script "../../../../modules/nf-core/untar/main.nf" - process { - """ - input[0] = [ - [ id:'test'], - file(params.modules_testdata_base_path + 'generic/models/clair3.hifi.tar.gz', checkIfExists: true) - ] - """ - } - } - } - test("sarscov2 - bam - user_model") { - - when { - process { - """ - def model_path = UNTAR.out.untar - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), - [], - ]) - .join(UNTAR.out.untar) - .combine(Channel.of(['hifi'])) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf.collect { file(it[1]).getName() }, - process.out.tbi.collect { file(it[1]).getName() }, - process.out.versions, - process.out.phased_vcf.collect { file(it[1]).getName() }, - process.out.phased_tbi.collect { file(it[1]).getName() }) - .match()} - ) - } - - } - - test("sarscov2 - bam - packaged_model") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), - 'hifi_revio', - [], - 'hifi', - ]) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf.collect { file(it[1]).getName() }, - process.out.tbi.collect { file(it[1]).getName() }, - process.out.versions, - process.out.phased_vcf.collect { file(it[1]).getName() }, - process.out.phased_tbi.collect { file(it[1]).getName() }) - .match()} - ) - } - - } - - test("sarscov2 - bam - both") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), - ['hifi_revio'], - ]) - .join(UNTAR.out.untar) - .combine(Channel.of(['hifi'])) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.failed } - ) - } - - } - - - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - def model_path = UNTAR.out.untar - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), - [], - ]) - .join(UNTAR.out.untar) - .combine(Channel.of(['hifi'])) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.phased_vcf, - process.out.phased_tbi, - process.out.versions) - .match()} - ) - } - - } - -} diff --git a/modules/local/clair3/tests/main.nf.test.snap b/modules/local/clair3/tests/main.nf.test.snap deleted file mode 100644 index e9b68be8..00000000 --- a/modules/local/clair3/tests/main.nf.test.snap +++ /dev/null @@ -1,100 +0,0 @@ -{ - "sarscov2 - bam - stub": { - "content": [ - [ - [ - { - "id": "test" - }, - [ - "test.merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test.phased_merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - [ - [ - { - "id": "test" - }, - [ - "test.merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.phased_merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - [ - [ - { - "id": "test" - }, - "test.phased_merge_output.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - [ - [ - { - "id": "test" - }, - "test.phased_merge_output.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - [ - "versions.yml:md5,10928c13418eced076964d86249aeaf8" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-04T09:30:51.327348" - }, - "sarscov2 - bam - packaged_model": { - "content": [ - [ - "merge_output.vcf.gz" - ], - [ - "merge_output.vcf.gz.tbi" - ], - [ - "versions.yml:md5,10928c13418eced076964d86249aeaf8" - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-04T09:30:16.61651" - }, - "sarscov2 - bam - user_model": { - "content": [ - [ - "merge_output.vcf.gz" - ], - [ - "merge_output.vcf.gz.tbi" - ], - [ - "versions.yml:md5,10928c13418eced076964d86249aeaf8" - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-04T09:29:58.640181" - } -} \ No newline at end of file diff --git a/modules/local/cramino/tests/main.nf.test b/modules/local/cramino/tests/main.nf.test deleted file mode 100644 index c142404e..00000000 --- a/modules/local/cramino/tests/main.nf.test +++ /dev/null @@ -1,73 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test cramino -nextflow_process { - - name "Test Process CRAMINO" - script "../main.nf" - process "CRAMINO" - - tag "modules" - tag "modules_" - tag "cramino" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/fibertoolsrs/fire/tests/main.nf.test b/modules/local/fibertoolsrs/fire/tests/main.nf.test deleted file mode 100644 index e930f17d..00000000 --- a/modules/local/fibertoolsrs/fire/tests/main.nf.test +++ /dev/null @@ -1,74 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test fibertoolsrs/fire -nextflow_process { - - name "Test Process FIBERTOOLSRS_FIRE" - script "../main.nf" - process "FIBERTOOLSRS_FIRE" - - tag "modules" - tag "modules_" - tag "fibertoolsrs" - tag "fibertoolsrs/fire" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test b/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test deleted file mode 100644 index 0f1fc94e..00000000 --- a/modules/local/fibertoolsrs/nucleosomes/tests/main.nf.test +++ /dev/null @@ -1,74 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test fibertoolssrs/nucleosomes -nextflow_process { - - name "Test Process FIBERTOOLSSRS_NUCLEOSOMES" - script "../main.nf" - process "FIBERTOOLSSRS_NUCLEOSOMES" - - tag "modules" - tag "modules_" - tag "fibertoolssrs" - tag "fibertoolssrs/nucleosomes" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test b/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test deleted file mode 100644 index 45e366c1..00000000 --- a/modules/local/fibertoolsrs/predictm6a/tests/main.nf.test +++ /dev/null @@ -1,74 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test fibertoolsrs/predictm6a -nextflow_process { - - name "Test Process FIBERTOOLSRS_PREDICTM6A" - script "../main.nf" - process "FIBERTOOLSRS_PREDICTM6A" - - tag "modules" - tag "modules_" - tag "fibertoolsrs" - tag "fibertoolsrs/predictm6a" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/fibertoolsrs/qc/tests/main.nf.test b/modules/local/fibertoolsrs/qc/tests/main.nf.test deleted file mode 100644 index ebea055d..00000000 --- a/modules/local/fibertoolsrs/qc/tests/main.nf.test +++ /dev/null @@ -1,74 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test fibertoolsrs/qc -nextflow_process { - - name "Test Process FIBERTOOLSRS_QC" - script "../main.nf" - process "FIBERTOOLSRS_QC" - - tag "modules" - tag "modules_" - tag "fibertoolsrs" - tag "fibertoolsrs/qc" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/metaextract/tests/main.nf.test b/modules/local/metaextract/tests/main.nf.test deleted file mode 100644 index 960c18b1..00000000 --- a/modules/local/metaextract/tests/main.nf.test +++ /dev/null @@ -1,73 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test metaextract -nextflow_process { - - name "Test Process METAEXTRACT" - script "../main.nf" - process "METAEXTRACT" - - tag "modules" - tag "modules_" - tag "metaextract" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/vcfsplit/tests/main.nf.test b/modules/local/vcfsplit/tests/main.nf.test deleted file mode 100644 index c0307351..00000000 --- a/modules/local/vcfsplit/tests/main.nf.test +++ /dev/null @@ -1,73 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test vcfsplit -nextflow_process { - - name "Test Process VCFSPLIT" - script "../main.nf" - process "VCFSPLIT" - - tag "modules" - tag "modules_" - tag "vcfsplit" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} diff --git a/modules/local/wakhan/tests/main.nf.test b/modules/local/wakhan/tests/main.nf.test deleted file mode 100644 index cbbdc8dc..00000000 --- a/modules/local/wakhan/tests/main.nf.test +++ /dev/null @@ -1,73 +0,0 @@ -// TODO nf-core: Once you have added the required tests, please run the following command to build this file: -// nf-core modules test wakhan -nextflow_process { - - name "Test Process WAKHAN" - script "../main.nf" - process "WAKHAN" - - tag "modules" - tag "modules_" - tag "wakhan" - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used - test("sarscov2 - bam") { - - // TODO nf-core: If you are created a test for a chained module - // (the module requires running more than one process to generate the required output) - // add the 'setup' method here. - // You can find more information about how to use a 'setup' method in the docs (https://nf-co.re/docs/contributing/modules#steps-for-creating-nf-test-for-chained-modules). - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - // See https://nf-co.re/docs/contributing/tutorials/nf-test_assertions for more information and examples. - ) - } - - } - - // TODO nf-core: Change the test name preferably indicating the test-data and file-format used but keep the " - stub" suffix. - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - // TODO nf-core: define inputs of the process here. Example: - - input[0] = [ - [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - //TODO nf-core: Add all required assertions to verify the test output. - ) - } - - } - -} From 2887102c6f0ec2bf350bb6ea9c02c93b93167aaa Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 11:10:58 +0200 Subject: [PATCH 300/557] remove tests --- modules/local/clairs/tests/main.nf.test | 89 ------------- modules/local/clairs/tests/main.nf.test.snap | 122 ------------------ modules/local/clairsto/tests/main.nf.test | 86 ------------ .../local/clairsto/tests/main.nf.test.snap | 32 ----- 4 files changed, 329 deletions(-) delete mode 100644 modules/local/clairs/tests/main.nf.test delete mode 100644 modules/local/clairs/tests/main.nf.test.snap delete mode 100644 modules/local/clairsto/tests/main.nf.test delete mode 100644 modules/local/clairsto/tests/main.nf.test.snap diff --git a/modules/local/clairs/tests/main.nf.test b/modules/local/clairs/tests/main.nf.test deleted file mode 100644 index 9db10ed9..00000000 --- a/modules/local/clairs/tests/main.nf.test +++ /dev/null @@ -1,89 +0,0 @@ -nextflow_process { - - name "Test Process CLAIRS" - script "../main.nf" - process "CLAIRS" - - tag "modules" - tag "modules_nfcore" - tag "clairs" - - test("bam - packaged_model") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam.bai', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), - 'hifi_revio_ssrs', - ]) - input[1] = [ - [ id:'test'], - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf.collect { file(it[1]).getName() }, - process.out.tbi.collect { file(it[1]).getName() }, - process.out.versions) - .match()} - ) - } - - } - - test("bam - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395BL_normal_chr17_demo.bam.bai', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), - 'hifi_revio_ssrs', - ]) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.versions,) - .match()} - ) - } - - } - -} diff --git a/modules/local/clairs/tests/main.nf.test.snap b/modules/local/clairs/tests/main.nf.test.snap deleted file mode 100644 index d0f197eb..00000000 --- a/modules/local/clairs/tests/main.nf.test.snap +++ /dev/null @@ -1,122 +0,0 @@ -{ - "sarscov2 - bam - packaged_model": { - "content": [ - [ - "test.vcf.gz" - ], - [ - "test.vcf.gz.tbi" - ], - [ - "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-04T11:11:15.839049" - }, - "sarscov2 - bam - stub": { - "content": [ - [ - [ - { - "id": "test" - }, - "/Users/u0155044/Documents/modules/.nf-test/tests/78916ca2ff4be4b934d0f97d43dddaa7/work/0d/d8ad17c1547262fafc3c22ee0ba901/test.vcf.gz" - ] - ], - [ - [ - { - "id": "test" - }, - "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - null, - null, - [ - "versions.yml:md5,ebc2580c096a3f5977386d12d6228c8c" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-04T11:11:32.911824" - }, - "sarscov2 - bam - user_model": { - "content": [ - [ - - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-03-18T14:07:40.253357" - }, - "sarscov2 - bam - both": { - "content": [ - [ - - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-03-18T14:07:50.758312" - }, - "bam - stub": { - "content": [ - [ - - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-08-20T17:16:21.204921545" - }, - "bam - packaged_model": { - "content": [ - [ - - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-08-20T17:12:23.55400911" - } -} \ No newline at end of file diff --git a/modules/local/clairsto/tests/main.nf.test b/modules/local/clairsto/tests/main.nf.test deleted file mode 100644 index b58ac00a..00000000 --- a/modules/local/clairsto/tests/main.nf.test +++ /dev/null @@ -1,86 +0,0 @@ -nextflow_process { - - name "Test Process CLAIRSTO" - script "../main.nf" - process "CLAIRSTO" - - tag "modules" - tag "modules_nfcore" - tag "clairsto" - - test("bam - packaged_model") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), - 'hifi_revio_ssrs', - ]) - input[1] = [ - [ id:'test'], - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/GRCh38_no_alt_chr17.fa.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf.collect { file(it[1]).getName() }, - process.out.tbi.collect { file(it[1]).getName() }, - process.out.versions) - .match()} - ) - } - - } - - test("bam - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam', checkIfExists: true), - file('http://www.bio8.cs.hku.hk/clairs/quick_demo/pacbio_hifi/HCC1395_tumor_chr17_demo.bam.bai', checkIfExists: true), - 'hifi_revio_ssrs', - ]) - input[1] = [ - [ id:'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta', checkIfExists: true), - ] - input[2] = [ - [ id: 'test'], - file(params.modules_testdata_base_path + '/genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.phased_vcf, - process.out.phased_tbi, - process.out.versions,) - .match()} - ) - } - - } -} diff --git a/modules/local/clairsto/tests/main.nf.test.snap b/modules/local/clairsto/tests/main.nf.test.snap deleted file mode 100644 index 253bcf17..00000000 --- a/modules/local/clairsto/tests/main.nf.test.snap +++ /dev/null @@ -1,32 +0,0 @@ -{ - "bam - stub": { - "content": [ - null, - null, - null, - null, - null - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" - }, - "timestamp": "2025-04-04T13:57:26.590547195" - }, - "bam - packaged_model": { - "content": [ - [ - - ], - [ - - ], - null - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" - }, - "timestamp": "2025-04-04T13:57:14.452606576" - } -} \ No newline at end of file From 9f6c4db8aa51699a87317c6ecbed2f2f2085279e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 11:42:36 +0200 Subject: [PATCH 301/557] fix docker url --- modules/local/clair3/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 729e1d85..2a205297 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,7 +4,7 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clair3:v1.0.10': + 'hkubal/clair3:v1.0.10': 'hkubal/clair3:v1.0.10' }" input: From 9222ed520957cd67236f1bcd176fc22ff7750d33 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 12:59:09 +0200 Subject: [PATCH 302/557] fix docker url --- modules/local/clair3/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 2a205297..ecae17ff 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,8 +4,8 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'hkubal/clair3:v1.0.10': - 'hkubal/clair3:v1.0.10' }" + 'docker://hkubal/clair3:v1.0.10': + 'docker://hkubal/clair3:v1.0.10' }" input: tuple val(meta), path(bam), path(bai), val(packaged_model), path(user_model), val(platform) From 486e9b16bfebda5381bea2ac43e6e6ec91742b33 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 13:09:13 +0200 Subject: [PATCH 303/557] clair3 biocontainers and version update --- modules/local/clair3/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index ecae17ff..5b21fc74 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,8 +4,8 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker://hkubal/clair3:v1.0.10': - 'docker://hkubal/clair3:v1.0.10' }" + 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': + 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0' }" input: tuple val(meta), path(bam), path(bai), val(packaged_model), path(user_model), val(platform) From 84670734b7e03cd3d8b8c074ca5d71c5e3167734 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 28 Aug 2025 13:30:45 +0200 Subject: [PATCH 304/557] fix clair3 model --- modules/local/clair3/main.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 5b21fc74..2273aa6d 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,7 +4,7 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': + 'https://depot.galaxyproject.org/singularity/clair3:1.2.0--py310h779eee5_0': 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0' }" input: @@ -43,9 +43,6 @@ process CLAIR3 { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - wget ${download_prefix}/${packaged_model}.tar.gz - tar -xvzf ${model}.tar.gz - run_clair3.sh \\ --bam_fn=$bam \\ --ref_fn=$reference \\ From f73ab3ab92f409d0c0fc314fbce0d2f526865453 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 28 Aug 2025 15:27:07 +0200 Subject: [PATCH 305/557] fix clair3 downloading --- modules.json | 96 ++++------- modules/local/clair3/main.nf | 25 +-- modules/nf-core/untar/environment.yml | 12 ++ modules/nf-core/untar/main.nf | 84 ++++++++++ modules/nf-core/untar/meta.yml | 57 +++++++ modules/nf-core/untar/tests/main.nf.test | 85 ++++++++++ modules/nf-core/untar/tests/main.nf.test.snap | 158 ++++++++++++++++++ modules/nf-core/wget/environment.yml | 7 + modules/nf-core/wget/main.nf | 48 ++++++ modules/nf-core/wget/meta.yml | 52 ++++++ modules/nf-core/wget/tests/main.nf.test | 62 +++++++ modules/nf-core/wget/tests/main.nf.test.snap | 70 ++++++++ modules/nf-core/wget/tests/nextflow.config | 6 + subworkflows/local/prepare_reference_files.nf | 28 ++++ subworkflows/local/tumor_normal_happhase.nf | 30 ++-- workflows/lr_somatic.nf | 8 +- 16 files changed, 730 insertions(+), 98 deletions(-) create mode 100644 modules/nf-core/untar/environment.yml create mode 100644 modules/nf-core/untar/main.nf create mode 100644 modules/nf-core/untar/meta.yml create mode 100644 modules/nf-core/untar/tests/main.nf.test create mode 100644 modules/nf-core/untar/tests/main.nf.test.snap create mode 100644 modules/nf-core/wget/environment.yml create mode 100644 modules/nf-core/wget/main.nf create mode 100644 modules/nf-core/wget/meta.yml create mode 100644 modules/nf-core/wget/tests/main.nf.test create mode 100644 modules/nf-core/wget/tests/main.nf.test.snap create mode 100644 modules/nf-core/wget/tests/nextflow.config diff --git a/modules.json b/modules.json index 01dca2d8..709f122d 100644 --- a/modules.json +++ b/modules.json @@ -8,123 +8,99 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "c70357ea249a541df53dd5b479b3c32b0c26c4d2", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "b13f07be4c508d6ff6312d354d09f2493243e208", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "2d20463181b1c38981a02e90d3084b5f9fa8d540", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] + }, + "untar": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] + }, + "wget": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] } } }, @@ -133,33 +109,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "763d4b5c05ffda3ac1ac969dc67f7458cfb2eb1d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 729e1d85..961e3b9f 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -8,7 +8,7 @@ process CLAIR3 { 'hkubal/clair3:v1.0.10' }" input: - tuple val(meta), path(bam), path(bai), val(packaged_model), path(user_model), val(platform) + tuple val(meta), path(bam), path(bai), path(model), val(platform) tuple val(meta2), path(reference) tuple val(meta3), path(index) @@ -23,29 +23,10 @@ process CLAIR3 { task.ext.when == null || task.ext.when script: - def model = packaged_model - //if (!user_model) { - // if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - // model = "\${CONDA_PREFIX}/bin/models/${packaged_model}" - // } - // else { - // model = "/usr/local/bin/models/$packaged_model" - // } - //} - //if (!packaged_model) { - // model = "$user_model" - //} - //if (packaged_model && user_model) { - // error "Two models specified $user_model and $packaged_model, specify one of them." - //} - // TODO: fix the channel structure so you don't have to do this - def download_prefix = ( model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - wget ${download_prefix}/${packaged_model}.tar.gz - tar -xvzf ${model}.tar.gz - run_clair3.sh \\ --bam_fn=$bam \\ --ref_fn=$reference \\ @@ -75,4 +56,4 @@ process CLAIR3 { clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') END_VERSIONS """ -} +} \ No newline at end of file diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml new file mode 100644 index 00000000..9b926b1f --- /dev/null +++ b/modules/nf-core/untar/environment.yml @@ -0,0 +1,12 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf new file mode 100644 index 00000000..e712ebe6 --- /dev/null +++ b/modules/nf-core/untar/main.nf @@ -0,0 +1,84 @@ +process UNTAR { + tag "${archive}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) + + """ + mkdir ${prefix} + + ## Ensures --strip-components only applied when top level of tar contents is a directory + ## If just files or multiple directories, place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + tar \\ + -C ${prefix} --strip-components 1 \\ + -xavf \\ + ${args} \\ + ${archive} \\ + ${args2} + else + tar \\ + -C ${prefix} \\ + -xavf \\ + ${args} \\ + ${archive} \\ + ${args2} + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: (meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) + """ + mkdir ${prefix} + ## Dry-run untaring the archive to get the files and place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch \${i} + else + mkdir -p \${i} + fi + done + else + for i in `tar -tf ${archive}`; + do + if [[ \$(echo "\${i}" | grep -E "/\$") == "" ]]; + then + touch ${prefix}/\${i} + else + mkdir -p ${prefix}/\${i} + fi + done + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml new file mode 100644 index 00000000..1b6bf491 --- /dev/null +++ b/modules/nf-core/untar/meta.yml @@ -0,0 +1,57 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress + - extract +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" + ontologies: + - edam: http://edamontology.org/format_3981 # TAR format + - edam: http://edamontology.org/format_3989 # GZIP format +output: + untar: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + - ${prefix}: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*/" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test new file mode 100644 index 00000000..c957517a --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test @@ -0,0 +1,85 @@ +nextflow_process { + + name "Test Process UNTAR" + script "../main.nf" + process "UNTAR" + tag "modules" + tag "modules_nfcore" + tag "untar" + + test("test_untar") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles") { + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } + + test("test_untar_onlyfiles - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap new file mode 100644 index 00000000..ceb91b79 --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -0,0 +1,158 @@ +{ + "test_untar_onlyfiles": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:28.231047" + }, + "test_untar_onlyfiles - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:45.773103" + }, + "test_untar - stub": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:36.777441" + }, + "test_untar": { + "content": [ + { + "0": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "1": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ], + "untar": [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ], + "versions": [ + "versions.yml:md5,6063247258c56fd271d076bb04dd7536" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-10T12:04:19.377674" + } +} \ No newline at end of file diff --git a/modules/nf-core/wget/environment.yml b/modules/nf-core/wget/environment.yml new file mode 100644 index 00000000..9eb304e5 --- /dev/null +++ b/modules/nf-core/wget/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::wget=1.21.4 diff --git a/modules/nf-core/wget/main.nf b/modules/nf-core/wget/main.nf new file mode 100644 index 00000000..9bc6f151 --- /dev/null +++ b/modules/nf-core/wget/main.nf @@ -0,0 +1,48 @@ +process WGET { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/3b/3b54fa9135194c72a18d00db6b399c03248103f87e43ca75e4b50d61179994b3/data': + 'community.wave.seqera.io/library/wget:1.21.4--8b0fcde81c17be5e' }" + + input: + tuple val(meta), val(url) + + output: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: 'html' + """ + wget \\ + -O - \\ + $args \\ + $url \\ + > ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wget: \$(wget --version | head -1 | cut -d ' ' -f 3) + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: 'html' + """ + touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + wget: \$(wget --version | head -1 | cut -d ' ' -f 3) + END_VERSIONS + """ +} diff --git a/modules/nf-core/wget/meta.yml b/modules/nf-core/wget/meta.yml new file mode 100644 index 00000000..56df0af1 --- /dev/null +++ b/modules/nf-core/wget/meta.yml @@ -0,0 +1,52 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "wget" +description: The non-interactive network downloader +keywords: + - "wget" + - "download" + - "network" +tools: + - "wget": + description: "wget is a free utility for non-interactive download of files from + the Web." + homepage: "https://www.gnu.org/software/wget/" + documentation: "https://www.gnu.org/software/wget/manual/wget.html" + licence: ["GPL"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - url: + type: string + description: URL to download + pattern: "^https?://*.*" + +output: + outfile: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - ${prefix}.${suffix}: + type: file + description: Downloaded file + pattern: "*.*" + + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@itrujnara" +maintainers: + - "@itrujnara" diff --git a/modules/nf-core/wget/tests/main.nf.test b/modules/nf-core/wget/tests/main.nf.test new file mode 100644 index 00000000..e0942885 --- /dev/null +++ b/modules/nf-core/wget/tests/main.nf.test @@ -0,0 +1,62 @@ +// nf-core modules test wget +nextflow_process { + + name "Test Process WGET" + script "../main.nf" + process "WGET" + + tag "modules" + tag "modules_nfcore" + tag "wget" + + test("sarscov2 - gff") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + "https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/modules/data/genomics/sarscov2/genome/genome.gff3", + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - gff - stub") { + + options "-stub" + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + "https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/modules/data/genomics/sarscov2/genome/genome.gff3", + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/wget/tests/main.nf.test.snap b/modules/nf-core/wget/tests/main.nf.test.snap new file mode 100644 index 00000000..6c051601 --- /dev/null +++ b/modules/nf-core/wget/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "sarscov2 - gff": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.gff3:md5,357435a81a9981a0128e840ebe11051e" + ] + ], + "1": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ], + "outfile": [ + [ + { + "id": "test" + }, + "test.gff3:md5,357435a81a9981a0128e840ebe11051e" + ] + ], + "versions": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.4" + }, + "timestamp": "2025-03-26T12:27:32.67617" + }, + "sarscov2 - gff - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ], + "outfile": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gff3:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,a747f72db5fc051f64676a0ba6f32f35" + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.4" + }, + "timestamp": "2025-03-26T12:21:06.414955" + } +} \ No newline at end of file diff --git a/modules/nf-core/wget/tests/nextflow.config b/modules/nf-core/wget/tests/nextflow.config new file mode 100644 index 00000000..236f4e17 --- /dev/null +++ b/modules/nf-core/wget/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: "WGET" { + ext.prefix = "test" + ext.suffix = "gff3" + } +} diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 27b6111c..8510b356 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -8,6 +8,8 @@ include { UNZIP as UNZIP_ALLELES } from '../../modules/nf-core/unzip/mai include { UNZIP as UNZIP_GC } from '../../modules/nf-core/unzip/main' include { UNZIP as UNZIP_LOCI } from '../../modules/nf-core/unzip/main' include { UNZIP as UNZIP_RT } from '../../modules/nf-core/unzip/main' +include { UNTAR } from '../../modules/nf-core/untar/main' +include { WGET } from '../../modules/nf-core/wget/main' workflow PREPARE_REFERENCE_FILES { take: @@ -16,6 +18,7 @@ workflow PREPARE_REFERENCE_FILES { ascat_loci ascat_loci_gc ascat_loci_rt + basecall_meta main: ch_versions = Channel.empty() @@ -35,6 +38,30 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } + + basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> + def meta_new = [id: basecall_model_meta] + def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + def url = "${download_prefix}/${basecall_model_meta}.tar.gz" + return [ meta_new, url ] + } + .set{ model_urls } + + WGET ( + model_urls + ) + + ch_versions = ch_versions.mix(WGET.out.versions) + + + UNTAR ( + WGET.out.outfile + ) + + ch_versions = ch_versions.mix(UNTAR.out.versions) + + WGET.out.outfile.set{ downloaded_model_files } + // // MODULE: Index the fasta // @@ -91,6 +118,7 @@ workflow PREPARE_REFERENCE_FILES { loci_files gc_file rt_file + downloaded_model_files versions = ch_versions } diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index df00d768..a4b5e24d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -9,6 +9,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta fai clair3_modelMap + downloaded_model_files main: @@ -24,25 +25,34 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later - mixed_bams.normal + + downloaded_model_files + .map{ meta, file -> + def basecall_model = meta.id + return [meta, basecall_model, file] + } + .set{downloaded_model_files} + + mixed_bams.normal .map{ meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - basecall_model: meta.basecall_model] - def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model + def basecall_model = meta.basecall_model + return [ meta, basecall_model, bam, bai ] + } + .set { normal_bams_model } + + normal_bams_model + .combine(downloaded_model_files, by: 1) + .map{ meta, basecall_model, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" - return[new_meta, bam, bai, clair3_model, [], platform] + return [meta, bam, bai, model, platform] } + .view() .set{normal_bams} // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files // clair3_model: clair3 model name - // user_model: user-defined model path (empty) // platform: name of sequencing platform diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 936d295a..6250b8b8 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -162,13 +162,16 @@ workflow LR_SOMATIC { params.ascat_allele_files, params.ascat_loci_files, params.ascat_gc_files, - params.ascat_rt_files + params.ascat_rt_files, + basecall_meta ) ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + downloaded_model_files = PREPARE_REFERENCE_FILES.out.downloaded_model_files + // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files loci_files = PREPARE_REFERENCE_FILES.out.loci_files @@ -302,7 +305,8 @@ workflow LR_SOMATIC { branched_minimap.paired, ch_fasta, ch_fai, - clair3_modelMap + clair3_modelMap, + downloaded_model_files ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) From 23d5b8a460dbc88762498e8c289b49a5674d0c8a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 10:26:55 +0200 Subject: [PATCH 306/557] add view --- subworkflows/local/tumor_normal_happhase.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a4b5e24d..eda78dbd 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -31,6 +31,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def basecall_model = meta.id return [meta, basecall_model, file] } + .view() .set{downloaded_model_files} mixed_bams.normal @@ -38,6 +39,7 @@ workflow TUMOR_NORMAL_HAPPHASE { def basecall_model = meta.basecall_model return [ meta, basecall_model, bam, bai ] } + .view() .set { normal_bams_model } normal_bams_model From d3496138abccdb3b93276342a4a34def79276427 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 10:41:59 +0200 Subject: [PATCH 307/557] change combine --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index eda78dbd..cf3e7460 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -43,7 +43,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .set { normal_bams_model } normal_bams_model - .combine(downloaded_model_files, by: 1) + .join(downloaded_model_files, by: 1) .map{ meta, basecall_model, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" return [meta, bam, bai, model, platform] From 0d545d35ac34dfab664de3d2ca89c9ae380cdd0d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 10:46:25 +0200 Subject: [PATCH 308/557] change structure --- subworkflows/local/tumor_normal_happhase.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index cf3e7460..7e1229e7 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -29,7 +29,7 @@ workflow TUMOR_NORMAL_HAPPHASE { downloaded_model_files .map{ meta, file -> def basecall_model = meta.id - return [meta, basecall_model, file] + return [basecall_model, meta, file] } .view() .set{downloaded_model_files} @@ -37,18 +37,18 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = meta.basecall_model - return [ meta, basecall_model, bam, bai ] + return [ basecall_model, meta, bam, bai ] } .view() .set { normal_bams_model } normal_bams_model - .join(downloaded_model_files, by: 1) - .map{ meta, basecall_model, bam, bai, meta2, model -> + .join(downloaded_model_files) + .view() + .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" return [meta, bam, bai, model, platform] } - .view() .set{normal_bams} // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] From 657f405aa8a2cc9112f005bbb536b427cfeb083f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:04:31 +0200 Subject: [PATCH 309/557] add conf, fix channel --- conf/modules.config | 7 +++++++ subworkflows/local/prepare_reference_files.nf | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 5843906f..7863605a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -287,4 +287,11 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName : '.*:UNTAR' { + } + + withName : '.*:WGET' { + ext.suffix = { "tar.gz" } + } } diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 8510b356..43529b4e 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -60,7 +60,7 @@ workflow PREPARE_REFERENCE_FILES { ch_versions = ch_versions.mix(UNTAR.out.versions) - WGET.out.outfile.set{ downloaded_model_files } + UNTAR.out.untar.set { downloaded_model_files } // // MODULE: Index the fasta From 0956592bede9008c34c5f688931dcd2c99f79f8f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:10:08 +0200 Subject: [PATCH 310/557] fix --- conf/modules.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7863605a..38fa48c6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -288,9 +288,6 @@ process { ] } - withName : '.*:UNTAR' { - } - withName : '.*:WGET' { ext.suffix = { "tar.gz" } } From 937926f6e0eea94eaad95b74ba8949fb900d1bec Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:15:45 +0200 Subject: [PATCH 311/557] flatten --- subworkflows/local/prepare_reference_files.nf | 1 + subworkflows/local/tumor_normal_happhase.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 43529b4e..abab2670 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -45,6 +45,7 @@ workflow PREPARE_REFERENCE_FILES { def url = "${download_prefix}/${basecall_model_meta}.tar.gz" return [ meta_new, url ] } + .unique() .set{ model_urls } WGET ( diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 7e1229e7..b0875fce 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -43,7 +43,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .set { normal_bams_model } normal_bams_model - .join(downloaded_model_files) + .combine(downloaded_model_files,by:0) .view() .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" From a87dfefed1a05ccefa8355137e9715b9b50f1e35 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:19:46 +0200 Subject: [PATCH 312/557] Update subworkflows/local/tumor_normal_happhase.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index b0875fce..c4928aea 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -44,7 +44,6 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams_model .combine(downloaded_model_files,by:0) - .view() .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" return [meta, bam, bai, model, platform] From 686cd24edb6984ffd47f4be9928ee7e96af6fb88 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:19:56 +0200 Subject: [PATCH 313/557] Update subworkflows/local/tumor_normal_happhase.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c4928aea..8bae22f2 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -31,7 +31,6 @@ workflow TUMOR_NORMAL_HAPPHASE { def basecall_model = meta.id return [basecall_model, meta, file] } - .view() .set{downloaded_model_files} mixed_bams.normal From 8b84493474adfcddb2e6a23a2a6cfac321394845 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 11:20:02 +0200 Subject: [PATCH 314/557] Update subworkflows/local/tumor_normal_happhase.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 8bae22f2..66b6a122 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -38,7 +38,6 @@ workflow TUMOR_NORMAL_HAPPHASE { def basecall_model = meta.basecall_model return [ basecall_model, meta, bam, bai ] } - .view() .set { normal_bams_model } normal_bams_model From eda1299cb326b2440220c73dd73c44590818cd16 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 13:17:33 +0200 Subject: [PATCH 315/557] minor additions to clair3 model fix branch --- conf/modules.config | 3 +++ subworkflows/local/prepare_reference_files.nf | 16 ++++++++++++---- workflows/lr_somatic.nf | 5 +---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 38fa48c6..4ac8944c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -290,5 +290,8 @@ process { withName : '.*:WGET' { ext.suffix = { "tar.gz" } + publishDir = [ + enabled: false + ] } } diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index abab2670..630e9b96 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -8,8 +8,8 @@ include { UNZIP as UNZIP_ALLELES } from '../../modules/nf-core/unzip/mai include { UNZIP as UNZIP_GC } from '../../modules/nf-core/unzip/main' include { UNZIP as UNZIP_LOCI } from '../../modules/nf-core/unzip/main' include { UNZIP as UNZIP_RT } from '../../modules/nf-core/unzip/main' -include { UNTAR } from '../../modules/nf-core/untar/main' -include { WGET } from '../../modules/nf-core/wget/main' +include { UNTAR } from '../../modules/nf-core/untar/main' +include { WGET } from '../../modules/nf-core/wget/main' workflow PREPARE_REFERENCE_FILES { take: @@ -47,13 +47,21 @@ workflow PREPARE_REFERENCE_FILES { } .unique() .set{ model_urls } - - WGET ( + + // + // MODULE: Download model + // + + WGET ( model_urls ) ch_versions = ch_versions.mix(WGET.out.versions) + // + // + // MODULE: Untar model + // UNTAR ( WGET.out.outfile diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 6250b8b8..ee75a0a9 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -178,9 +178,6 @@ workflow LR_SOMATIC { gc_file = PREPARE_REFERENCE_FILES.out.gc_file rt_file = PREPARE_REFERENCE_FILES.out.rt_file - - ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) - // // MODULE: FIBERTOOLSRS_PREDICTM6A // @@ -450,7 +447,7 @@ workflow LR_SOMATIC { // if (!params.skip_wakhan) { - + // Prepare input channel for WAKHAN severus_reformat .join(SEVERUS.out.all_vcf) From b041410144b52d7de377a76977b769afe75b916e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 13:20:13 +0200 Subject: [PATCH 316/557] added untar in module config --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 4ac8944c..11151d2d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -294,4 +294,10 @@ process { enabled: false ] } + + withName : '.*:UNTAR' { + publishDir = [ + enabled: false + ] + } } From 2a5c61ee429b3fe1a2dfaa0f03247f2ffae516f2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 13:56:32 +0200 Subject: [PATCH 317/557] prettier --- modules/local/clair3/main.nf | 2 +- subworkflows/local/tumor_normal_happhase.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 33d0ff8f..85d793fa 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -56,4 +56,4 @@ process CLAIR3 { clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') END_VERSIONS """ -} \ No newline at end of file +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d7e07337..b9d78f5f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -27,7 +27,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // remove type from so that information can be merged easier later downloaded_model_files - .map{ meta, file -> + .map{ meta, file -> def basecall_model = meta.id return [basecall_model, meta, file] } From cf5756c4f66a9573bb1770f675035ea3dbef44d4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 13:57:32 +0200 Subject: [PATCH 318/557] fix channel --- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 66b6a122..969cb3d4 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -92,7 +92,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(CLAIR3.out.vcf) - .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> + .map { meta, bam, bai, clair3_model, platform, vcf -> def svs = [] def mods = [] return [meta, bam, bai, vcf, svs, mods] @@ -126,7 +126,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(LONGPHASE_PHASE.out.vcf) - .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> + .map { meta, bam, bai, clair3_model, platform, vcf -> def new_meta = meta + [type: "normal"] def snvs = [] def mods = [] From a9349a54c6ea24459657e203b9409f79fb1aa116 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 14:23:16 +0200 Subject: [PATCH 319/557] fix clair3 naming --- subworkflows/local/tumor_normal_happhase.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 969cb3d4..6f409666 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -44,6 +44,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .combine(downloaded_model_files,by:0) .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" + def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) return [meta, bam, bai, model, platform] } .set{normal_bams} From de482fc95b1264205ae884e55b07a3f94ca88017 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 14:38:12 +0200 Subject: [PATCH 320/557] fix download url --- subworkflows/local/prepare_reference_files.nf | 4 +++- workflows/lr_somatic.nf | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 630e9b96..d22e5612 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -19,6 +19,7 @@ workflow PREPARE_REFERENCE_FILES { ascat_loci_gc ascat_loci_rt basecall_meta + clair3_modelMap main: ch_versions = Channel.empty() @@ -41,8 +42,9 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] + def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) - def url = "${download_prefix}/${basecall_model_meta}.tar.gz" + def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] } .unique() diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index ee75a0a9..ba6eb0cd 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -163,7 +163,8 @@ workflow LR_SOMATIC { params.ascat_loci_files, params.ascat_gc_files, params.ascat_rt_files, - basecall_meta + basecall_meta, + clair3_modelMap ) ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) From ffe9068bc9cc2e90e6260796f63a62d7d836da61 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 15:06:35 +0200 Subject: [PATCH 321/557] Fix naming --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 6f409666..38753604 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -44,7 +44,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .combine(downloaded_model_files,by:0) .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" - def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) + def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model return [meta, bam, bai, model, platform] } .set{normal_bams} From 4c6570564ad12bab7455acd9b886fce47c15fb63 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 15:13:17 +0200 Subject: [PATCH 322/557] clair fixes --- subworkflows/local/prepare_reference_files.nf | 19 +++++++++---------- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- workflows/lr_somatic.nf | 3 ++- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index d66947d3..bb59344b 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -19,6 +19,7 @@ workflow PREPARE_REFERENCE_FILES { ascat_loci_gc ascat_loci_rt basecall_meta + clair3_modelMap main: ch_versions = Channel.empty() @@ -38,27 +39,25 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } - - basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> + basecall_meta + .map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] + def model = clair3_modelMap.get(basecall_model_meta) def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) - def url = "${download_prefix}/${basecall_model_meta}.tar.gz" + def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] - } - .unique() - .set{ model_urls } + } + .unique() + .set{ model_urls } // // MODULE: Download model // - WGET ( - model_urls - ) + WGET ( model_urls ) ch_versions = ch_versions.mix(WGET.out.versions) - // // // MODULE: Untar model // diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c7ea862e..68fb1643 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -92,7 +92,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(CLAIR3.out.vcf) - .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> + .map { meta, bam, bai, model, platform, vcf -> def svs = [] def mods = [] return [meta, bam, bai, vcf, svs, mods] @@ -126,7 +126,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(LONGPHASE_PHASE.out.vcf) - .map { meta, bam, bai, clair3_model, user_model, platform, vcf -> + .map { meta, bam, bai, model, platform, vcf -> def new_meta = meta + [type: "normal"] def snvs = [] def mods = [] diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d40ee5c4..81fe37b5 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -159,7 +159,8 @@ workflow LR_SOMATIC { params.ascat_loci_files, params.ascat_gc_files, params.ascat_rt_files, - basecall_meta + basecall_meta, + clair3_modelMap ) ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) From c7b152a73ce1aaf3168e5407638c08d2a37ecc75 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 15:19:55 +0200 Subject: [PATCH 323/557] fix preprare_references structure --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 56b218ea..73bee468 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -42,7 +42,7 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta .map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] - def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) + def model = clair3_modelMap.get(basecall_model_meta.toString().trim()) def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] From 51c83bc92401c87c7899b0566f906685140fd03d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 15:38:57 +0200 Subject: [PATCH 324/557] fix channel --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 38753604..b1285dc7 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -44,7 +44,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .combine(downloaded_model_files,by:0) .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" - def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model.toString().trim()) : meta.clair3_model + def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model) : meta.clair3_model return [meta, bam, bai, model, platform] } .set{normal_bams} From e8842ca644c5237341e34fec146d98c8dd8c5dcb Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 15:46:08 +0200 Subject: [PATCH 325/557] fix model name --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index d22e5612..927bcefb 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -43,7 +43,7 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) - def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + def download_prefix = ( meta.basecall_model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] } From 1e50377b6ec8940389b2d449c799712a532fcf78 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 15:53:50 +0200 Subject: [PATCH 326/557] fix channels --- subworkflows/local/prepare_reference_files.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 927bcefb..85710c63 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,11 +39,11 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } - + basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] - def model = clair3_modelMap.get(meta.basecall_model.toString().trim()) - def download_prefix = ( meta.basecall_model == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) + def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model + def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] } From 402cd4b6813c8fb44c25c710390927800164efe3 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 15:59:19 +0200 Subject: [PATCH 327/557] fix naming --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 85710c63..93f16be3 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -42,7 +42,7 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] - def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model + def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] From 868928bdc21fcb92736d0f52eba4bb81e2f404f6 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 16:01:31 +0200 Subject: [PATCH 328/557] channel structure fixes --- conf/modules.config | 2 +- subworkflows/local/tumor_normal_happhase.nf | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 32791625..63614847 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -202,7 +202,7 @@ process { } withName: '.*:LONGPHASE_HAPLOTAG' { - ext.prefix = { "${meta.id}_${meta_type}" } + ext.prefix = { "${meta.id}_${meta.type}" } publishDir = [ path: { "${params.outdir}/${meta.id}/bamfiles" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f09ac7b6..fd5b8bf2 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -37,7 +37,13 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = meta.basecall_model - return [ basecall_model, meta, bam, bai ] + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + basecall_model: meta.basecall_model] + return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } @@ -145,7 +151,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams - + tumor_bams.view() tumor_bams .join(LONGPHASE_PHASE.out.vcf) .map { meta, bam, bai, vcf -> @@ -156,7 +162,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .mix(normal_bams) .set{ mixed_bams_vcf } - // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -168,7 +173,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: LONGPHASE_HAPLOTAG // // haplotag tumor and normal bams with normal vcf files for both - LONGPHASE_HAPLOTAG ( mixed_bams_vcf, fasta, @@ -215,7 +219,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - return[new_meta , [[type: meta.type], hapbam], [[type: meta.type], hapbai]] + return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } .groupTuple() .map{ meta, bam, bai -> From cff8b03c547af88565210444b94fa01779c64bab Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 16:05:58 +0200 Subject: [PATCH 329/557] remove view --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index fd5b8bf2..35dec3fb 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -151,7 +151,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams - tumor_bams.view() tumor_bams .join(LONGPHASE_PHASE.out.vcf) .map { meta, bam, bai, vcf -> From 6c40391f48124a7f63a02dbd3a8d34c284f2784c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 29 Aug 2025 17:26:24 +0200 Subject: [PATCH 330/557] added clairsmodelmap --- subworkflows/local/tumor_normal_happhase.nf | 3 ++- workflows/lr_somatic.nf | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 35dec3fb..6e2293ac 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -10,6 +10,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta fai clair3_modelMap + clairs_modelMap downloaded_model_files main: @@ -236,7 +237,7 @@ workflow TUMOR_NORMAL_HAPPHASE { tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, model] } .set { clairs_input } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 81fe37b5..4f75fdcf 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -300,6 +300,7 @@ workflow LR_SOMATIC { ch_fasta, ch_fai, clair3_modelMap, + clairs_modelMap, downloaded_model_files ) From 4fbbaa91aecac7ac35a7f11297aea20c3d0bc5c5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 1 Sep 2025 10:23:58 +0200 Subject: [PATCH 331/557] add brackets --- subworkflows/local/prepare_reference_files.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 089e9588..494c5e32 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -51,6 +51,7 @@ workflow PREPARE_REFERENCE_FILES { } .unique() .set{ model_urls } + } // // MODULE: Download model From 6bde8da5b944dbd5f25de494ca38a0968295b9e6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 1 Sep 2025 10:27:09 +0200 Subject: [PATCH 332/557] fix merge artifacts --- subworkflows/local/prepare_reference_files.nf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 494c5e32..98822fae 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -41,8 +41,6 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - basecall_meta - .map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) @@ -51,7 +49,7 @@ workflow PREPARE_REFERENCE_FILES { } .unique() .set{ model_urls } - } + // // MODULE: Download model From 624b83e48f8ec8b97886f7e40b8a3df6941d5b27 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 1 Sep 2025 16:02:47 +0200 Subject: [PATCH 333/557] linting --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 98822fae..7220a51a 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,7 +39,7 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } - + basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model From c2021695b85914a35f30f652cabf61caef062e8c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 14:20:44 +0200 Subject: [PATCH 334/557] Add vep --- conf/modules.config | 22 +++ .../nf-core/ensemblvep/vep/environment.yml | 7 + modules/nf-core/ensemblvep/vep/main.nf | 77 ++++++++++ modules/nf-core/ensemblvep/vep/meta.yml | 136 ++++++++++++++++++ .../nf-core/ensemblvep/vep/tests/main.nf.test | 86 +++++++++++ .../ensemblvep/vep/tests/main.nf.test.snap | 28 ++++ .../ensemblvep/vep/tests/nextflow.config | 5 + .../ensemblvep/vep/tests/tab.gz.config | 5 + .../nf-core/ensemblvep/vep/tests/vcf.config | 5 + subworkflows/local/tumor_normal_happhase.nf | 55 ++++++- subworkflows/local/tumor_only_happhase.nf | 23 +++ workflows/lr_somatic.nf | 1 - 12 files changed, 444 insertions(+), 6 deletions(-) create mode 100644 modules/nf-core/ensemblvep/vep/environment.yml create mode 100644 modules/nf-core/ensemblvep/vep/main.nf create mode 100644 modules/nf-core/ensemblvep/vep/meta.yml create mode 100644 modules/nf-core/ensemblvep/vep/tests/main.nf.test create mode 100644 modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap create mode 100644 modules/nf-core/ensemblvep/vep/tests/nextflow.config create mode 100644 modules/nf-core/ensemblvep/vep/tests/tab.gz.config create mode 100644 modules/nf-core/ensemblvep/vep/tests/vcf.config diff --git a/conf/modules.config b/conf/modules.config index 63614847..eb8aff02 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -301,4 +301,26 @@ process { enabled: false ] } + withName : '.*:SOMATIC_VEP' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName : '.*:GERMLINE_VEP' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName : '.*:SV_VEP' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } diff --git a/modules/nf-core/ensemblvep/vep/environment.yml b/modules/nf-core/ensemblvep/vep/environment.yml new file mode 100644 index 00000000..d8e22f70 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ensembl-vep=114.2 diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf new file mode 100644 index 00000000..d6780c4b --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -0,0 +1,77 @@ +process ENSEMBLVEP_VEP { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' + : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" + + input: + tuple val(meta), path(vcf), path(custom_extra_files) + val genome + val species + val cache_version + path cache + tuple val(meta2), path(fasta) + path extra_files + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' + def compress_cmd = args.contains("--compress_output") ? '' : '--compress_output bgzip' + def prefix = task.ext.prefix ?: "${meta.id}" + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta ${fasta}" : "" + def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" + """ + vep \\ + -i ${vcf} \\ + -o ${prefix}.${file_extension}.gz \\ + ${args} \\ + ${compress_cmd} \\ + ${reference} \\ + --assembly ${genome} \\ + --species ${species} \\ + --cache \\ + --cache_version ${cache_version} \\ + --dir_cache ${dir_cache} \\ + --fork ${task.cpus} + + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' + def create_index = file_extension == "vcf" ? "touch ${prefix}.${file_extension}.gz.tbi" : "" + """ + echo "" | gzip > ${prefix}.${file_extension}.gz + ${create_index} + touch ${prefix}_summary.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/ensemblvep/vep/meta.yml b/modules/nf-core/ensemblvep/vep/meta.yml new file mode 100644 index 00000000..7d91a7d0 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/meta.yml @@ -0,0 +1,136 @@ +name: ensemblvep_vep +description: Ensembl Variant Effect Predictor (VEP). The output-file-format is controlled + through `task.ext.args`. +keywords: + - annotation + - vcf + - json + - tab +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + vcf to annotate + ontologies: [] + - custom_extra_files: + type: file + description: | + extra sample-specific files to be used with the `--custom` flag to be configured with ext.args + (optional) + ontologies: [] + - genome: + type: string + description: | + which genome to annotate with + - species: + type: string + description: | + which species to annotate with + - cache_version: + type: integer + description: | + which version of the cache to annotate with + - cache: + type: file + description: | + path to VEP cache (optional) + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing fasta reference information + e.g. [ id:'test' ] + - fasta: + type: file + description: | + reference FASTA file (optional) + pattern: "*.{fasta,fa}" + ontologies: [] + - extra_files: + type: file + description: | + path to file(s) needed for plugins (optional) + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Map with sample information + - "*.vcf.gz": + type: file + description: | + annotated vcf (optional) + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: + type: map + description: | + Map with sample information + - "*.vcf.gz.tbi": + type: file + description: | + annotated vcf index (optional) + pattern: "*.vcf.gz.tbi" + ontologies: [] + tab: + - - meta: + type: map + description: | + Map with sample information + - "*.tab.gz": + type: file + description: | + tab file with annotated variants (optional) + pattern: "*.ann.tab.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + json: + - - meta: + type: map + description: | + Map with sample information + - "*.json.gz": + type: file + description: | + json file with annotated variants (optional) + pattern: "*.ann.json.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + report: + - "*.html": + type: file + description: VEP report file + pattern: "*.html" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@maxulysse" + - "@matthdsm" + - "@nvnieuwk" +maintainers: + - "@maxulysse" + - "@matthdsm" + - "@nvnieuwk" diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test b/modules/nf-core/ensemblvep/vep/tests/main.nf.test new file mode 100644 index 00000000..4a62ffd5 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test @@ -0,0 +1,86 @@ +nextflow_process { + + name "Test Process ENSEMBLVEP_VEP" + script "../main.nf" + process "ENSEMBLVEP_VEP" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "ensemblvep" + tag "ensemblvep/vep" + + test("test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)") { + config "./vcf.config" + + when { + process { + """ + vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), + [] + ]) + input[1] = params.vep_genome + input[2] = params.vep_species + input[3] = params.vep_cache_version + input[4] = vep_cache + input[5] = Channel.value([ + [id:"fasta"], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[6] = [] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.versions, + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.tbi.get(0).get(1)).name + ).match() } + ) + } + + } + + test("test_ensemblvep_vep_fasta_tab_gz") { + config "./tab.gz.config" + + when { + process { + """ + vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), + [] + ]) + input[1] = params.vep_genome + input[2] = params.vep_species + input[3] = params.vep_cache_version + input[4] = vep_cache + input[5] = Channel.value([ + [id:"fasta"], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[6] = [] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out.versions).match() }, + { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } + ) + } + } +} diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap new file mode 100644 index 00000000..bd80e401 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap @@ -0,0 +1,28 @@ +{ + "test_ensemblvep_vep_fasta_tab_gz": { + "content": [ + [ + "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-21T13:16:46.760065318" + }, + "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { + "content": [ + [ + "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ], + "d41d8cd98f00b204e9800998ecf8427e", + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-21T13:16:00.65871573" + } +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/tests/nextflow.config b/modules/nf-core/ensemblvep/vep/tests/nextflow.config new file mode 100644 index 00000000..f1f66774 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/nextflow.config @@ -0,0 +1,5 @@ +params { + vep_cache_version = "113" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" +} diff --git a/modules/nf-core/ensemblvep/vep/tests/tab.gz.config b/modules/nf-core/ensemblvep/vep/tests/tab.gz.config new file mode 100644 index 00000000..40eb03e5 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/tab.gz.config @@ -0,0 +1,5 @@ +process { + withName: ENSEMBLVEP_VEP { + ext.args = '--tab --compress_output bgzip' + } +} diff --git a/modules/nf-core/ensemblvep/vep/tests/vcf.config b/modules/nf-core/ensemblvep/vep/tests/vcf.config new file mode 100644 index 00000000..ad8955a3 --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/tests/vcf.config @@ -0,0 +1,5 @@ +process { + withName: ENSEMBLVEP_VEP { + ext.args = '--vcf' + } +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 91e466de..16866328 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -1,8 +1,10 @@ -include { CLAIR3 } from '../../modules/local/clair3/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { CLAIRS } from '../../modules/local/clairs/main.nf' +include { CLAIR3 } from '../../modules/local/clair3/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { CLAIRS } from '../modules/local/clairs/main.nf' +include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' workflow TUMOR_NORMAL_HAPPHASE { take: @@ -93,6 +95,8 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) + + ch_versions = ch_versions.mix(CLAIR3.out.versions) // Add germline vcf to normal bams @@ -115,6 +119,16 @@ workflow TUMOR_NORMAL_HAPPHASE { // mods: modcall-generated VCF with modifications (empty) + GERMLINE_VEP ( + CLAIR3.out.vcf, + params.genome, + "homo_sapiens", + 111, + '', + fasta, + [] + ) + // // MODULE: LONGPHASE_PHASE // @@ -259,6 +273,37 @@ workflow TUMOR_NORMAL_HAPPHASE { // normal_bai: indexes for normal bam files // phased_vcf: phased small variant vcf for normal + // Get ClairS input channel + + tumor_normal_severus + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] + } + .set { clairs_input } + + // + // MODULE: CLAIRS + // + + CLAIRS ( + clairs_input, + ch_fasta, + ch_fai + ) + + SOMATIC_VEP ( + CLAIRS.out.vcf, + params.genome, + "homo_sapiens", + 111, + '', + fasta, + [] + ) + + ch_versions = ch_versions.mix(CLAIRS.out.versions) + emit: tumor_normal_severus versions = ch_versions diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 84f3dac6..319b9b97 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -72,6 +72,29 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams_germlinevcf } + + + SOMATIC_VEP ( + VCFSPLIT.out.somatic_vcf, + params.genome, + "homo_sapiens", + 111, + '', + fasta, + [] + ) + + GERMLINE_VEP ( + VCFSPLIT.out.germline_vcf, + params.genome, + "homo_sapiens", + 111, + '', + fasta, + [] + ) + + // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 4f75fdcf..71e7705b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -326,7 +326,6 @@ workflow LR_SOMATIC { .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] - // // MODULE: SEVERUS // From 5f74572b513a784af60f96cb0e352839642ccf50 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 14:47:25 +0200 Subject: [PATCH 335/557] fix path --- subworkflows/local/tumor_normal_happhase.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 16866328..f858a3d3 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -2,9 +2,9 @@ include { CLAIR3 } from '../../modules/local/clair3/main.nf' include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { CLAIRS } from '../modules/local/clairs/main.nf' -include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' +include { CLAIRS } from '../../modules/local/clairs/main.nf' +include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' workflow TUMOR_NORMAL_HAPPHASE { take: From bbb8fc8391e0b37d5607742948b4320d43d23c51 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 14:49:59 +0200 Subject: [PATCH 336/557] fix fasta channel input clairs --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f858a3d3..d2d6980c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -288,7 +288,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIRS ( clairs_input, - ch_fasta, + fasta, ch_fai ) From 187a533f81e5679f191056ec852a74e9441ac45f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 14:54:35 +0200 Subject: [PATCH 337/557] fix fai channel --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d2d6980c..a942ef93 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -289,7 +289,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIRS ( clairs_input, fasta, - ch_fai + fai ) SOMATIC_VEP ( From 8ef1c249d43861af1589d40860e42432544e7f08 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 15:30:07 +0200 Subject: [PATCH 338/557] Add sv vep --- subworkflows/local/tumor_only_happhase.nf | 2 ++ workflows/lr_somatic.nf | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 319b9b97..888046a4 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -3,6 +3,8 @@ include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' workflow TUMOR_ONLY_HAPPHASE { diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 71e7705b..5a5ce512 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -28,7 +28,7 @@ include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predic include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' - +include {ENSEMBLVEP_VEP as SV_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' // // IMPORT SUBWORKFLOWS // @@ -41,7 +41,7 @@ include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_hap /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN MAIN WORKFLOW + RUN MAIN WORKFLOWx ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -335,8 +335,21 @@ workflow LR_SOMATIC { [[:], params.bed_file, params.pon_file] ) + + ch_versions = ch_versions.mix(SEVERUS.out.versions) + + SV_VEP ( + SEVERUS.out.all_vcf, + params.genome, + "homo_sapiens", + 111, + '', + fasta, + [] + ) + // // MODULE: CRAMINO // From 60c7e35a992f3efdf487e17b1840d107189b2b57 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 25 Aug 2025 15:33:38 +0200 Subject: [PATCH 339/557] fix fasta channels --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 5a5ce512..b3aa6ad4 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -346,7 +346,7 @@ workflow LR_SOMATIC { "homo_sapiens", 111, '', - fasta, + ch_fasta, [] ) From 66401814bd618bdfbe26da5ffafcce3480075f0f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 27 Aug 2025 15:19:22 +0200 Subject: [PATCH 340/557] fix vep channel structure --- modules/local/vcfsplit/main.nf | 10 +++++----- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- subworkflows/local/tumor_only_happhase.nf | 4 ++-- workflows/lr_somatic.nf | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 9385ce43..41cfdd2d 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,11 +69,11 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz - tabix -p vcf indels_nonsomatic.vcf.gz - tabix -p vcf snv_nonsomatic.vcf.gz - bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_germline.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_germline.vcf.gz + tabix -p vcf indels_germline.vcf.gz + tabix -p vcf snv_germline.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_germline.vcf.gz snv_germline.vcf.gz tabix -p vcf germline_tmp.vcf.gz bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a942ef93..c495fe5b 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -120,7 +120,7 @@ workflow TUMOR_NORMAL_HAPPHASE { GERMLINE_VEP ( - CLAIR3.out.vcf, + [CLAIR3.out.vcf,[]], params.genome, "homo_sapiens", 111, @@ -293,7 +293,7 @@ workflow TUMOR_NORMAL_HAPPHASE { ) SOMATIC_VEP ( - CLAIRS.out.vcf, + [CLAIRS.out.vcf,[]], params.genome, "homo_sapiens", 111, diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 888046a4..b9916ad3 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -77,7 +77,7 @@ workflow TUMOR_ONLY_HAPPHASE { SOMATIC_VEP ( - VCFSPLIT.out.somatic_vcf, + [VCFSPLIT.out.somatic_vcf,[]], params.genome, "homo_sapiens", 111, @@ -87,7 +87,7 @@ workflow TUMOR_ONLY_HAPPHASE { ) GERMLINE_VEP ( - VCFSPLIT.out.germline_vcf, + [VCFSPLIT.out.germline_vcf,[]], params.genome, "homo_sapiens", 111, diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index b3aa6ad4..77abddef 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -341,7 +341,7 @@ workflow LR_SOMATIC { SV_VEP ( - SEVERUS.out.all_vcf, + [SEVERUS.out.all_vcf,[]], params.genome, "homo_sapiens", 111, From 35253209c805cb842e489b012233beb0b1dc018d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 27 Aug 2025 15:49:36 +0200 Subject: [PATCH 341/557] fix channel structure --- subworkflows/local/tumor_normal_happhase.nf | 18 +++++++++++++++--- subworkflows/local/tumor_only_happhase.nf | 17 +++++++++++++++-- workflows/lr_somatic.nf | 10 ++++++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c495fe5b..bb5a5d90 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -118,9 +118,15 @@ workflow TUMOR_NORMAL_HAPPHASE { // svs: structural variant vcf (empty) // mods: modcall-generated VCF with modifications (empty) + CLAIR3.out.vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { germline_vep } GERMLINE_VEP ( - [CLAIR3.out.vcf,[]], + germline_vep, params.genome, "homo_sapiens", 111, @@ -291,9 +297,15 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta, fai ) - + CLAIRS.out.vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { somatic_vep } + SOMATIC_VEP ( - [CLAIRS.out.vcf,[]], + somatic_vep, params.genome, "homo_sapiens", 111, diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index b9916ad3..61ecd3a6 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -75,9 +75,22 @@ workflow TUMOR_ONLY_HAPPHASE { .set{ tumor_bams_germlinevcf } + VCFSPLIT.out.somatic_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { somatic_vep } + + VCFSPLIT.out.germline_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { germline_vep } SOMATIC_VEP ( - [VCFSPLIT.out.somatic_vcf,[]], + somatic_vep, params.genome, "homo_sapiens", 111, @@ -87,7 +100,7 @@ workflow TUMOR_ONLY_HAPPHASE { ) GERMLINE_VEP ( - [VCFSPLIT.out.germline_vcf,[]], + germline_vep, params.genome, "homo_sapiens", 111, diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 77abddef..e66a567a 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -339,9 +339,15 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(SEVERUS.out.versions) - + SEVERUS.out.all_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { sv_vep } + SV_VEP ( - [SEVERUS.out.all_vcf,[]], + sv_vep, params.genome, "homo_sapiens", 111, From 6ac097508f8f3c06d90e5e96fb5811a0345d5151 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 28 Aug 2025 10:49:20 +0200 Subject: [PATCH 342/557] Add Vep configs --- conf/igenomes.config | 3 +++ nextflow.config | 1 + subworkflows/local/tumor_normal_happhase.nf | 16 ++++++++-------- subworkflows/local/tumor_only_happhase.nf | 16 ++++++++-------- workflows/lr_somatic.nf | 10 +++++----- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 43b78c2d..e1ebf84c 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -19,6 +19,9 @@ params { centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" + vep_cache_version = '113' + vep_genome = 'GRCh38' + vep_species = 'homo_sapiens' } 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" diff --git a/nextflow.config b/nextflow.config index 86df4cfa..f38d848b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,6 +17,7 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false + vep_cache = 's3://annotation-cache/vep_cache/' // Skip options skip_qc = false diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index bb5a5d90..b349956f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -127,10 +127,10 @@ workflow TUMOR_NORMAL_HAPPHASE { GERMLINE_VEP ( germline_vep, - params.genome, - "homo_sapiens", - 111, - '', + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache, fasta, [] ) @@ -306,10 +306,10 @@ workflow TUMOR_NORMAL_HAPPHASE { SOMATIC_VEP ( somatic_vep, - params.genome, - "homo_sapiens", - 111, - '', + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache, fasta, [] ) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 61ecd3a6..b03c3341 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -91,20 +91,20 @@ workflow TUMOR_ONLY_HAPPHASE { SOMATIC_VEP ( somatic_vep, - params.genome, - "homo_sapiens", - 111, - '', + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache, fasta, [] ) GERMLINE_VEP ( germline_vep, - params.genome, - "homo_sapiens", - 111, - '', + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache, fasta, [] ) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index e66a567a..1f705b11 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -348,11 +348,11 @@ workflow LR_SOMATIC { SV_VEP ( sv_vep, - params.genome, - "homo_sapiens", - 111, - '', - ch_fasta, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache, + fasta, [] ) From 6ce75de070c431c782032328ece0cb92513ce200 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 28 Aug 2025 13:09:23 +0200 Subject: [PATCH 343/557] fix VEP params --- conf/igenomes.config | 6 +++--- nextflow_schema.json | 7 +++++++ workflows/lr_somatic.nf | 5 ++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index e1ebf84c..0f77f1f9 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -19,9 +19,9 @@ params { centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" - vep_cache_version = '113' - vep_genome = 'GRCh38' - vep_species = 'homo_sapiens' + vep_cache_version = "113" + vep_genome = "GRCh38" + vep_species = "homo_sapiens" } 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" diff --git a/nextflow_schema.json b/nextflow_schema.json index eb7634e7..68f10b2f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -70,6 +70,13 @@ "fa_icon": "fas fa-ban", "hidden": true, "default": "s3://ngi-igenomes/igenomes/" + }, + "vep_cache": { + "type": "string", + "description": "Path to VEP cache directory.", + "fa_icon": "fas fa-database", + "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself.", + "default": "" } } }, diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 1f705b11..7b6947fc 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -83,7 +83,10 @@ workflow LR_SOMATIC { params.centromere_bed = getGenomeAttribute('centromere_bed') params.pon_file = getGenomeAttribute('pon_file') params.bed_file = getGenomeAttribute('bed_file') - + params.vep_cache_version = getGenomeAttribute('vep_cache_version') + params.vep_genome = getGenomeAttribute('vep_genome') + params.vep_species = getGenomeAttribute('vep_species') + ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() From 9f9bbb45eb8862ceea69ded0972493738fcb00aa Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 28 Aug 2025 13:21:21 +0200 Subject: [PATCH 344/557] fix params --- subworkflows/local/tumor_normal_happhase.nf | 20 ++++++++++++-------- subworkflows/local/tumor_only_happhase.nf | 20 ++++++++++++-------- workflows/lr_somatic.nf | 15 ++++++++++++--- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index b349956f..bd800388 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -13,6 +13,10 @@ workflow TUMOR_NORMAL_HAPPHASE { fai clair3_modelMap clairs_modelMap + vep_genome + vep_species + vep_cache_version + vep_cache downloaded_model_files main: @@ -127,10 +131,10 @@ workflow TUMOR_NORMAL_HAPPHASE { GERMLINE_VEP ( germline_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - params.vep_cache, + vep_genome, + vep_species, + vep_cache_version, + vep_cache, fasta, [] ) @@ -306,10 +310,10 @@ workflow TUMOR_NORMAL_HAPPHASE { SOMATIC_VEP ( somatic_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - params.vep_cache, + vep_genome, + vep_species, + vep_cache_version, + vep_cache, fasta, [] ) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index b03c3341..944e5fde 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -13,6 +13,10 @@ workflow TUMOR_ONLY_HAPPHASE { fasta fai clairSTO_modelMap + vep_genome + vep_species + vep_cache_version + vep_cache main: @@ -91,20 +95,20 @@ workflow TUMOR_ONLY_HAPPHASE { SOMATIC_VEP ( somatic_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - params.vep_cache, + vep_genome, + vep_species, + vep_cache_version, + vep_cache, fasta, [] ) GERMLINE_VEP ( germline_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - params.vep_cache, + vep_genome, + vep_species, + vep_cache_version, + vep_cache, fasta, [] ) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 7b6947fc..7b2f714f 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -86,7 +86,7 @@ workflow LR_SOMATIC { params.vep_cache_version = getGenomeAttribute('vep_cache_version') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') - + ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() @@ -304,7 +304,11 @@ workflow LR_SOMATIC { ch_fai, clair3_modelMap, clairs_modelMap, - downloaded_model_files + downloaded_model_files, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -318,7 +322,12 @@ workflow LR_SOMATIC { branched_minimap.tumor_only, ch_fasta, ch_fai, - clairs_modelMap + clairs_modelMap, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + params.vep_cache + ) ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) From 61c3fab5d66692a0d1ea5cfd2caf893c8b657d49 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 28 Aug 2025 13:44:02 +0200 Subject: [PATCH 345/557] fix channel name typos --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 7b2f714f..494ea009 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -364,7 +364,7 @@ workflow LR_SOMATIC { params.vep_species, params.vep_cache_version, params.vep_cache, - fasta, + ch_fasta, [] ) From 17a7d8570fa7a81dbea5bdbda44930694580f884 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 29 Aug 2025 10:32:17 +0200 Subject: [PATCH 346/557] add view --- subworkflows/local/tumor_only_happhase.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 944e5fde..f023444a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -84,6 +84,7 @@ workflow TUMOR_ONLY_HAPPHASE { def extra = [] return [meta,vcf, extra] } + .view() .set { somatic_vep } VCFSPLIT.out.germline_vcf @@ -91,6 +92,7 @@ workflow TUMOR_ONLY_HAPPHASE { def extra = [] return [meta,vcf, extra] } + .view() .set { germline_vep } SOMATIC_VEP ( From 9443553a637145203ead2f09e4494936b3f23d23 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Sep 2025 10:03:51 +0200 Subject: [PATCH 347/557] change names --- modules/local/vcfsplit/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 41cfdd2d..9385ce43 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,11 +69,11 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_germline.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_germline.vcf.gz - tabix -p vcf indels_germline.vcf.gz - tabix -p vcf snv_germline.vcf.gz - bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_germline.vcf.gz snv_germline.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz + tabix -p vcf indels_nonsomatic.vcf.gz + tabix -p vcf snv_nonsomatic.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz tabix -p vcf germline_tmp.vcf.gz bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ From ab233a138c9760a2bc27d19dfafe8b34bb842d7e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Sep 2025 13:11:49 +0200 Subject: [PATCH 348/557] fix --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index bd800388..35176941 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -125,7 +125,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIR3.out.vcf .map { meta, vcf -> def extra = [] - return [meta,vcf, extra] + return [meta, vcf, extra] } .set { germline_vep } From a8e03573200bb37bc98851135289ef49a2636b9a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Sep 2025 13:37:37 +0200 Subject: [PATCH 349/557] change name --- modules/local/vcfsplit/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 9385ce43..79c1ec7f 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -69,11 +69,11 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_nonsomatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_nonsomatic.vcf.gz - tabix -p vcf indels_nonsomatic.vcf.gz - tabix -p vcf snv_nonsomatic.vcf.gz - bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_nonsomatic.vcf.gz snv_nonsomatic.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_filtered.vcf.gz + bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_filtered.vcf.gz + tabix -p vcf indels_filtered.vcf.gz + tabix -p vcf snv_filtered.vcf.gz + bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_filtered.vcf.gz snv_filtered.vcf.gz tabix -p vcf germline_tmp.vcf.gz bcftools view germline_tmp.vcf.gz | awk 'BEGIN{FS=OFS="\t"} /^#/ {print} !/^#/ { \$7="PASS"; print }' | \ From 10ceb54538f93023e69b04bb77985c1e3980627a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 13:32:24 +0200 Subject: [PATCH 350/557] skip_ascat test --- conf/test.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 7b9f7a5e..c1a9e6b3 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,5 +34,6 @@ params { ascat_chroms = "19" ascat_min_counts = 2 skip_wakhan = true - wakhan_chroms = "chr19" + skip_ascat = true + wakhan_chroms = "chr19" } From 6900a25c8fb8244c21163219d0b97dc1894cd674 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:06:21 +0200 Subject: [PATCH 351/557] big vep rework --- conf/igenomes.config | 1 - modules.json | 20 ++ .../ensemblvep/download/environment.yml | 7 + modules/nf-core/ensemblvep/download/main.nf | 47 +++ modules/nf-core/ensemblvep/download/meta.yml | 57 ++++ .../ensemblvep/download/tests/main.nf.test | 60 ++++ .../download/tests/main.nf.test.snap | 322 ++++++++++++++++++ .../ensemblvep/download/tests/nextflow.config | 12 + nextflow.config | 9 +- subworkflows/local/prepare_annotation.nf | 51 +++ subworkflows/local/tumor_normal_happhase.nf | 29 +- subworkflows/local/tumor_only_happhase.nf | 29 +- workflows/lr_somatic.nf | 51 ++- 13 files changed, 632 insertions(+), 63 deletions(-) create mode 100644 modules/nf-core/ensemblvep/download/environment.yml create mode 100644 modules/nf-core/ensemblvep/download/main.nf create mode 100644 modules/nf-core/ensemblvep/download/meta.yml create mode 100644 modules/nf-core/ensemblvep/download/tests/main.nf.test create mode 100644 modules/nf-core/ensemblvep/download/tests/main.nf.test.snap create mode 100644 modules/nf-core/ensemblvep/download/tests/nextflow.config create mode 100644 subworkflows/local/prepare_annotation.nf diff --git a/conf/igenomes.config b/conf/igenomes.config index 0f77f1f9..8f48e98f 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -19,7 +19,6 @@ params { centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" - vep_cache_version = "113" vep_genome = "GRCh38" vep_species = "homo_sapiens" } diff --git a/modules.json b/modules.json index b5400534..68aa711f 100644 --- a/modules.json +++ b/modules.json @@ -11,6 +11,16 @@ "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, + "ensemblvep/download": { + "branch": "master", + "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", + "installed_by": ["modules"] + }, + "ensemblvep/vep": { + "branch": "master", + "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", + "installed_by": ["modules"] + }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", @@ -89,10 +99,20 @@ "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, + "untar": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] + }, + "wget": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/ensemblvep/download/environment.yml b/modules/nf-core/ensemblvep/download/environment.yml new file mode 100644 index 00000000..c73d7e1e --- /dev/null +++ b/modules/nf-core/ensemblvep/download/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::ensembl-vep=115 diff --git a/modules/nf-core/ensemblvep/download/main.nf b/modules/nf-core/ensemblvep/download/main.nf new file mode 100644 index 00000000..714d7088 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/main.nf @@ -0,0 +1,47 @@ +process ENSEMBLVEP_DOWNLOAD { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f1/f1872dbae2edaae3b7591ac2769efb2de3969adb34752a3ce7cdc9a1409640bb/data' + : 'community.wave.seqera.io/library/ensembl-vep:115--3f10c53a4cdeedf2'}" + + input: + tuple val(meta), val(assembly), val(species), val(cache_version) + + output: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: 'vep_cache' + """ + vep_install \\ + --CACHEDIR ${prefix} \\ + --SPECIES ${species} \\ + --ASSEMBLY ${assembly} \\ + --CACHE_VERSION ${cache_version} \\ + ${args} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: 'vep_cache' + """ + mkdir ${prefix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/ensemblvep/download/meta.yml b/modules/nf-core/ensemblvep/download/meta.yml new file mode 100644 index 00000000..df7cf260 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/meta.yml @@ -0,0 +1,57 @@ +name: ensemblvep_download +description: Ensembl Variant Effect Predictor (VEP). The cache downloading options + are controlled through `task.ext.args`. +keywords: + - annotation + - cache + - download +tools: + - ensemblvep: + description: | + VEP determines the effect of your variants (SNPs, insertions, deletions, CNVs + or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. + homepage: https://www.ensembl.org/info/docs/tools/vep/index.html + documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html + licence: ["Apache-2.0"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - assembly: + type: string + description: | + Genome assembly + - species: + type: string + description: | + Specie + - cache_version: + type: string + description: | + cache version +output: + cache: + - - meta: + type: file + description: cache + pattern: "*" + ontologies: [] + - prefix: + type: file + description: cache + pattern: "*" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@maxulysse" +maintainers: + - "@maxulysse" diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test b/modules/nf-core/ensemblvep/download/tests/main.nf.test new file mode 100644 index 00000000..496dbeca --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process ENSEMBLVEP_DOWNLOAD" + script "../main.nf" + process "ENSEMBLVEP_DOWNLOAD" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "ensemblvep" + tag "ensemblvep/download" + + test("celegans - download") { + + when { + process { + """ + input[0] = Channel.of([ + [id:"115_WBcel235"], + params.vep_genome, + params.vep_species, + params.vep_cache_version + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + } + + test("celegans - download - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [id:"115_WBcel235"], + params.vep_genome, + params.vep_species, + params.vep_cache_version + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap new file mode 100644 index 00000000..2f7c7aed --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap @@ -0,0 +1,322 @@ +{ + "celegans - download": { + "content": [ + { + "0": [ + [ + { + "id": "115_WBcel235" + }, + [ + [ + [ + [ + "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", + "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", + "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", + "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", + "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", + "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", + "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", + "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", + "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", + "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", + "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", + "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", + "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", + "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", + "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", + "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + ], + [ + "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", + "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", + "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", + "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", + "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", + "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", + "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", + "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", + "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", + "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", + "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", + "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", + "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", + "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", + "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", + "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + ], + [ + "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", + "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", + "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", + "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", + "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", + "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", + "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", + "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", + "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", + "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", + "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", + "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", + "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", + "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + ], + [ + "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", + "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", + "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", + "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", + "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", + "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", + "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", + "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", + "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", + "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", + "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", + "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", + "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", + "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", + "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", + "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", + "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", + "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + ], + [ + "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + ], + [ + "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", + "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", + "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", + "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", + "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", + "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", + "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", + "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", + "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", + "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", + "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", + "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", + "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", + "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", + "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", + "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", + "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", + "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", + "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", + "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", + "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + ], + [ + "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", + "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", + "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", + "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", + "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", + "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", + "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", + "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", + "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", + "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", + "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", + "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", + "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", + "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", + "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", + "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", + "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", + "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + ], + "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "info.txt:md5,33ccb74a030a9a345051628c337cb8af" + ] + ] + ] + ] + ], + "1": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ], + "cache": [ + [ + { + "id": "115_WBcel235" + }, + [ + [ + [ + [ + "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", + "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", + "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", + "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", + "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", + "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", + "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", + "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", + "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", + "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", + "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", + "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", + "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", + "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", + "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", + "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + ], + [ + "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", + "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", + "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", + "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", + "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", + "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", + "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", + "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", + "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", + "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", + "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", + "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", + "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", + "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", + "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", + "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + ], + [ + "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", + "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", + "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", + "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", + "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", + "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", + "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", + "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", + "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", + "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", + "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", + "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", + "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", + "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + ], + [ + "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", + "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", + "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", + "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", + "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", + "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", + "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", + "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", + "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", + "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", + "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", + "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", + "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", + "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", + "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", + "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", + "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", + "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + ], + [ + "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + ], + [ + "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", + "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", + "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", + "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", + "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", + "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", + "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", + "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", + "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", + "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", + "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", + "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", + "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", + "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", + "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", + "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", + "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", + "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", + "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", + "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", + "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + ], + [ + "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", + "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", + "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", + "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", + "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", + "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", + "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", + "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", + "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", + "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", + "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", + "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", + "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", + "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", + "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", + "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", + "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", + "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + ], + "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "info.txt:md5,33ccb74a030a9a345051628c337cb8af" + ] + ] + ] + ] + ], + "versions": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-04T10:00:46.010443" + }, + "celegans - download - stub": { + "content": [ + { + "0": [ + [ + { + "id": "115_WBcel235" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ], + "cache": [ + [ + { + "id": "115_WBcel235" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-04T10:00:57.964733" + } +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/download/tests/nextflow.config b/modules/nf-core/ensemblvep/download/tests/nextflow.config new file mode 100644 index 00000000..49485470 --- /dev/null +++ b/modules/nf-core/ensemblvep/download/tests/nextflow.config @@ -0,0 +1,12 @@ +params { + vep_cache_version = "114" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" +} + +process { + withName: ENSEMBLVEP_DOWNLOAD { + ext.args = '--AUTO c --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' + ext.prefix = { "${params.vep_cache_version}_${params.vep_genome}" } + } +} diff --git a/nextflow.config b/nextflow.config index f38d848b..3fb04dd6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,7 +17,12 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false - vep_cache = 's3://annotation-cache/vep_cache/' + + // Annotation + vep_cache = null + vep_cache_aws_base = 's3://annotation-cache/vep_cache/' + vep_cache_version = "113" + download_vep_cache = false // Skip options skip_qc = false @@ -27,6 +32,8 @@ params { skip_ascat = false skip_wakhan = false skip_fiber = false + skip_vep = false + vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" // minimap2 options minimap2_ont_model = null diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf new file mode 100644 index 00000000..f7516b02 --- /dev/null +++ b/subworkflows/local/prepare_annotation.nf @@ -0,0 +1,51 @@ +include {ENSEMBLVEP_DOWNLOAD } from '../../modules/nf-core/ensemblvep/download/main.nf' + +workflow PREPARE_ANNOTATION { + + take: + vep_cache + vep_cache_aws_base + vep_cache_version + vep_genome + vep_args + vep_species + download_vep_cache + + main: + + ch_versions = Channel.empty() + + if (download_vep_cache) { + vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) + ENSEMBLVEP_DOWNLOAD(vep_download_info) + ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache + ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) + + } + else if (!vep_cache) { + def vep_species_suffix = vep_custom_args.contains("--merged") ? '_merged' : (vep_custom_args.contains("--refseq") ? '_refseq' : '') + def vep_cache_path_suffix = "${vep_cache_version}_${vep_genome}" + def vep_cache_dir = "${vep_cache_path_suffix}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" + def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') + if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { + if (vep_cache == "s3://annotation-cache/vep_cache/") { + error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") + } else { + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n${help_message}") + } + } + ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() + } + + + + // + // MODULE: ENSEMBLVEP_DOWNLOAD + // + + + emit: + ch_vep_cache as vep_cache + ch_versions as versions + +} \ No newline at end of file diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 35176941..dbe9a45d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -3,8 +3,6 @@ include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { CLAIRS } from '../../modules/local/clairs/main.nf' -include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' workflow TUMOR_NORMAL_HAPPHASE { take: @@ -13,10 +11,6 @@ workflow TUMOR_NORMAL_HAPPHASE { fai clair3_modelMap clairs_modelMap - vep_genome - vep_species - vep_cache_version - vep_cache downloaded_model_files main: @@ -129,16 +123,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { germline_vep } - GERMLINE_VEP ( - germline_vep, - vep_genome, - vep_species, - vep_cache_version, - vep_cache, - fasta, - [] - ) - // // MODULE: LONGPHASE_PHASE // @@ -301,27 +285,20 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta, fai ) + CLAIRS.out.vcf .map { meta, vcf -> def extra = [] return [meta,vcf, extra] } .set { somatic_vep } - - SOMATIC_VEP ( - somatic_vep, - vep_genome, - vep_species, - vep_cache_version, - vep_cache, - fasta, - [] - ) ch_versions = ch_versions.mix(CLAIRS.out.versions) emit: tumor_normal_severus + somatic_vep as somatic_vep + germline_vep as germline_vep versions = ch_versions } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index f023444a..84f3a892 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -3,8 +3,6 @@ include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' workflow TUMOR_ONLY_HAPPHASE { @@ -13,10 +11,6 @@ workflow TUMOR_ONLY_HAPPHASE { fasta fai clairSTO_modelMap - vep_genome - vep_species - vep_cache_version - vep_cache main: @@ -95,27 +89,6 @@ workflow TUMOR_ONLY_HAPPHASE { .view() .set { germline_vep } - SOMATIC_VEP ( - somatic_vep, - vep_genome, - vep_species, - vep_cache_version, - vep_cache, - fasta, - [] - ) - - GERMLINE_VEP ( - germline_vep, - vep_genome, - vep_species, - vep_cache_version, - vep_cache, - fasta, - [] - ) - - // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -211,6 +184,8 @@ workflow TUMOR_ONLY_HAPPHASE { emit: tumor_only_severus + somatic_vep as somatic_vep + germline_vep as germline_vep versions = ch_versions } diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 494ea009..fbc4a4df 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -28,11 +28,14 @@ include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predic include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' include {ENSEMBLVEP_VEP as SV_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' // // IMPORT SUBWORKFLOWS // include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' @@ -83,7 +86,6 @@ workflow LR_SOMATIC { params.centromere_bed = getGenomeAttribute('centromere_bed') params.pon_file = getGenomeAttribute('pon_file') params.bed_file = getGenomeAttribute('bed_file') - params.vep_cache_version = getGenomeAttribute('vep_cache_version') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') @@ -166,6 +168,23 @@ workflow LR_SOMATIC { clair3_modelMap ) + vep_cache = Channel.empty() + + if (! params.skip_vep) { + PREPARE_ANNOTATION ( + params.vep_cache, + params.vep_cache_aws_base, + params.vep_cache_version, + params.vep_genome, + params.vep_args, + params.vep_species, + params.download_vep_cache + ) + + vep_cache = PREPARE_ANNOTATION.out.vep_cache + + } + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai @@ -304,11 +323,7 @@ workflow LR_SOMATIC { ch_fai, clair3_modelMap, clairs_modelMap, - downloaded_model_files, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - params.vep_cache + downloaded_model_files ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) @@ -323,11 +338,31 @@ workflow LR_SOMATIC { ch_fasta, ch_fai, clairs_modelMap, + params.skip_vep + + ) + + germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) + somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + + GERMLINE_VEP ( + germline_vep, params.vep_genome, params.vep_species, params.vep_cache_version, - params.vep_cache + vep_cache, + ch_fasta, + [] + ) + SOMATIC_VEP ( + somatic_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [] ) ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) @@ -363,7 +398,7 @@ workflow LR_SOMATIC { params.vep_genome, params.vep_species, params.vep_cache_version, - params.vep_cache, + vep_cache, ch_fasta, [] ) From 380f539fc93f6edcd393fe5c523737691a49dcf2 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:19:13 +0200 Subject: [PATCH 352/557] fix module paths --- workflows/lr_somatic.nf | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index fbc4a4df..cf836419 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -13,24 +13,24 @@ include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_l // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' -include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' -include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' -include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' -include { ASCAT } from '../modules/nf-core/ascat/main' -include { CLAIR3 } from '../modules/local/clair3/main' -include { SEVERUS } from '../modules/nf-core/severus/main.nf' -include { METAEXTRACT } from '../modules/local/metaextract/main' -include { WAKHAN } from '../modules/local/wakhan/main' -include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' -include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' -include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' -include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' -include {ENSEMBLVEP_VEP as SOMATIC_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as GERMLINE_VEP} from '../../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as SV_VEP} from '../modules/nf-core/ensemblvep/vep/main.nf' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { CLAIR3 } from '../modules/local/clair3/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include {ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include {ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' // // IMPORT SUBWORKFLOWS // From 2d3823a0e314d55007150ce81e5099e5ab6789f6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:24:21 +0200 Subject: [PATCH 353/557] fix vsc-copilots attempts at nextflow syntax --- subworkflows/local/prepare_annotation.nf | 4 ++-- workflows/lr_somatic.nf | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index f7516b02..80316f89 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -45,7 +45,7 @@ workflow PREPARE_ANNOTATION { emit: - ch_vep_cache as vep_cache - ch_versions as versions + vep_cache = ensemblvep_cache + versions = ch_versions } \ No newline at end of file diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index cf836419..0996bf5b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -566,7 +566,8 @@ workflow LR_SOMATIC { [] ) - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + emit: + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] From 9f836cbca68c0b8e8e6bdf814fb899be14191b88 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:30:17 +0200 Subject: [PATCH 354/557] fixing more copilot shit --- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- subworkflows/local/tumor_only_happhase.nf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index dbe9a45d..6e30d966 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -297,8 +297,8 @@ workflow TUMOR_NORMAL_HAPPHASE { emit: tumor_normal_severus - somatic_vep as somatic_vep - germline_vep as germline_vep + somatic_vep + germline_vep versions = ch_versions } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 84f3a892..d9376683 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -184,8 +184,8 @@ workflow TUMOR_ONLY_HAPPHASE { emit: tumor_only_severus - somatic_vep as somatic_vep - germline_vep as germline_vep + somatic_vep + germline_vep versions = ch_versions } From f1e1a698a42262422fa8d0418825483c14daba83 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:34:39 +0200 Subject: [PATCH 355/557] add skips --- workflows/lr_somatic.nf | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 0996bf5b..98f5fd0d 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -345,6 +345,38 @@ workflow LR_SOMATIC { germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + if (!params.skip_vep) { + // + // MODULE: GERMLINE_VEP + // + + GERMLINE_VEP ( + germline_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [] + ) + + // + // MODULE: SOMATIC_VEP + // + + SOMATIC_VEP ( + somatic_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [] + ) + + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) + ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) + } GERMLINE_VEP ( germline_vep, params.vep_genome, From dde258c3f5ef27fce36d82b3fdb69d8b68cc2e18 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:51:08 +0200 Subject: [PATCH 356/557] fix param reference --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 80316f89..36c17fe5 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -23,7 +23,7 @@ workflow PREPARE_ANNOTATION { } else if (!vep_cache) { - def vep_species_suffix = vep_custom_args.contains("--merged") ? '_merged' : (vep_custom_args.contains("--refseq") ? '_refseq' : '') + def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') def vep_cache_path_suffix = "${vep_cache_version}_${vep_genome}" def vep_cache_dir = "${vep_cache_path_suffix}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') From 29ee6365143f2c0e935e7b1f46384228bc63b7a4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 15:53:46 +0200 Subject: [PATCH 357/557] remove help message --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 36c17fe5..7bd680c4 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -31,7 +31,7 @@ workflow PREPARE_ANNOTATION { if (vep_cache == "s3://annotation-cache/vep_cache/") { error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") } else { - error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n${help_message}") + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") } } ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() From 901185b9a48d83b5ba2a87c4bb4933b16e9dec99 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:05:59 +0200 Subject: [PATCH 358/557] fix cache references --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 7bd680c4..5da2fb77 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -28,7 +28,7 @@ workflow PREPARE_ANNOTATION { def vep_cache_dir = "${vep_cache_path_suffix}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { - if (vep_cache == "s3://annotation-cache/vep_cache/") { + if (vep_cache_aws_base == "s3://annotation-cache/vep_cache/" & !vep_cache) { error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") } else { error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") From 53887c68f6c57739ada887ac68526ca298a5254b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:12:31 +0200 Subject: [PATCH 359/557] more like sarek --- nextflow.config | 1 - workflows/lr_somatic.nf | 1 - 2 files changed, 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 3fb04dd6..01adc627 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,7 +20,6 @@ params { // Annotation vep_cache = null - vep_cache_aws_base = 's3://annotation-cache/vep_cache/' vep_cache_version = "113" download_vep_cache = false diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 98f5fd0d..3ccf017f 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -173,7 +173,6 @@ workflow LR_SOMATIC { if (! params.skip_vep) { PREPARE_ANNOTATION ( params.vep_cache, - params.vep_cache_aws_base, params.vep_cache_version, params.vep_genome, params.vep_args, From 2a58426b33076c18833d0146b10446bc79d81818 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:23:27 +0200 Subject: [PATCH 360/557] add file I forgot to save --- subworkflows/local/prepare_annotation.nf | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 5da2fb77..269f1f06 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -4,7 +4,6 @@ workflow PREPARE_ANNOTATION { take: vep_cache - vep_cache_aws_base vep_cache_version vep_genome vep_args @@ -23,18 +22,18 @@ workflow PREPARE_ANNOTATION { } else if (!vep_cache) { - def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') - def vep_cache_path_suffix = "${vep_cache_version}_${vep_genome}" - def vep_cache_dir = "${vep_cache_path_suffix}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" + def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" + def vep_species_suffix = vep_custom_args.contains("--merged") ? '_merged' : (vep_custom_args.contains("--refseq") ? '_refseq' : '') + def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') - if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { - if (vep_cache_aws_base == "s3://annotation-cache/vep_cache/" & !vep_cache) { + if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { + if (vep_cache == "s3://annotation-cache/vep_cache/") { error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") } else { - error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n${help_message}") } } - ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() + ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() } From b02b1685d1282fc87f5f13f97c3f17e84e131166 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:28:38 +0200 Subject: [PATCH 361/557] fix --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 269f1f06..5c74c077 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -23,7 +23,7 @@ workflow PREPARE_ANNOTATION { } else if (!vep_cache) { def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" - def vep_species_suffix = vep_custom_args.contains("--merged") ? '_merged' : (vep_custom_args.contains("--refseq") ? '_refseq' : '') + def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { From c5a328faebe09c8dbb17d21a3d197f7a1121ec1a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:30:44 +0200 Subject: [PATCH 362/557] fix --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 5c74c077..0119cce2 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -30,7 +30,7 @@ workflow PREPARE_ANNOTATION { if (vep_cache == "s3://annotation-cache/vep_cache/") { error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") } else { - error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n${help_message}") + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n$") } } ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() From b80141829b4fb8e0398c6a9816425c58b3edbe0b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:33:44 +0200 Subject: [PATCH 363/557] remove $ --- subworkflows/local/prepare_annotation.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 0119cce2..a01ebdca 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -30,7 +30,7 @@ workflow PREPARE_ANNOTATION { if (vep_cache == "s3://annotation-cache/vep_cache/") { error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") } else { - error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n$") + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") } } ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() From d90ee5518290494dedfc443b0cf4e88fe81b95b8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:41:01 +0200 Subject: [PATCH 364/557] fix vep cache reference --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 01adc627..8ae00c24 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,7 +19,7 @@ params { igenomes_ignore = false // Annotation - vep_cache = null + vep_cache = 's3://ngi-igenomes/igenomes/' vep_cache_version = "113" download_vep_cache = false From 1446da3b9ac199047d87b71047bb825af36cfd8b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:46:02 +0200 Subject: [PATCH 365/557] fix channel setup --- subworkflows/local/prepare_annotation.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index a01ebdca..8a45bedd 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -13,6 +13,7 @@ workflow PREPARE_ANNOTATION { main: ch_versions = Channel.empty() + ensemblvep_cache = Channel.empty() if (download_vep_cache) { vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) @@ -33,6 +34,7 @@ workflow PREPARE_ANNOTATION { error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") } } + ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() } From a9202fa1c8bf5884a39af6962d605489e94034c6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 16:52:32 +0200 Subject: [PATCH 366/557] remove clair3 import --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 3ccf017f..77a4a247 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -20,7 +20,6 @@ include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' include { ASCAT } from '../modules/nf-core/ascat/main' -include { CLAIR3 } from '../modules/local/clair3/main' include { SEVERUS } from '../modules/nf-core/severus/main.nf' include { METAEXTRACT } from '../modules/local/metaextract/main' include { WAKHAN } from '../modules/local/wakhan/main' From 86c2b4bb0f13f7f4ab498d29d1f592b975423b6e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 17:16:05 +0200 Subject: [PATCH 367/557] remove redundant clairS --- subworkflows/local/tumor_normal_happhase.nf | 25 ++------------- workflows/lr_somatic.nf | 34 ++++++++++----------- 2 files changed, 20 insertions(+), 39 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 6e30d966..f9765c9f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -1,6 +1,6 @@ -include { CLAIR3 } from '../../modules/local/clair3/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { CLAIR3 } from '../../modules/local/clair3/main.nf' +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { CLAIRS } from '../../modules/local/clairs/main.nf' @@ -241,25 +241,6 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(LONGPHASE_PHASE.out.vcf) .set{tumor_normal_severus} - // Get ClairS input channel - tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, model] - } - .set { clairs_input } - - // - // MODULE: CLAIRS - // - - CLAIRS ( - clairs_input, - fasta, - fai - ) - - ch_versions = ch_versions.mix(CLAIRS.out.versions) // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 77a4a247..5acd32e8 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -13,23 +13,23 @@ include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_l // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' -include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' -include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' -include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' -include { ASCAT } from '../modules/nf-core/ascat/main' -include { SEVERUS } from '../modules/nf-core/severus/main.nf' -include { METAEXTRACT } from '../modules/local/metaextract/main' -include { WAKHAN } from '../modules/local/wakhan/main' -include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' -include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' -include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' -include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' -include {ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include {ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' // // IMPORT SUBWORKFLOWS // From aaeaf5b066733b9d4c64b227e3f8a598acaa9821 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 17:21:37 +0200 Subject: [PATCH 368/557] fix channel --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 5acd32e8..18daf946 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -336,7 +336,6 @@ workflow LR_SOMATIC { ch_fasta, ch_fai, clairs_modelMap, - params.skip_vep ) From 345cc3fa54f35307a1857ca1d2e83b5ee99846e1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 5 Sep 2025 17:25:09 +0200 Subject: [PATCH 369/557] remove redunant vep references --- workflows/lr_somatic.nf | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 18daf946..6abe12cb 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -374,25 +374,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) } - GERMLINE_VEP ( - germline_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - vep_cache, - ch_fasta, - [] - ) - SOMATIC_VEP ( - somatic_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - vep_cache, - ch_fasta, - [] - ) ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) From 4c39b15634e0b1c59d20c5d1f51041be7092c571 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:05:36 +0200 Subject: [PATCH 370/557] fix json --- nextflow.config | 3 ++- nextflow_schema.json | 13 +++++++++++++ workflows/lr_somatic.nf | 8 ++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 8ae00c24..adb5dc55 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,6 +22,8 @@ params { vep_cache = 's3://ngi-igenomes/igenomes/' vep_cache_version = "113" download_vep_cache = false + vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" + // Skip options skip_qc = false @@ -32,7 +34,6 @@ params { skip_wakhan = false skip_fiber = false skip_vep = false - vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" // minimap2 options minimap2_ont_model = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 68f10b2f..cf1ab5cd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -77,6 +77,19 @@ "fa_icon": "fas fa-database", "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself.", "default": "" + }, + "vep_cache_version": { + "type": "string", + "description": "Version of the VEP cache to use.", + "fa_icon": "fas fa-hashtag", + "default": "113", + "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." + }, + "vep_args": { + "type": "string", + "description": "Additional command line arguments to pass to VEP.", + "fa_icon": "fas fa-terminal", + "default": "" } } }, diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 6abe12cb..f7cb70d5 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -170,6 +170,14 @@ workflow LR_SOMATIC { vep_cache = Channel.empty() if (! params.skip_vep) { + + params.vep_cache.view() + params.vep_cache_version.view() + params.vep_genome.view() + params.vep_args.view() + params.vep_species.view() + params.download_vep_cache.view() + PREPARE_ANNOTATION ( params.vep_cache, params.vep_cache_version, From 1de04712aa978824cfeb2c9e54a58fa5009321c8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:11:40 +0200 Subject: [PATCH 371/557] more better view command --- workflows/lr_somatic.nf | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index f7cb70d5..90005611 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -171,12 +171,16 @@ workflow LR_SOMATIC { if (! params.skip_vep) { - params.vep_cache.view() - params.vep_cache_version.view() - params.vep_genome.view() - params.vep_args.view() - params.vep_species.view() - params.download_vep_cache.view() + Channel + .of([ + vep_cache: params.vep_cache, + vep_cache_version: params.vep_cache_version, + vep_genome: params.vep_genome, + vep_args: params.vep_args, + vep_species: params.vep_species, + download_vep_cache: params.download_vep_cache + ]) + .view() PREPARE_ANNOTATION ( params.vep_cache, From bab7e29064f89d46f9747d646863f1fa7462bb11 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:17:17 +0200 Subject: [PATCH 372/557] fix --- workflows/lr_somatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 90005611..d0898cb6 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -169,7 +169,7 @@ workflow LR_SOMATIC { vep_cache = Channel.empty() - if (! params.skip_vep) { + if (!params.skip_vep) { Channel .of([ From e8ae65f9a2806c6c837fa6b9b7507de63e93ea00 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:18:51 +0200 Subject: [PATCH 373/557] spacing --- subworkflows/local/prepare_annotation.nf | 66 ++++++++++++------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 8a45bedd..f6b005dd 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -3,40 +3,40 @@ include {ENSEMBLVEP_DOWNLOAD } from '../../modules/nf-core/ensemblvep/download/m workflow PREPARE_ANNOTATION { take: - vep_cache - vep_cache_version - vep_genome - vep_args - vep_species - download_vep_cache + vep_cache + vep_cache_version + vep_genome + vep_args + vep_species + download_vep_cache main: - ch_versions = Channel.empty() - ensemblvep_cache = Channel.empty() - - if (download_vep_cache) { - vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) - ENSEMBLVEP_DOWNLOAD(vep_download_info) - ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache - ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) - - } - else if (!vep_cache) { - def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" - def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') - def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" - def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') - if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { - if (vep_cache == "s3://annotation-cache/vep_cache/") { - error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") - } else { - error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") - } - } - - ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() - } + ch_versions = Channel.empty() + ensemblvep_cache = Channel.empty() + + if (download_vep_cache) { + vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) + ENSEMBLVEP_DOWNLOAD(vep_download_info) + ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache + ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) + + } + else if (!vep_cache) { + def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" + def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') + def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" + def vep_cache_path_full = file("$vep_cache/$vep_cache_dir", type: 'dir') + if ( !vep_cache_path_full.exists() || !vep_cache_path_full.isDirectory() ) { + if (vep_cache == "s3://annotation-cache/vep_cache/") { + error("This path is not available within annotation-cache.\nPlease check https://annotation-cache.github.io/ to create a request for it.") + } else { + error("Path provided with VEP cache is invalid.\nMake sure there is a directory named ${vep_cache_dir} in ${vep_cache}./n") + } + } + + ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() + } @@ -46,7 +46,7 @@ workflow PREPARE_ANNOTATION { emit: - vep_cache = ensemblvep_cache - versions = ch_versions + vep_cache = ensemblvep_cache + versions = ch_versions } \ No newline at end of file From 9184ce278a9b26e9d9736ec35b446e3e62f80d76 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:28:04 +0200 Subject: [PATCH 374/557] remove if --- workflows/lr_somatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d0898cb6..aded61e7 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -169,7 +169,7 @@ workflow LR_SOMATIC { vep_cache = Channel.empty() - if (!params.skip_vep) { + //if (!params.skip_vep) { Channel .of([ @@ -193,7 +193,7 @@ workflow LR_SOMATIC { vep_cache = PREPARE_ANNOTATION.out.vep_cache - } + //} ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta From 9e5a8a0ca9da5d0efb37f17acc25a1c1920cfc6b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:31:34 +0200 Subject: [PATCH 375/557] fix if --- subworkflows/local/prepare_annotation.nf | 2 +- workflows/lr_somatic.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index f6b005dd..df03d1e9 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -22,7 +22,7 @@ workflow PREPARE_ANNOTATION { ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) } - else if (!vep_cache) { + else { def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index aded61e7..d0898cb6 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -169,7 +169,7 @@ workflow LR_SOMATIC { vep_cache = Channel.empty() - //if (!params.skip_vep) { + if (!params.skip_vep) { Channel .of([ @@ -193,7 +193,7 @@ workflow LR_SOMATIC { vep_cache = PREPARE_ANNOTATION.out.vep_cache - //} + } ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta From 3f6942528c74a8d921e68b30bbbbdf464bab88f6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 9 Sep 2025 10:37:56 +0200 Subject: [PATCH 376/557] fix aws path --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index adb5dc55..e219dbff 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,7 +19,7 @@ params { igenomes_ignore = false // Annotation - vep_cache = 's3://ngi-igenomes/igenomes/' + vep_cache = 's3://annotation-cache/vep_cache/' vep_cache_version = "113" download_vep_cache = false vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" From aa07a83d20d1c3feb0348c559d2ee5418a569105 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 10 Sep 2025 16:04:52 +0200 Subject: [PATCH 377/557] fix vep output path --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index eb8aff02..ca8265a8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -310,14 +310,14 @@ process { } withName : '.*:GERMLINE_VEP' { publishDir = [ - path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + path: { "${params.outdir}/${meta.id}/VEP/germline/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName : '.*:SV_VEP' { publishDir = [ - path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + path: { "${params.outdir}/${meta.id}/VEP/SVs/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 8d49dfdb34e65fa3121d5b8a572957cb1bea4a96 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 09:54:49 +0200 Subject: [PATCH 378/557] add prefixes to vep modules --- conf/modules.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index ca8265a8..24e1ee91 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -302,6 +302,7 @@ process { ] } withName : '.*:SOMATIC_VEP' { + ext.prefix = { "${meta.id}_SOMATIC_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, mode: params.publish_dir_mode, @@ -309,6 +310,7 @@ process { ] } withName : '.*:GERMLINE_VEP' { + ext.prefix = { "${meta.id}_GERMLINE_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/VEP/germline/" }, mode: params.publish_dir_mode, @@ -316,6 +318,7 @@ process { ] } withName : '.*:SV_VEP' { + ext.prefix = { "${meta.id}_SV_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/VEP/SVs/" }, mode: params.publish_dir_mode, From e7ba6471d897066c8cc634d9119d9b4e562bfb3c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 10:14:32 +0200 Subject: [PATCH 379/557] fix version formatting --- workflows/lr_somatic.nf | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index d0898cb6..50ed9f6d 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -368,6 +368,8 @@ workflow LR_SOMATIC { ch_fasta, [] ) + + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) // // MODULE: SOMATIC_VEP @@ -383,7 +385,6 @@ workflow LR_SOMATIC { [] ) - ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) } @@ -415,8 +416,8 @@ workflow LR_SOMATIC { return [meta,vcf, extra] } .set { sv_vep } - - SV_VEP ( + if(!params.skip_vep) { + SV_VEP ( sv_vep, params.vep_genome, params.vep_species, @@ -426,6 +427,10 @@ workflow LR_SOMATIC { [] ) + ch_versions = ch_versions.mix(SV_VEP.out.versions) + } + + // // MODULE: CRAMINO // From a61f2526a7b6f3feb39e228ef1c8e5583374e057 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 13:31:34 +0200 Subject: [PATCH 380/557] gzip severus --- modules/nf-core/severus/main.nf | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 6bd54394..8638a669 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -19,13 +19,15 @@ process SEVERUS { tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf //, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions @@ -50,6 +52,12 @@ process SEVERUS { $control \\ $phasing_vcf \\ --out-dir ${prefix} + + bgzip -c ./somatic_SVs/severus_somatic.vcf + tabix -p vcf ./somatic_SVs/severus_somatic.vcf.gz + bgzip -c ./all_SVs/severus_all.vcf + tabix -p vcf ./all_SVs/severus_all.vcf.gz + cat <<-END_VERSIONS > versions.yml "${task.process}": From 4716d6bdca6007c12a55151b037afdd13de367fa Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 13:59:55 +0200 Subject: [PATCH 381/557] fix severus path --- modules/nf-core/severus/main.nf | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 8638a669..db0bf668 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -53,10 +53,10 @@ process SEVERUS { $phasing_vcf \\ --out-dir ${prefix} - bgzip -c ./somatic_SVs/severus_somatic.vcf - tabix -p vcf ./somatic_SVs/severus_somatic.vcf.gz - bgzip -c ./all_SVs/severus_all.vcf - tabix -p vcf ./all_SVs/severus_all.vcf.gz + bgzip -c ${prefix}/somatic_SVs/severus_somatic.vcf + tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz + bgzip -c ${prefix}/all_SVs/severus_all.vcf + tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz cat <<-END_VERSIONS > versions.yml @@ -80,12 +80,14 @@ process SEVERUS { touch ${prefix}/read_ids.csv touch ${prefix}/read_qual.txt touch ${prefix}/breakpoints_double.csv - touch ${prefix}/all_SVs/severus_all.vcf + touch ${prefix}/all_SVs/severus_all.vcf.gz + touch ${prefix}/all_SVs/severus_all.vcf.gz.tbi touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv touch ${prefix}/all_SVs/breakpoints_clusters.tsv touch ${prefix}/all_SVs/plots/severus_0.html touch ${prefix}/all_SVs/plots/severus_1.html - touch ${prefix}/somatic_SVs/severus_somatic.vcf + touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz + touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv touch ${prefix}/somatic_SVs/plots/severus_0.html From 617665afb078d6019b6d63e269519843bc21cc49 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 14:22:55 +0200 Subject: [PATCH 382/557] indexing longphase vcf --- modules/nf-core/longphase/phase/main.nf | 4 ++++ modules/nf-core/severus/main.nf | 2 +- subworkflows/local/tumor_normal_happhase.nf | 3 ++- subworkflows/local/tumor_only_happhase.nf | 5 +++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 7c604ab8..3bd72a2a 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -15,6 +15,7 @@ process LONGPHASE_PHASE { output: tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi path "versions.yml" , emit: versions when: @@ -43,6 +44,8 @@ process LONGPHASE_PHASE { --threads $task.cpus \\ $args2 \\ ${prefix}.vcf + + tabix -p vcf ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -55,6 +58,7 @@ process LONGPHASE_PHASE { def prefix = task.ext.prefix ?: "${meta.id}" """ echo "" | bgzip -c > ${prefix}.vcf.gz + echo "" > ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index db0bf668..9bcfdc3e 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -8,7 +8,7 @@ process SEVERUS { 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: - tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) tuple val(meta2), path(bed), path(pon_path) output: diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f9765c9f..d47e3cb9 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -239,6 +239,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } .join(LONGPHASE_PHASE.out.vcf) + .join(LONGPHASE_PHASE.out.vcf.tbi) .set{tumor_normal_severus} // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] @@ -251,7 +252,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get ClairS input channel tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index d9376683..3c1cdb2f 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -164,14 +164,15 @@ workflow TUMOR_ONLY_HAPPHASE { haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.vcf) - .map{meta, hap_bam, hap_bai, vcf -> + .join(LONGPHASE_PHASE.out.vcf.tbi) + .map{meta, hap_bam, hap_bai, vcf,tbi -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - return[new_meta, hap_bam, hap_bai, [],[], vcf] + return[new_meta, hap_bam, hap_bai, [],[], vcf,tbi] } .set{ tumor_only_severus } From c4ee1a65ff6bbcc0450d3e2c57d738f78a5d954a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 14:28:14 +0200 Subject: [PATCH 383/557] fix tbi reference --- subworkflows/local/tumor_normal_happhase.nf | 2 +- subworkflows/local/tumor_only_happhase.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d47e3cb9..f2e52b65 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -239,7 +239,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } .join(LONGPHASE_PHASE.out.vcf) - .join(LONGPHASE_PHASE.out.vcf.tbi) + .join(LONGPHASE_PHASE.out.tbi) .set{tumor_normal_severus} // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 3c1cdb2f..965079f3 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -164,7 +164,7 @@ workflow TUMOR_ONLY_HAPPHASE { haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.vcf) - .join(LONGPHASE_PHASE.out.vcf.tbi) + .join(LONGPHASE_PHASE.out.tbi) .map{meta, hap_bam, hap_bai, vcf,tbi -> def new_meta = [id: meta.id, paired_data: meta.paired_data, From def9b47da4fc2984977999e8eef1ca10fba900ae Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 11 Sep 2025 14:49:18 +0200 Subject: [PATCH 384/557] fix bgziping --- modules/nf-core/severus/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 9bcfdc3e..6790487a 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -53,9 +53,9 @@ process SEVERUS { $phasing_vcf \\ --out-dir ${prefix} - bgzip -c ${prefix}/somatic_SVs/severus_somatic.vcf + bgzip -c ${prefix}/somatic_SVs/severus_somatic.vcf > ${prefix}/somatic_SVs/severus_somatic.vcf.gz tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz - bgzip -c ${prefix}/all_SVs/severus_all.vcf + bgzip -c ${prefix}/all_SVs/severus_all.vcf > ${prefix}/all_SVs/severus_all.vcf.gz tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz From bd7374802f54e3e108a6ae8707533599f1045f26 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 10:36:10 +0200 Subject: [PATCH 385/557] Update subworkflows/local/tumor_only_happhase.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- subworkflows/local/tumor_only_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 965079f3..b0b4c000 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -86,7 +86,6 @@ workflow TUMOR_ONLY_HAPPHASE { def extra = [] return [meta,vcf, extra] } - .view() .set { germline_vep } // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] From ecbad61d4f4be6ba725684070ca8b6883e23ff3b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 10:36:21 +0200 Subject: [PATCH 386/557] Update workflows/lr_somatic.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- workflows/lr_somatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 50ed9f6d..84b9adcd 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -595,8 +595,8 @@ workflow LR_SOMATIC { ) emit: - multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html - versions = ch_versions // channel: [ path(versions.yml) ] + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] From ef721986e5167591f1e5a246bcc5a05ba29f3636 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 10:36:40 +0200 Subject: [PATCH 387/557] Update workflows/lr_somatic.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 84b9adcd..a34fdf87 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -180,7 +180,6 @@ workflow LR_SOMATIC { vep_species: params.vep_species, download_vep_cache: params.download_vep_cache ]) - .view() PREPARE_ANNOTATION ( params.vep_cache, From 7b27a3d89d3e28d652e8c6eac84ef23c3304d41f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 10:40:08 +0200 Subject: [PATCH 388/557] fix copilot suggestions --- workflows/lr_somatic.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 50ed9f6d..655d8373 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -43,7 +43,7 @@ include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_hap /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - RUN MAIN WORKFLOWx + RUN MAIN WORKFLOW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -347,8 +347,7 @@ workflow LR_SOMATIC { branched_minimap.tumor_only, ch_fasta, ch_fai, - clairs_modelMap, - + clairs_modelMap ) germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) From 066af15c4ef6b5f91c3e6a168817a535a081c714 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 11:05:49 +0200 Subject: [PATCH 389/557] patch --- modules.json | 103 +++++++++++++----- .../longphase/phase/longphase-phase.diff | 36 ++++++ 2 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 modules/nf-core/longphase/phase/longphase-phase.diff diff --git a/modules.json b/modules.json index 68aa711f..bbe0472c 100644 --- a/modules.json +++ b/modules.json @@ -8,111 +8,154 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -121,25 +164,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff new file mode 100644 index 00000000..88e27a57 --- /dev/null +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -0,0 +1,36 @@ +Changes in component 'nf-core/longphase/phase' +'modules/nf-core/longphase/phase/meta.yml' is unchanged +Changes in 'longphase/phase/main.nf': +--- modules/nf-core/longphase/phase/main.nf ++++ modules/nf-core/longphase/phase/main.nf +@@ -15,6 +15,7 @@ + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf ++ tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml" , emit: versions + + when: +@@ -43,6 +44,8 @@ + --threads $task.cpus \\ + $args2 \\ + ${prefix}.vcf ++ ++ tabix -p vcf ${prefix}.vcf.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +@@ -55,6 +58,7 @@ + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | bgzip -c > ${prefix}.vcf.gz ++ echo "" > ${prefix}.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + +'modules/nf-core/longphase/phase/environment.yml' is unchanged +'modules/nf-core/longphase/phase/tests/main.nf.test' is unchanged +'modules/nf-core/longphase/phase/tests/main.nf.test.snap' is unchanged +'modules/nf-core/longphase/phase/tests/nextflow.config' is unchanged +************************************************************ From a6278ce5a4d72ed8dcae255dfd69aba513fd7617 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 11:18:51 +0200 Subject: [PATCH 390/557] fix schema --- modules.json | 102 +++++++++++-------------------------------- nextflow_schema.json | 3 -- 2 files changed, 26 insertions(+), 79 deletions(-) diff --git a/modules.json b/modules.json index bbe0472c..f2ed24fa 100644 --- a/modules.json +++ b/modules.json @@ -8,154 +8,112 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -164,33 +122,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index cf1ab5cd..4a444794 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -76,20 +76,17 @@ "description": "Path to VEP cache directory.", "fa_icon": "fas fa-database", "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself.", - "default": "" }, "vep_cache_version": { "type": "string", "description": "Version of the VEP cache to use.", "fa_icon": "fas fa-hashtag", - "default": "113", "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." }, "vep_args": { "type": "string", "description": "Additional command line arguments to pass to VEP.", "fa_icon": "fas fa-terminal", - "default": "" } } }, From a12ea73ebe59713139b79351d5fc384d3c21e68b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 11:21:38 +0200 Subject: [PATCH 391/557] fix schema --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 4a444794..93c78a04 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -75,7 +75,7 @@ "type": "string", "description": "Path to VEP cache directory.", "fa_icon": "fas fa-database", - "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself.", + "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." }, "vep_cache_version": { "type": "string", @@ -86,7 +86,7 @@ "vep_args": { "type": "string", "description": "Additional command line arguments to pass to VEP.", - "fa_icon": "fas fa-terminal", + "fa_icon": "fas fa-terminal" } } }, From 09cd7b540a34c35e80ae1127c4e9fa05e4a884b8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 11:28:40 +0200 Subject: [PATCH 392/557] fix test --- conf/test.config | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index c1a9e6b3..5a49647e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,11 +27,10 @@ params { // Input data //input = "/staging/leuven/stg_00096/home/rforsyth/lr_somatic/assets/test_sheet.csv" input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" - fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/CHM13V2_maskedY_rCRS_chr19.fa.gz" // Additional params - genome = "CHM13" - ascat_chroms = "19" + + genome = "GRCh38" ascat_min_counts = 2 skip_wakhan = true skip_ascat = true From f3cdef16c4bfc12396db1c87211a0f000fd2b60b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 14:30:26 +0200 Subject: [PATCH 393/557] precommit fix --- conf/modules.config | 2 +- conf/test.config | 3 +-- nextflow.config | 2 +- subworkflows/local/prepare_annotation.nf | 6 +++--- subworkflows/local/tumor_normal_happhase.nf | 2 +- workflows/lr_somatic.nf | 4 ++-- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 24e1ee91..36996643 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -325,5 +325,5 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + } diff --git a/conf/test.config b/conf/test.config index 5a49647e..4cfd593b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -29,10 +29,9 @@ params { input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" // Additional params - + genome = "GRCh38" ascat_min_counts = 2 skip_wakhan = true skip_ascat = true - wakhan_chroms = "chr19" } diff --git a/nextflow.config b/nextflow.config index e219dbff..80f5bbba 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,7 +21,7 @@ params { // Annotation vep_cache = 's3://annotation-cache/vep_cache/' vep_cache_version = "113" - download_vep_cache = false + download_vep_cache = false vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index df03d1e9..76b5fdf5 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -14,7 +14,7 @@ workflow PREPARE_ANNOTATION { ch_versions = Channel.empty() ensemblvep_cache = Channel.empty() - + if (download_vep_cache) { vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) ENSEMBLVEP_DOWNLOAD(vep_download_info) @@ -47,6 +47,6 @@ workflow PREPARE_ANNOTATION { emit: vep_cache = ensemblvep_cache - versions = ch_versions + versions = ch_versions -} \ No newline at end of file +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f2e52b65..1c0a3d8f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -93,7 +93,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) - + ch_versions = ch_versions.mix(CLAIR3.out.versions) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 630acb28..c4eb42a7 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -366,7 +366,7 @@ workflow LR_SOMATIC { ch_fasta, [] ) - + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) // @@ -427,7 +427,7 @@ workflow LR_SOMATIC { ch_versions = ch_versions.mix(SV_VEP.out.versions) } - + // // MODULE: CRAMINO From 3e9499bcd8aae7b42ad48b5c970208c1f837f201 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 14:45:38 +0200 Subject: [PATCH 394/557] fix output --- conf/modules.config | 1 - modules/nf-core/severus/main.nf | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 36996643..f75bf81d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,7 +195,6 @@ process { ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/${meta.id}/phased_vcfs" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 6790487a..23af8411 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -53,9 +53,9 @@ process SEVERUS { $phasing_vcf \\ --out-dir ${prefix} - bgzip -c ${prefix}/somatic_SVs/severus_somatic.vcf > ${prefix}/somatic_SVs/severus_somatic.vcf.gz + bgzip ${prefix}/somatic_SVs/severus_somatic.vcf tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz - bgzip -c ${prefix}/all_SVs/severus_all.vcf > ${prefix}/all_SVs/severus_all.vcf.gz + bgzip ${prefix}/all_SVs/severus_all.vcf tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz From 3f8ed0dbf1b2a9f6c9a0a1e5329efe934e19f839 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 15:09:04 +0200 Subject: [PATCH 395/557] Disable pubDir for longphase --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index f75bf81d..ab84cedb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,6 +195,7 @@ process { ].join(' ').trim() } publishDir = [ + endabled = false, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 01ed0217212209a2e1be4dcae8c84846f506640e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 12 Sep 2025 15:12:05 +0200 Subject: [PATCH 396/557] minor changes --- conf/igenomes.config | 4 +- modules.json | 102 +++++++++++++----- .../longphase/phase/longphase-phase.diff | 12 ++- modules/nf-core/longphase/phase/main.nf | 6 +- modules/nf-core/severus/severus.diff | 49 +++++++-- subworkflows/local/tumor_normal_happhase.nf | 3 - 6 files changed, 129 insertions(+), 47 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 8f48e98f..0e37a467 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -19,8 +19,8 @@ params { centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" - vep_genome = "GRCh38" - vep_species = "homo_sapiens" + vep_genome = "GRCh38" + vep_species = "homo_sapiens" } 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" diff --git a/modules.json b/modules.json index f2ed24fa..bbe0472c 100644 --- a/modules.json +++ b/modules.json @@ -8,112 +8,154 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -122,25 +164,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff index 88e27a57..43a29b24 100644 --- a/modules/nf-core/longphase/phase/longphase-phase.diff +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -3,14 +3,18 @@ Changes in component 'nf-core/longphase/phase' Changes in 'longphase/phase/main.nf': --- modules/nf-core/longphase/phase/main.nf +++ modules/nf-core/longphase/phase/main.nf -@@ -15,6 +15,7 @@ +@@ -14,8 +14,9 @@ + output: - tuple val(meta), path("*.vcf.gz"), emit: vcf -+ tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml" , emit: versions +- tuple val(meta), path("*.vcf.gz"), emit: vcf +- path "versions.yml" , emit: versions ++ tuple val(meta), path("*.vcf.gz") , emit: vcf ++ tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi ++ path "versions.yml" , emit: versions when: + task.ext.when == null || task.ext.when @@ -43,6 +44,8 @@ --threads $task.cpus \\ $args2 \\ diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 3bd72a2a..f8351afd 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -14,9 +14,9 @@ process LONGPHASE_PHASE { output: - tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff index e016d2cd..ab9e56b0 100644 --- a/modules/nf-core/severus/severus.diff +++ b/modules/nf-core/severus/severus.diff @@ -13,31 +13,36 @@ Changes in 'severus/main.nf': + 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: - tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) +- tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) - tuple val(meta2), path(bed) ++ tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) + tuple val(meta2), path(bed), path(pon_path) output: tuple val(meta), path("${prefix}/severus.log") , emit: log -@@ -20,12 +20,12 @@ +@@ -19,13 +19,15 @@ + tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true +- tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf //, optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true ++ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions -@@ -39,12 +39,14 @@ +@@ -39,15 +41,23 @@ def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" @@ -52,6 +57,32 @@ Changes in 'severus/main.nf': $control \\ $phasing_vcf \\ --out-dir ${prefix} ++ ++ bgzip ${prefix}/somatic_SVs/severus_somatic.vcf ++ tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz ++ bgzip ${prefix}/all_SVs/severus_all.vcf ++ tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz ++ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +@@ -70,12 +80,14 @@ + touch ${prefix}/read_ids.csv + touch ${prefix}/read_qual.txt + touch ${prefix}/breakpoints_double.csv +- touch ${prefix}/all_SVs/severus_all.vcf ++ touch ${prefix}/all_SVs/severus_all.vcf.gz ++ touch ${prefix}/all_SVs/severus_all.vcf.gz.tbi + touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/all_SVs/breakpoints_clusters.tsv + touch ${prefix}/all_SVs/plots/severus_0.html + touch ${prefix}/all_SVs/plots/severus_1.html +- touch ${prefix}/somatic_SVs/severus_somatic.vcf ++ touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz ++ touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi + touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv + touch ${prefix}/somatic_SVs/plots/severus_0.html 'modules/nf-core/severus/environment.yml' is unchanged 'modules/nf-core/severus/tests/tags.yml' is unchanged diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 1c0a3d8f..f6f4e077 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -93,8 +93,6 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) - - ch_versions = ch_versions.mix(CLAIR3.out.versions) // Add germline vcf to normal bams @@ -250,7 +248,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // phased_vcf: phased small variant vcf for normal // Get ClairS input channel - tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model From 3310e70b51354e202a51867a0e724ddccc9bb940 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 15:14:30 +0200 Subject: [PATCH 397/557] mix versions --- workflows/lr_somatic.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index c4eb42a7..11452f6b 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -30,6 +30,7 @@ include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/q include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include {ANNOTSV_ANNOTSV } from '../modules/local/annotsv/annotsv/main' // // IMPORT SUBWORKFLOWS // @@ -41,6 +42,7 @@ include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_hap + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -189,7 +191,7 @@ workflow LR_SOMATIC { params.vep_species, params.download_vep_cache ) - + ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) vep_cache = PREPARE_ANNOTATION.out.vep_cache } @@ -425,6 +427,8 @@ workflow LR_SOMATIC { [] ) + + ch_versions = ch_versions.mix(SV_VEP.out.versions) } From 66fa9cca376a1ac384941e6d740a0442c033bdc2 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 15:31:14 +0200 Subject: [PATCH 398/557] Remove vcfsplit TODO + add tbi outputs --- modules/local/vcfsplit/main.nf | 51 ++++++---------------------------- 1 file changed, 8 insertions(+), 43 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 79c1ec7f..ed644a04 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -1,48 +1,24 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. process VCFSPLIT { tag "$meta.id" label 'process_single' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': 'biocontainers/bcftools:1.20--h8b25389_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. + tuple val(meta), path(snv_vcf), path(indel_vcf) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*somatic.vcf.gz"), emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi"), emit: somatic_tbi tuple val(meta), path("*germline.vcf.gz"), emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi"), emit: germline_tbi - // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions when: @@ -51,15 +27,6 @@ process VCFSPLIT { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ bcftools view -i 'FILTER="PASS"' $indel_vcf | bgzip -c > indels_pass.vcf.gz @@ -93,13 +60,11 @@ process VCFSPLIT { stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ - touch ${prefix}.bam - + echo "" | gzip > somatic.vcf.gz + echo "" | gzip > germline.vcf.gz + echo "" | gzip > somatic.vcf.gz.tbi + echo "" | gzip > germline.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') From 3727317c152aef5767fedb7a4c1f155a3c560db8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 12 Sep 2025 15:40:48 +0200 Subject: [PATCH 399/557] precommit --- modules.json | 102 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/modules.json b/modules.json index bbe0472c..f2ed24fa 100644 --- a/modules.json +++ b/modules.json @@ -8,154 +8,112 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -164,33 +122,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 54b2e814e9481a0134a29cce8cadfaba4621200c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 12 Sep 2025 15:47:50 +0200 Subject: [PATCH 400/557] linting --- modules/local/vcfsplit/main.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index ed644a04..c3937110 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -3,14 +3,12 @@ process VCFSPLIT { tag "$meta.id" label 'process_single' - conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': 'biocontainers/bcftools:1.20--h8b25389_0' }" input: - tuple val(meta), path(snv_vcf), path(indel_vcf) output: From 3ece1987b40df540eed2ae09cfbbdd54daeffce9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 12 Sep 2025 15:52:28 +0200 Subject: [PATCH 401/557] remove whitespace --- modules/local/vcfsplit/main.nf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index c3937110..ec69277d 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -1,4 +1,3 @@ - process VCFSPLIT { tag "$meta.id" label 'process_single' @@ -12,12 +11,12 @@ process VCFSPLIT { tuple val(meta), path(snv_vcf), path(indel_vcf) output: - tuple val(meta), path("*somatic.vcf.gz"), emit: somatic_vcf - tuple val(meta), path("*somatic.vcf.gz.tbi"), emit: somatic_tbi - tuple val(meta), path("*germline.vcf.gz"), emit: germline_vcf - tuple val(meta), path("*germline.vcf.gz.tbi"), emit: germline_tbi + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when From e85bedfe88d27bfe3fa25153a5cdd52e6d9a4500 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 12 Sep 2025 16:01:43 +0200 Subject: [PATCH 402/557] fix modules.config --- conf/modules.config | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ab84cedb..cae67294 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,9 +195,7 @@ process { ].join(' ').trim() } publishDir = [ - endabled = false, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + endabled: false ] } From bba27052c2b3f29dd56d331a2724d870080551f0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 17 Sep 2025 09:37:23 +0200 Subject: [PATCH 403/557] Remove ANNOTSV_ANNOTSV import Removed ANNOTSV_ANNOTSV import from lr_somatic.nf --- workflows/lr_somatic.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/lr_somatic.nf b/workflows/lr_somatic.nf index 11452f6b..91513c87 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lr_somatic.nf @@ -30,7 +30,6 @@ include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/q include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include {ANNOTSV_ANNOTSV } from '../modules/local/annotsv/annotsv/main' // // IMPORT SUBWORKFLOWS // From f2b0ac8302170b01213180b536b49a6f0cecded2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 14:24:30 +0200 Subject: [PATCH 404/557] rename pipeline in yml --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index fabff9ad..0ddd11d3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -34,7 +34,7 @@ template: description: Workflow for somatic variant calling of long read data force: false is_nfcore: false - name: lr_somatic + name: lrsomatic org: IntGenomicsLab outdir: . skip_features: From 7a1a59f746546b0b1170e4641590c39ea7973f1b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 14:27:55 +0200 Subject: [PATCH 405/557] Template update for nf-core/tools version 3.3.2 --- .github/CONTRIBUTING.md | 16 +++++----- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 8 ++--- .github/workflows/branch.yml | 4 +-- .github/workflows/fix_linting.yml | 4 +-- .nf-core.yml | 3 +- CHANGELOG.md | 4 +-- CITATIONS.md | 2 +- LICENSE | 2 +- README.md | 16 +++++----- assets/adaptivecard.json | 2 +- assets/email_template.html | 14 ++++---- assets/email_template.txt | 8 ++--- assets/methods_description_template.yml | 8 ++--- assets/multiqc_config.yml | 6 ++-- assets/schema_input.json | 4 +-- assets/sendmail_template.txt | 6 ++-- assets/slackreport.json | 2 +- conf/base.config | 2 +- conf/test.config | 2 +- conf/test_full.config | 2 +- docs/README.md | 4 +-- docs/output.md | 2 +- docs/usage.md | 10 +++--- main.nf | 22 ++++++------- modules.json | 4 +-- nextflow.config | 14 ++++---- nextflow_schema.json | 4 +-- ro-crate-metadata.json | 32 +++++++++---------- .../main.nf | 2 +- tests/default.nf.test | 2 +- tests/nextflow.config | 2 +- workflows/{lr_somatic.nf => lrsomatic.nf} | 6 ++-- 34 files changed, 112 insertions(+), 111 deletions(-) rename subworkflows/local/{utils_nfcore_lr_somatic_pipeline => utils_nfcore_lrsomatic_pipeline}/main.nf (99%) rename workflows/{lr_somatic.nf => lrsomatic.nf} (96%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 40462906..cefff7d3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,9 +1,9 @@ -# `IntGenomicsLab/lr_somatic`: Contributing Guidelines +# `IntGenomicsLab/lrsomatic`: Contributing Guidelines Hi there! -Many thanks for taking an interest in improving IntGenomicsLab/lr_somatic. +Many thanks for taking an interest in improving IntGenomicsLab/lrsomatic. -We try to manage the required tasks for IntGenomicsLab/lr_somatic using GitHub issues, you probably came to this page when creating one. +We try to manage the required tasks for IntGenomicsLab/lrsomatic using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! @@ -11,10 +11,10 @@ Contributions to the code are even more welcome ;) ## Contribution workflow -If you'd like to write some code for IntGenomicsLab/lr_somatic, the standard workflow is as follows: +If you'd like to write some code for IntGenomicsLab/lrsomatic, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lr_somatic issues](https://github.com/IntGenomicsLab/lr_somatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lr_somatic repository](https://github.com/IntGenomicsLab/lr_somatic) to your GitHub account +1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lrsomatic issues](https://github.com/IntGenomicsLab/lrsomatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lrsomatic repository](https://github.com/IntGenomicsLab/lrsomatic) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged @@ -58,7 +58,7 @@ These tests are run both with the latest available version of `Nextflow` and als ## Pipeline contribution conventions -To make the `IntGenomicsLab/lr_somatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. +To make the `IntGenomicsLab/lrsomatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. ### Adding a new step @@ -108,7 +108,7 @@ This repo includes a devcontainer configuration which will create a GitHub Codes To get started: -- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lr_somatic/codespaces) +- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lrsomatic/codespaces) - Tools installed - nf-core - Nextflow diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1cd94f85..458770e1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -39,4 +39,4 @@ body: * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - * Version of IntGenomicsLab/lr_somatic _(eg. 1.1, 1.5, 1.8.2)_ + * Version of IntGenomicsLab/lrsomatic _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 8a49b9b9..0e27f761 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Suggest an idea for the IntGenomicsLab/lr_somatic pipeline +description: Suggest an idea for the IntGenomicsLab/lrsomatic pipeline labels: enhancement body: - type: textarea diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d23d77b4..41961fd1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,21 +1,21 @@ ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lr_somatic/tree/main/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lrsomatic/tree/main/.github/CONTRIBUTING.md) - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 6b774892..0e125373 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,9 +13,9 @@ jobs: steps: # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs - if: github.repository == 'IntGenomicsLab/lr_somatic' + if: github.repository == 'IntGenomicsLab/lrsomatic' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lr_somatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lrsomatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 3d5d07a4..b0cd0ed7 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -9,7 +9,7 @@ jobs: if: > contains(github.event.comment.html_url, '/pull/') && contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'IntGenomicsLab/lr_somatic' + github.repository == 'IntGenomicsLab/lrsomatic' runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later @@ -86,4 +86,4 @@ jobs: issue-number: ${{ github.event.issue.number }} body: | @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. - See [CI log](https://github.com/IntGenomicsLab/lr_somatic/actions/runs/${{ github.run_id }}) for more details. + See [CI log](https://github.com/IntGenomicsLab/lrsomatic/actions/runs/${{ github.run_id }}) for more details. diff --git a/.nf-core.yml b/.nf-core.yml index 2670a3be..bb1d31f6 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -26,6 +26,7 @@ lint: - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText + schema_params: false nf_core_version: 3.3.2 repository_type: pipeline template: @@ -33,7 +34,7 @@ template: description: Workflow for somatic variant calling of long read data force: false is_nfcore: false - name: lr_somatic + name: lrsomatic org: IntGenomicsLab outdir: . skip_features: diff --git a/CHANGELOG.md b/CHANGELOG.md index ee035dca..5b2733d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ -# IntGenomicsLab/lr_somatic: Changelog +# IntGenomicsLab/lrsomatic: Changelog The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## v1.0.0dev - [date] -Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. +Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` diff --git a/CITATIONS.md b/CITATIONS.md index 08105ad6..33c9f5f1 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Citations +# IntGenomicsLab/lrsomatic: Citations ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) diff --git a/LICENSE b/LICENSE index 21de0ec6..27d3cdc5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) The IntGenomicsLab/lr_somatic team +Copyright (c) The IntGenomicsLab/lrsomatic team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index cfe53061..936bef6b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# IntGenomicsLab/lr_somatic +# IntGenomicsLab/lrsomatic -[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml) -[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) +[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) @@ -9,11 +9,11 @@ [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) -[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic) +[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic) ## Introduction -**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ... ```bash -nextflow run IntGenomicsLab/lr_somatic \ +nextflow run IntGenomicsLab/lrsomatic \ -profile \ --input samplesheet.csv \ --outdir @@ -62,7 +62,7 @@ nextflow run IntGenomicsLab/lr_somatic \ ## Credits -IntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester. We thank the following people for their extensive assistance in the development of this pipeline: @@ -75,7 +75,7 @@ If you would like to contribute to this pipeline, please see the [contributing g ## Citations - + diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json index 12604f03..a7f7c25d 100644 --- a/assets/adaptivecard.json +++ b/assets/adaptivecard.json @@ -17,7 +17,7 @@ "size": "Large", "weight": "Bolder", "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", - "text": "IntGenomicsLab/lr_somatic v${version} - ${runName}", + "text": "IntGenomicsLab/lrsomatic v${version} - ${runName}", "wrap": true }, { diff --git a/assets/email_template.html b/assets/email_template.html index 43e12a3f..f1b77923 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -4,21 +4,21 @@ - - IntGenomicsLab/lr_somatic Pipeline Report + + IntGenomicsLab/lrsomatic Pipeline Report
-

IntGenomicsLab/lr_somatic ${version}

+

IntGenomicsLab/lrsomatic ${version}

Run Name: $runName

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

IntGenomicsLab/lr_somatic execution completed unsuccessfully!

+

IntGenomicsLab/lrsomatic execution completed unsuccessfully!

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

The full error message was:

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

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

Pipeline Configuration:

-

IntGenomicsLab/lr_somatic

-

https://github.com/IntGenomicsLab/lr_somatic

+

IntGenomicsLab/lrsomatic

+

https://github.com/IntGenomicsLab/lrsomatic

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

Methods

-

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

+

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

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

${workflow.commandLine}

${tool_citations}

diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index d1ad8766..1a75540e 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,12 +1,12 @@ report_comment: > - This report has been generated by the IntGenomicsLab/lr_somatic + This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. report_section_order: - "IntGenomicsLab-lr_somatic-methods-description": + "IntGenomicsLab-lrsomatic-methods-description": order: -1000 software_versions: order: -1001 - "IntGenomicsLab-lr_somatic-summary": + "IntGenomicsLab-lrsomatic-summary": order: -1002 export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index f35055e5..fb9acd00 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/assets/schema_input.json", - "title": "IntGenomicsLab/lr_somatic pipeline - params.input schema", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/assets/schema_input.json", + "title": "IntGenomicsLab/lrsomatic pipeline - params.input schema", "description": "Schema for the file provided with params.input", "type": "array", "items": { diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 831121de..2e397d1b 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -9,12 +9,12 @@ Content-Type: text/html; charset=utf-8 $email_html --nfcoremimeboundary -Content-Type: image/png;name="IntGenomicsLab-lr_somatic_logo.png" +Content-Type: image/png;name="IntGenomicsLab-lrsomatic_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="IntGenomicsLab-lr_somatic_logo_light.png" +Content-Disposition: inline; filename="IntGenomicsLab-lrsomatic_logo_light.png" -<% out << new File("$projectDir/assets/IntGenomicsLab-lr_somatic_logo_light.png"). +<% out << new File("$projectDir/assets/IntGenomicsLab-lrsomatic_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/assets/slackreport.json b/assets/slackreport.json index c7f8d912..e8425ad8 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "IntGenomicsLab/lr_somatic ${version} - ${runName}", + "author_name": "IntGenomicsLab/lrsomatic ${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/base.config b/conf/base.config index faf3ca1c..9cb82881 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow base config file + IntGenomicsLab/lrsomatic Nextflow base config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on diff --git a/conf/test.config b/conf/test.config index 16c15c34..117abf0c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index 67045bb5..bc82ecba 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test_full, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/README.md b/docs/README.md index 4d1ead62..14889bd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# IntGenomicsLab/lr_somatic: Documentation +# IntGenomicsLab/lrsomatic: Documentation -The IntGenomicsLab/lr_somatic documentation is split into the following pages: +The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. diff --git a/docs/output.md b/docs/output.md index ed388b30..b3f2ed82 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Output +# IntGenomicsLab/lrsomatic: Output ## Introduction diff --git a/docs/usage.md b/docs/usage.md index 3881d3c1..e0528582 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Usage +# IntGenomicsLab/lrsomatic: Usage > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ @@ -55,7 +55,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run IntGenomicsLab/lr_somatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -79,7 +79,7 @@ Pipeline settings can be provided in a `yaml` or `json` file via `-params-file < The above pipeline run specified with a params file in yaml format: ```bash -nextflow run IntGenomicsLab/lr_somatic -profile docker -params-file params.yaml +nextflow run IntGenomicsLab/lrsomatic -profile docker -params-file params.yaml ``` with: @@ -98,14 +98,14 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: ```bash -nextflow pull IntGenomicsLab/lr_somatic +nextflow pull IntGenomicsLab/lrsomatic ``` ### Reproducibility It is a good idea to specify the pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [IntGenomicsLab/lr_somatic releases page](https://github.com/IntGenomicsLab/lr_somatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. +First, go to the [IntGenomicsLab/lrsomatic releases page](https://github.com/IntGenomicsLab/lrsomatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. diff --git a/main.nf b/main.nf index 502dad5c..21003825 100644 --- a/main.nf +++ b/main.nf @@ -1,9 +1,9 @@ #!/usr/bin/env nextflow /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic + IntGenomicsLab/lrsomatic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Github : https://github.com/IntGenomicsLab/lr_somatic + Github : https://github.com/IntGenomicsLab/lrsomatic ---------------------------------------------------------------------------------------- */ @@ -13,10 +13,10 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { LR_SOMATIC } from './workflows/lr_somatic' -include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { LRSOMATIC } from './workflows/lrsomatic' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,7 +38,7 @@ params.fasta = getGenomeAttribute('fasta') // // WORKFLOW: Run main analysis pipeline depending on type of input // -workflow INTGENOMICSLAB_LR_SOMATIC { +workflow INTGENOMICSLAB_LRSOMATIC { take: samplesheet // channel: samplesheet read in from --input @@ -48,11 +48,11 @@ workflow INTGENOMICSLAB_LR_SOMATIC { // // WORKFLOW: Run pipeline // - LR_SOMATIC ( + LRSOMATIC ( samplesheet ) emit: - multiqc_report = LR_SOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html + multiqc_report = LRSOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -78,7 +78,7 @@ workflow { // // WORKFLOW: Run main workflow // - INTGENOMICSLAB_LR_SOMATIC ( + INTGENOMICSLAB_LRSOMATIC ( PIPELINE_INITIALISATION.out.samplesheet ) // @@ -91,7 +91,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - INTGENOMICSLAB_LR_SOMATIC.out.multiqc_report + INTGENOMICSLAB_LRSOMATIC.out.multiqc_report ) } diff --git a/modules.json b/modules.json index 3d579e49..d4b076ce 100644 --- a/modules.json +++ b/modules.json @@ -1,6 +1,6 @@ { - "name": "IntGenomicsLab/lr_somatic", - "homePage": "https://github.com/IntGenomicsLab/lr_somatic", + "name": "IntGenomicsLab/lrsomatic", + "homePage": "https://github.com/IntGenomicsLab/lrsomatic", "repos": { "https://github.com/nf-core/modules.git": { "modules": { diff --git a/nextflow.config b/nextflow.config index e72ca43d..9022a87c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow config file + IntGenomicsLab/lrsomatic Nextflow config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- @@ -172,13 +172,13 @@ profiles { // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. -// Load IntGenomicsLab/lr_somatic custom profiles from different institutions. +// Load IntGenomicsLab/lrsomatic custom profiles from different institutions. includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" -// Load IntGenomicsLab/lr_somatic custom profiles from different institutions. +// Load IntGenomicsLab/lrsomatic custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lr_somatic.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -234,7 +234,7 @@ dag { } manifest { - name = 'IntGenomicsLab/lr_somatic' + name = 'IntGenomicsLab/lrsomatic' contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -246,7 +246,7 @@ manifest { orcid: '' ], ] - homePage = 'https://github.com/IntGenomicsLab/lr_somatic' + homePage = 'https://github.com/IntGenomicsLab/lrsomatic' description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'main' @@ -265,7 +265,7 @@ validation { monochromeLogs = params.monochrome_logs help { enabled = true - command = "nextflow run IntGenomicsLab/lr_somatic -profile --input samplesheet.csv --outdir " + command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " fullParameter = "help_full" showHiddenParameter = "show_hidden" } diff --git a/nextflow_schema.json b/nextflow_schema.json index a33030c5..5e11598c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/nextflow_schema.json", - "title": "IntGenomicsLab/lr_somatic pipeline parameters", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/nextflow_schema.json", + "title": "IntGenomicsLab/lrsomatic pipeline parameters", "description": "Workflow for somatic variant calling of long read data", "type": "object", "$defs": { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 6853f2b9..b7daf6f6 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-08-19T12:50:31+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-09-17T12:26:04+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -86,17 +86,17 @@ "@id": ".prettierignore" } ], - "isBasedOn": "https://github.com/IntGenomicsLab/lr_somatic", + "isBasedOn": "https://github.com/IntGenomicsLab/lrsomatic", "license": "MIT", "mainEntity": { "@id": "main.nf" }, "mentions": [ { - "@id": "#a139db82-4b01-4551-b52e-f123de74eaff" + "@id": "#f4372c5c-a777-432b-87e8-dcf239c9c331" } ], - "name": "IntGenomicsLab/lr_somatic" + "name": "IntGenomicsLab/lrsomatic" }, { "@id": "ro-crate-metadata.json", @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-08-19T14:50:31Z", + "dateModified": "2025-09-17T14:26:04Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -131,7 +131,7 @@ "MIT" ], "name": [ - "IntGenomicsLab/lr_somatic" + "IntGenomicsLab/lrsomatic" ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" @@ -140,8 +140,8 @@ "@id": "https://nf-co.re/" }, "url": [ - "https://github.com/IntGenomicsLab/lr_somatic", - "https://nf-co.re/IntGenomicsLab/lr_somatic/dev/" + "https://github.com/IntGenomicsLab/lrsomatic", + "https://nf-co.re/IntGenomicsLab/lrsomatic/dev/" ], "version": [ "1.0.0dev" @@ -157,26 +157,26 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=24.10.5" }, { - "@id": "#a139db82-4b01-4551-b52e-f123de74eaff", + "@id": "#f4372c5c-a777-432b-87e8-dcf239c9c331", "@type": "TestSuite", "instance": [ { - "@id": "#b060d05a-473b-4855-a269-4c85c86160bf" + "@id": "#d45cd938-4370-4c70-8435-dca43e0a0a87" } ], "mainEntity": { "@id": "main.nf" }, - "name": "Test suite for IntGenomicsLab/lr_somatic" + "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#b060d05a-473b-4855-a269-4c85c86160bf", + "@id": "#d45cd938-4370-4c70-8435-dca43e0a0a87", "@type": "TestInstance", - "name": "GitHub Actions workflow for testing IntGenomicsLab/lr_somatic", - "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/nf-test.yml", + "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", + "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf similarity index 99% rename from subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf rename to subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index a3dc87c5..78e6d71f 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -1,5 +1,5 @@ // -// Subworkflow with functionality specific to the IntGenomicsLab/lr_somatic pipeline +// Subworkflow with functionality specific to the IntGenomicsLab/lrsomatic pipeline // /* diff --git a/tests/default.nf.test b/tests/default.nf.test index 047ddd98..1d3a963a 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -23,7 +23,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/lr_somatic_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/nextflow.config b/tests/nextflow.config index 1316177c..59f352c4 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -8,7 +8,7 @@ // Or any resources requirements params { modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/lr_somatic' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/lrsomatic' } aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/workflows/lr_somatic.nf b/workflows/lrsomatic.nf similarity index 96% rename from workflows/lr_somatic.nf rename to workflows/lrsomatic.nf index 922fbf25..f92e50c0 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lrsomatic.nf @@ -7,7 +7,7 @@ include { MULTIQC } from '../modules/nf-core/multiqc/main' include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -15,7 +15,7 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -workflow LR_SOMATIC { +workflow LRSOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input @@ -30,7 +30,7 @@ workflow LR_SOMATIC { softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", - name: 'lr_somatic_software_' + 'mqc_' + 'versions.yml', + name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', sort: true, newLine: true ).set { ch_collated_versions } From 2ccd7e2aec5385b032038712b50dede8c3122cad Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 14:37:20 +0200 Subject: [PATCH 406/557] remove _ in missed include statement --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 837c956b..0bb48226 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -8,7 +8,7 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' -include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' // // IMPORT MODULES From f4a3bd2baada6028a57c70f4e358e98655e9a0d8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 15:28:45 +0200 Subject: [PATCH 407/557] fix robert typo --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index cae67294..153a8c6a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,7 +195,7 @@ process { ].join(' ').trim() } publishDir = [ - endabled: false + enabled: false ] } From 4448c23f5460d4e33541a5bd1ecd96fbbeb94dd2 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 15:28:52 +0200 Subject: [PATCH 408/557] remove channel view --- subworkflows/local/tumor_only_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index b0b4c000..8303eb7c 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -78,7 +78,6 @@ workflow TUMOR_ONLY_HAPPHASE { def extra = [] return [meta,vcf, extra] } - .view() .set { somatic_vep } VCFSPLIT.out.germline_vcf From e880167a4f8343594919d674108e016456ba4a0a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:08:00 +0200 Subject: [PATCH 409/557] adjusting test profile --- conf/test.config | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index afc05aa9..bad717ff 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,13 +25,11 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - //input = "/staging/leuven/stg_00096/home/rforsyth/lr_somatic/assets/test_sheet.csv" input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" // Additional params - genome = "GRCh38" - ascat_min_counts = 2 skip_wakhan = true skip_ascat = true } From a4abd9847aa7bfc1e1e93a104a351ba23cf225fb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:11:10 +0200 Subject: [PATCH 410/557] linting and trailing merge conflict --- .nf-core.yml | 1 - README.md | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d1a31c2e..0ddd11d3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -27,7 +27,6 @@ lint: - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText - schema_params: false nf_core_version: 3.3.2 repository_type: pipeline template: diff --git a/README.md b/README.md index dd46a3c2..43d75447 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,7 @@ nextflow run IntGenomicsLab/lrsomatic \ ## Credits -<<<<<<< HEAD -IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Alexandra Pančíková, Robert Forsyth, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. -======= -IntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester. ->>>>>>> TEMPLATE +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. ## Pipeline output From 24939cef6e9f9893381964850d352bcad0d02178 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:18:09 +0200 Subject: [PATCH 411/557] remove required logo files --- .nf-core.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 0ddd11d3..858cbbe9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,9 +2,6 @@ lint: schema_params: false files_exist: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png - .github/ISSUE_TEMPLATE/config.yml - .github/workflows/awstest.yml - .github/workflows/awsfulltest.yml From e23690e9d5ec2d573d91a05aabacb735ad807c9c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:23:25 +0200 Subject: [PATCH 412/557] remove required logo files --- .nf-core.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 858cbbe9..e540b200 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -7,9 +7,6 @@ lint: - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md From 59f7602cef10c82c15cf73c33a8e37d20b3f1ce7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:28:53 +0200 Subject: [PATCH 413/557] update ro-crate --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b7daf6f6..81a1843a 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-09-17T12:26:04+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\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\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\nresults\n|\n\u251c\u2500\u2500 multiqc\n\u2502\n\u251c\u2500\u2500 sample1\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumour\n\u2502 \u2502 \u2514\u2500\u2500 normal\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u2502 \u2514\u2500\u2500 clairs\n\u2502 \u2514\u2500\u2500 ascat\n\u2502\n\u2514\u2500\u2500 sample2\n \u251c\u2500\u2500 bamfiles\n \u251c\u2500\u2500 qc\n \u2502 \u251c\u2500\u2500 tumour\n \u2502 \u2514\u2500\u2500 normal\n \u251c\u2500\u2500 variants\n \u2502 \u251c\u2500\u2500 severus\n \u2502 \u2514\u2500\u2500 clairs\n \u2514\u2500\u2500 ascat\n```\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From a5d1a9e65006c0a31bf71d72a5b50122ff87ea2d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 17 Sep 2025 17:34:07 +0200 Subject: [PATCH 414/557] yml change --- .nf-core.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index e540b200..d703c977 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,11 +2,17 @@ lint: schema_params: false files_exist: - CODE_OF_CONDUCT.md + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/config.yml - .github/workflows/awstest.yml - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md From e399056e9eb202476207ffdf0ca40d57b0f06189 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 18 Sep 2025 15:23:00 +0200 Subject: [PATCH 415/557] give custom vep genome for smaller cache download --- conf/test.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/test.config b/conf/test.config index bad717ff..416ed610 100644 --- a/conf/test.config +++ b/conf/test.config @@ -30,6 +30,8 @@ params { // Additional params genome = "GRCh38" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" skip_wakhan = true skip_ascat = true } From 5b0dad8d880f10cf00c48efaacc69bc0c7515e14 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 18 Sep 2025 16:39:31 +0200 Subject: [PATCH 416/557] add test snapshot --- tests/default.nf.test.snap | 154 +++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 tests/default.nf.test.snap diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 00000000..4efc627f --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,154 @@ +{ + "-profile test": { + "content": [ + 44, + { + "CRAMINO_POST": { + "cramino": "1.0.0" + }, + "CRAMINO_PRE": { + "cramino": "1.0.0" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283", + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_FAIDX": { + "samtools": 1.21 + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.21 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.21 + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "WGET": { + "wget": "1.21.4" + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.0.0dev" + } + }, + [ + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam", + "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam", + "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample2", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam", + "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam", + "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample3", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam", + "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats" + ], + [ + "sample1_cramino.txt:md5,1a93fb552d230ffb98b66d7f432538ab", + "sample1_cramino.txt:md5,aa96490d5f0d66a16e227d89fbf254a7", + "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", + "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", + "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", + "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", + "sample1_cramino.txt:md5,90d387928e9e5f73a4f01a8eda55e70a", + "sample1_cramino.txt:md5,9fc6b4e3c81e27fecc09303440eb24b8", + "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample2_cramino.txt:md5,aa2687a0f4201845902e9e0cd92b5ae1", + "sample2_cramino.txt:md5,8076f6d3e5d6eca109db4700fc6e915b", + "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", + "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", + "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", + "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", + "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", + "sample2_cramino.txt:md5,790b504173aa19ebccfb284ba11f03df", + "sample2_cramino.txt:md5,fdfd3e6c77d3239bb5affe0122a82648", + "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", + "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", + "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", + "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", + "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", + "sample3_cramino.txt:md5,0764bc4e1a94d6c080e40b79a2b3738a", + "sample3_cramino.txt:md5,9fc6b4e3c81e27fecc09303440eb24b8", + "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-18T16:15:18.149702781" + } +} \ No newline at end of file From 93784ef9e3040523a78de662cea6991046124802 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 22 Sep 2025 15:06:16 +0200 Subject: [PATCH 417/557] new snap --- tests/default.nf.test.snap | 321 +++++++++++++++++++++++++++++++++++-- 1 file changed, 307 insertions(+), 14 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 4efc627f..650e3e68 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,14 +1,33 @@ { "-profile test": { "content": [ - 44, + 78, { + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.1" + }, + "CLAIRSTO": { + "clairsto": "0.4.0" + }, "CRAMINO_POST": { "cramino": "1.0.0" }, "CRAMINO_PRE": { "cramino": "1.0.0" }, + "GERMLINE_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "1.7.3" + }, + "LONGPHASE_PHASE": { + "longphase": "1.7.3" + }, "METAEXTRACT": { "samtools": 1.21 }, @@ -28,15 +47,32 @@ "SAMTOOLS_IDXSTATS": { "samtools": 1.21 }, + "SAMTOOLS_INDEX": { + "samtools": 1.21 + }, "SAMTOOLS_STATS": { "samtools": 1.21 }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, "UNTAR": { "untar": 1.34 }, "UNZIP_FASTA": { "pigz": 2.8 }, + "VCFSPLIT": { + "vcfsplit": 1.2 + }, "WGET": { "wget": "1.21.4" }, @@ -45,9 +81,56 @@ } }, [ + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_report.html", "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", + "sample1/VEP", + "sample1/VEP/SVs", + "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz", + "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/VEP/germline", + "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/VEP/somatic", + "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -66,10 +149,55 @@ "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", "sample1/qc/tumor/cramino_ubam", "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", "sample1/qc/tumor/samtools", "sample1/qc/tumor/samtools/sample1.flagstat", "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/sample1.vcf.gz", + "sample1/variants/clairs/sample1.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/sample1", + "sample1/variants/severus/sample1/all_SVs", + "sample1/variants/severus/sample1/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/sample1/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/sample1/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/sample1/all_SVs/severus_all.vcf.gz.tbi", + "sample1/variants/severus/sample1/breakpoints_double.csv", + "sample1/variants/severus/sample1/read_ids.csv", + "sample1/variants/severus/sample1/read_qual.txt", + "sample1/variants/severus/sample1/severus.log", + "sample1/variants/severus/sample1/somatic_SVs", + "sample1/variants/severus/sample1/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/sample1/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/sample1/somatic_SVs/severus_somatic.vcf.gz", + "sample1/variants/severus/sample1/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample2", + "sample2/VEP", + "sample2/VEP/SVs", + "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz", + "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/VEP/germline", + "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/VEP/somatic", + "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -95,7 +223,46 @@ "sample2/qc/tumor/samtools/sample2.flagstat", "sample2/qc/tumor/samtools/sample2.idxstats", "sample2/qc/tumor/samtools/sample2.stats", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/sample2.vcf.gz", + "sample2/variants/clairs/sample2.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/sample2", + "sample2/variants/severus/sample2/all_SVs", + "sample2/variants/severus/sample2/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/sample2/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/sample2/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/sample2/all_SVs/severus_all.vcf.gz.tbi", + "sample2/variants/severus/sample2/breakpoints_double.csv", + "sample2/variants/severus/sample2/read_ids.csv", + "sample2/variants/severus/sample2/read_qual.txt", + "sample2/variants/severus/sample2/severus.log", + "sample2/variants/severus/sample2/somatic_SVs", + "sample2/variants/severus/sample2/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/sample2/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/sample2/somatic_SVs/severus_somatic.vcf.gz", + "sample2/variants/severus/sample2/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample3", + "sample3/VEP", + "sample3/VEP/SVs", + "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz", + "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/VEP/germline", + "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/VEP/somatic", + "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", @@ -108,47 +275,173 @@ "sample3/qc/tumor/samtools", "sample3/qc/tumor/samtools/sample3.flagstat", "sample3/qc/tumor/samtools/sample3.idxstats", - "sample3/qc/tumor/samtools/sample3.stats" + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/sample3", + "sample3/variants/severus/sample3/all_SVs", + "sample3/variants/severus/sample3/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/sample3/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/sample3/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/sample3/all_SVs/severus_all.vcf.gz.tbi", + "sample3/variants/severus/sample3/breakpoints_double.csv", + "sample3/variants/severus/sample3/read_ids.csv", + "sample3/variants/severus/sample3/read_qual.txt", + "sample3/variants/severus/sample3/severus.log", + "sample3/variants/severus/sample3/somatic_SVs", + "sample3/variants/severus/sample3/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/sample3/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz", + "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz.tbi" ], [ - "sample1_cramino.txt:md5,1a93fb552d230ffb98b66d7f432538ab", - "sample1_cramino.txt:md5,aa96490d5f0d66a16e227d89fbf254a7", + "llms-full.txt:md5,a24d0905f1471282b63264d82075734d", + "mosdepth-coverage-per-contig-single.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", + "mosdepth-cumcoverage-dist-id.txt:md5,d6c6e8cdd560c9a8e5354857727c7f0c", + "mosdepth_cov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", + "mosdepth_cumcov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", + "mosdepth_perchrom.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", + "multiqc_citations.txt:md5,de4f3809016c5881cdc75567d9a0e9b9", + "multiqc_general_stats.txt:md5,6f07382e5f0cb632330a5701d98d078c", + "sample1_SV_VEP.vcf.gz:md5,83a7c50f1320ae9b80e706f359f840a1", + "sample1_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample1_SV_VEP.vcf.gz_summary.html:md5,6ead03d196bbe589983876d391c538dc", + "sample1_GERMLINE_VEP.vcf.gz:md5,6b2d455f6049181e34bc233906ac4b64", + "sample1_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample1_GERMLINE_VEP.vcf.gz_summary.html:md5,db435fbfabb3cc339947777006ce0e0f", + "sample1_SOMATIC_VEP.vcf.gz:md5,b2e5611587df0875d8fdd1f660b63d1c", + "sample1_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample1_SOMATIC_VEP.vcf.gz_summary.html:md5,c354ccf9fd1eaa24179a45d3d9e71f67", + "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", + "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", + "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", + "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", + "sample1_cramino.txt:md5,ecc712c3f444246cf94732c2e75a5dd6", + "sample1_cramino.txt:md5,d95fa636dda6c4c0f7624139a91ba07e", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", - "sample1_cramino.txt:md5,90d387928e9e5f73a4f01a8eda55e70a", - "sample1_cramino.txt:md5,9fc6b4e3c81e27fecc09303440eb24b8", + "sample1_cramino.txt:md5,6dac139c35eb5c93ee1bc910459d52fd", + "sample1_cramino.txt:md5,7304f88ca76a44c785c3e42d4e03bd73", + "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample2_cramino.txt:md5,aa2687a0f4201845902e9e0cd92b5ae1", - "sample2_cramino.txt:md5,8076f6d3e5d6eca109db4700fc6e915b", + "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", + "merge_output.vcf.gz:md5,38d7d2eb01820738044b4b1e97d9e498", + "merge_output.vcf.gz.tbi:md5,35fc4c3592251adbbe1b8f0dd13fbf1d", + "sample1.vcf.gz:md5,9997a8e8ba5950a984b1aa5d94a49358", + "sample1.vcf.gz.tbi:md5,bc87a7be72847d1e5e3d0ec8db91ccdc", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_all.vcf.gz:md5,d6d2e2da0c2cb111550af2a5a0baf14b", + "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", + "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", + "read_ids.csv:md5,90c7afc302afac7636268f1c55bd03e5", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", + "severus.log:md5,22ae12c0e29f0aa4e7fb2e2a79dc80c2", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_somatic.vcf.gz:md5,b2fde30a018135064c154968dbe98d9f", + "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample2_SV_VEP.vcf.gz:md5,780b3dde031acf9b9bd5d702b58b863e", + "sample2_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample2_SV_VEP.vcf.gz_summary.html:md5,1dd87bd56ec9448a1f3fa2daab33f735", + "sample2_GERMLINE_VEP.vcf.gz:md5,b501313732ef1081148e82972c69b471", + "sample2_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample2_GERMLINE_VEP.vcf.gz_summary.html:md5,2e2ac1d272c366f441200878ecf4c488", + "sample2_SOMATIC_VEP.vcf.gz:md5,bc9ca47fe5700c689f0399acc3bada75", + "sample2_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample2_SOMATIC_VEP.vcf.gz_summary.html:md5,230fea5b8c76d7dc2402bd5dd9116e3b", + "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", + "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", + "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", + "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", + "sample2_cramino.txt:md5,2c9315b78248e4572473eee808f7e274", + "sample2_cramino.txt:md5,93114904318ef7680832cce4e8eed3bb", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", - "sample2_cramino.txt:md5,790b504173aa19ebccfb284ba11f03df", - "sample2_cramino.txt:md5,fdfd3e6c77d3239bb5affe0122a82648", + "sample2_cramino.txt:md5,fdf0991dcdc32525b7274f4c9931b2e5", + "sample2_cramino.txt:md5,b3f7cce2485ad6c091d9e441c43a7a10", "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "sample3_cramino.txt:md5,0764bc4e1a94d6c080e40b79a2b3738a", - "sample3_cramino.txt:md5,9fc6b4e3c81e27fecc09303440eb24b8", + "merge_output.vcf.gz:md5,cb9848958a66b50ce278d5b68ba0795f", + "merge_output.vcf.gz.tbi:md5,f0f2046091c9bd9fd1025a949e81c392", + "sample2.vcf.gz:md5,6991c45828040f0b6eaaf05c38d00c15", + "sample2.vcf.gz.tbi:md5,c402923787fb8b84911c30501857e797", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_all.vcf.gz:md5,815ffa994b57a1f1173fe314fea7440d", + "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", + "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", + "read_ids.csv:md5,60ecbe23d965f6086356eb795f3d5891", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", + "severus.log:md5,46d6b80ea2985d280434d26bcea72490", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_somatic.vcf.gz:md5,4d5c19f56c67bcc14a1876a2b1a9a209", + "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample3_SV_VEP.vcf.gz:md5,487cb0b167febd3153415a27b9082fd1", + "sample3_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample3_SV_VEP.vcf.gz_summary.html:md5,c98932556fc3fcadf55d864252b61950", + "sample3_GERMLINE_VEP.vcf.gz:md5,953db9041d82ffd5c4477b4c5d167a23", + "sample3_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample3_GERMLINE_VEP.vcf.gz_summary.html:md5,d5334cbfb4653526d739e4b0b92aa78d", + "sample3_SOMATIC_VEP.vcf.gz:md5,a9f7545563b54b77b01c308c629dfe1e", + "sample3_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "sample3_SOMATIC_VEP.vcf.gz_summary.html:md5,e334b0b8f31044f1d8962979e82cb6f6", + "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", + "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", + "sample3_cramino.txt:md5,4f0a3cab435368369a981e096161b98c", + "sample3_cramino.txt:md5,7304f88ca76a44c785c3e42d4e03bd73", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e" + "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", + "germline.vcf.gz:md5,d292b66c0310954646be50ed1bdaf5bb", + "germline.vcf.gz.tbi:md5,270003ef87e27d7c74a6ae1e3efb2771", + "indel.vcf.gz:md5,ef171e87dbab1ce7be0e94cc35abad2c", + "indel.vcf.gz.tbi:md5,6e864a1c99ff7814d2209eb2abbd86da", + "snv.vcf.gz:md5,98c0aab4df659458e0943efcd52b2cf2", + "snv.vcf.gz.tbi:md5,2e57ccf8293063134327e532d4e28311", + "somatic.vcf.gz:md5,a0c2b43ee42b762caf5c725b61be5f2b", + "somatic.vcf.gz.tbi:md5,b75091c1e539b6fe1521b0b262830810", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_all.vcf.gz:md5,f6709d6ce2409b3e6d0c8a4738285996", + "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", + "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", + "read_ids.csv:md5,4422717622cc848d78cc82b0ad3ed9db", + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "severus.log:md5,aaeb2c9273d359b1cecbef6713746629", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "severus_somatic.vcf.gz:md5,9df34edf364a4bf20813831f7c8b08d4", + "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-18T16:15:18.149702781" + "timestamp": "2025-09-22T15:05:08.799870877" } } \ No newline at end of file From 847c5df8cced15d6f8c87bcd70ab294ba9a0a4d1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 22 Sep 2025 17:04:58 +0200 Subject: [PATCH 418/557] minor severus change to fix output dirs --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 153a8c6a..9e08076f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -213,6 +213,7 @@ process { // withName: '.*:SEVERUS' { + ext.prefix = { "" } ext.args = '--min-support 3 --output-read-ids ' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, From 7aa6e6dc2dbbbb0468bfcf00904cfefb9190f347 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 22 Sep 2025 17:05:10 +0200 Subject: [PATCH 419/557] added ignores and new test snapshot --- tests/default.nf.test.snap | 99 +++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 56 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 650e3e68..02696c95 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -304,134 +304,121 @@ "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz.tbi" ], [ - "llms-full.txt:md5,a24d0905f1471282b63264d82075734d", - "mosdepth-coverage-per-contig-single.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", - "mosdepth-cumcoverage-dist-id.txt:md5,d6c6e8cdd560c9a8e5354857727c7f0c", - "mosdepth_cov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", - "mosdepth_cumcov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", - "mosdepth_perchrom.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", + "mosdepth-coverage-per-contig-single.txt:md5,ea70f60066635dfddcaa99033896b54f", + "mosdepth-cumcoverage-dist-id.txt:md5,f11af2eadb5d9a88650a0a4b849f5a4e", + "mosdepth_cov_dist.txt:md5,4164fff1d67236d9c30c629d34a7f6c9", + "mosdepth_cumcov_dist.txt:md5,4164fff1d67236d9c30c629d34a7f6c9", + "mosdepth_perchrom.txt:md5,ea70f60066635dfddcaa99033896b54f", "multiqc_citations.txt:md5,de4f3809016c5881cdc75567d9a0e9b9", - "multiqc_general_stats.txt:md5,6f07382e5f0cb632330a5701d98d078c", - "sample1_SV_VEP.vcf.gz:md5,83a7c50f1320ae9b80e706f359f840a1", + "multiqc_general_stats.txt:md5,59c70ac8ca6a819b3f810af4a8e59ade", + "sample1_SV_VEP.vcf.gz:md5,f6b27cca548f637a1d88a5fa76e9270c", "sample1_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_SV_VEP.vcf.gz_summary.html:md5,6ead03d196bbe589983876d391c538dc", - "sample1_GERMLINE_VEP.vcf.gz:md5,6b2d455f6049181e34bc233906ac4b64", + "sample1_SV_VEP.vcf.gz_summary.html:md5,d185fcce88effb5cd3db72670e434ae6", + "sample1_GERMLINE_VEP.vcf.gz:md5,1c48245c57656129513b62f848f91868", "sample1_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_GERMLINE_VEP.vcf.gz_summary.html:md5,db435fbfabb3cc339947777006ce0e0f", - "sample1_SOMATIC_VEP.vcf.gz:md5,b2e5611587df0875d8fdd1f660b63d1c", + "sample1_GERMLINE_VEP.vcf.gz_summary.html:md5,ad474af36d10959fb3a849f2f935e356", + "sample1_SOMATIC_VEP.vcf.gz:md5,338f9725628a9d7f9c499e62526e0866", "sample1_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_SOMATIC_VEP.vcf.gz_summary.html:md5,c354ccf9fd1eaa24179a45d3d9e71f67", + "sample1_SOMATIC_VEP.vcf.gz_summary.html:md5,fc66e6e158cfb8bb384e725825582458", "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", - "sample1_cramino.txt:md5,ecc712c3f444246cf94732c2e75a5dd6", - "sample1_cramino.txt:md5,d95fa636dda6c4c0f7624139a91ba07e", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", - "sample1_cramino.txt:md5,6dac139c35eb5c93ee1bc910459d52fd", - "sample1_cramino.txt:md5,7304f88ca76a44c785c3e42d4e03bd73", "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "merge_output.vcf.gz:md5,38d7d2eb01820738044b4b1e97d9e498", - "merge_output.vcf.gz.tbi:md5,35fc4c3592251adbbe1b8f0dd13fbf1d", - "sample1.vcf.gz:md5,9997a8e8ba5950a984b1aa5d94a49358", - "sample1.vcf.gz.tbi:md5,bc87a7be72847d1e5e3d0ec8db91ccdc", + "merge_output.vcf.gz.tbi:md5,d8e282c38be86c701b5da20c305b2503", + "sample1.vcf.gz:md5,d6cb79944b11e823c529e3dbd613bf20", + "sample1.vcf.gz.tbi:md5,1a20eee84124bf6d0513ecdd07b923c5", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,d6d2e2da0c2cb111550af2a5a0baf14b", "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_ids.csv:md5,90c7afc302afac7636268f1c55bd03e5", + "read_ids.csv:md5,982dac5a10420a094f61d8d1f8a67977", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "severus.log:md5,22ae12c0e29f0aa4e7fb2e2a79dc80c2", + "severus.log:md5,adb30885bafbd3fe48d86c7458e3d512", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_somatic.vcf.gz:md5,b2fde30a018135064c154968dbe98d9f", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SV_VEP.vcf.gz:md5,780b3dde031acf9b9bd5d702b58b863e", + "sample2_SV_VEP.vcf.gz:md5,84909d65c29268a3226b42fc3a0c0cef", "sample2_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SV_VEP.vcf.gz_summary.html:md5,1dd87bd56ec9448a1f3fa2daab33f735", - "sample2_GERMLINE_VEP.vcf.gz:md5,b501313732ef1081148e82972c69b471", + "sample2_SV_VEP.vcf.gz_summary.html:md5,93b00ac2b8a52629ccccbf5d5c0acd80", + "sample2_GERMLINE_VEP.vcf.gz:md5,b154510cfa25d0f39e29ec1c2e9c1e9a", "sample2_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_GERMLINE_VEP.vcf.gz_summary.html:md5,2e2ac1d272c366f441200878ecf4c488", - "sample2_SOMATIC_VEP.vcf.gz:md5,bc9ca47fe5700c689f0399acc3bada75", + "sample2_GERMLINE_VEP.vcf.gz_summary.html:md5,f3778b4cfa1e732add056ead1b867a4c", + "sample2_SOMATIC_VEP.vcf.gz:md5,3d44c2165845e1802f3983671d5168e4", "sample2_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SOMATIC_VEP.vcf.gz_summary.html:md5,230fea5b8c76d7dc2402bd5dd9116e3b", + "sample2_SOMATIC_VEP.vcf.gz_summary.html:md5,3afffd78871070cf48f65b99aafc56f9", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", - "sample2_cramino.txt:md5,2c9315b78248e4572473eee808f7e274", - "sample2_cramino.txt:md5,93114904318ef7680832cce4e8eed3bb", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", - "sample2_cramino.txt:md5,fdf0991dcdc32525b7274f4c9931b2e5", - "sample2_cramino.txt:md5,b3f7cce2485ad6c091d9e441c43a7a10", "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "merge_output.vcf.gz:md5,cb9848958a66b50ce278d5b68ba0795f", "merge_output.vcf.gz.tbi:md5,f0f2046091c9bd9fd1025a949e81c392", - "sample2.vcf.gz:md5,6991c45828040f0b6eaaf05c38d00c15", - "sample2.vcf.gz.tbi:md5,c402923787fb8b84911c30501857e797", + "sample2.vcf.gz:md5,ddf3060c4230f3be370729c9f104c1ca", + "sample2.vcf.gz.tbi:md5,a228ce187c2ab510404071e920b0f197", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,815ffa994b57a1f1173fe314fea7440d", "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_ids.csv:md5,60ecbe23d965f6086356eb795f3d5891", + "read_ids.csv:md5,a09a1fc7361e38d952dff6dd1a49576a", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "severus.log:md5,46d6b80ea2985d280434d26bcea72490", + "severus.log:md5,feecefe253cf2ef62527a87af11c3d73", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_somatic.vcf.gz:md5,4d5c19f56c67bcc14a1876a2b1a9a209", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SV_VEP.vcf.gz:md5,487cb0b167febd3153415a27b9082fd1", + "sample3_SV_VEP.vcf.gz:md5,1889383b64486091167bc48eb7bfc9f9", "sample3_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SV_VEP.vcf.gz_summary.html:md5,c98932556fc3fcadf55d864252b61950", - "sample3_GERMLINE_VEP.vcf.gz:md5,953db9041d82ffd5c4477b4c5d167a23", + "sample3_SV_VEP.vcf.gz_summary.html:md5,5997f8d6cb51d697f8495977689ae607", + "sample3_GERMLINE_VEP.vcf.gz:md5,5718802e7e17ba845f9e33fb36d7fb4b", "sample3_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_GERMLINE_VEP.vcf.gz_summary.html:md5,d5334cbfb4653526d739e4b0b92aa78d", - "sample3_SOMATIC_VEP.vcf.gz:md5,a9f7545563b54b77b01c308c629dfe1e", + "sample3_GERMLINE_VEP.vcf.gz_summary.html:md5,03665bd302095c4e3b4b5b056720fba5", + "sample3_SOMATIC_VEP.vcf.gz:md5,8b2ea7113216da84b84f01443196ee5f", "sample3_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SOMATIC_VEP.vcf.gz_summary.html:md5,e334b0b8f31044f1d8962979e82cb6f6", + "sample3_SOMATIC_VEP.vcf.gz_summary.html:md5,df192be2263bc2adc65ba77eac7d6c80", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", - "sample3_cramino.txt:md5,4f0a3cab435368369a981e096161b98c", - "sample3_cramino.txt:md5,7304f88ca76a44c785c3e42d4e03bd73", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "germline.vcf.gz:md5,d292b66c0310954646be50ed1bdaf5bb", + "germline.vcf.gz:md5,f61bb5775fa0de3c05a9f65c7862a5bb", "germline.vcf.gz.tbi:md5,270003ef87e27d7c74a6ae1e3efb2771", - "indel.vcf.gz:md5,ef171e87dbab1ce7be0e94cc35abad2c", - "indel.vcf.gz.tbi:md5,6e864a1c99ff7814d2209eb2abbd86da", - "snv.vcf.gz:md5,98c0aab4df659458e0943efcd52b2cf2", - "snv.vcf.gz.tbi:md5,2e57ccf8293063134327e532d4e28311", - "somatic.vcf.gz:md5,a0c2b43ee42b762caf5c725b61be5f2b", - "somatic.vcf.gz.tbi:md5,b75091c1e539b6fe1521b0b262830810", + "indel.vcf.gz:md5,847902ecf4da9550146a37e4c10bdf6a", + "indel.vcf.gz.tbi:md5,27ead91f3bc6ddf5e0a954c482f0ebfd", + "snv.vcf.gz:md5,29448ca45011c1601b961175bdf786df", + "snv.vcf.gz.tbi:md5,8499b36e3e097f07acb7b06e68967381", + "somatic.vcf.gz:md5,dc4698e9290de45aa5a2f13bd0fcce6d", + "somatic.vcf.gz.tbi:md5,5eabbdfb0cdefa095bcf2253deebad93", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,f6709d6ce2409b3e6d0c8a4738285996", "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_ids.csv:md5,4422717622cc848d78cc82b0ad3ed9db", + "read_ids.csv:md5,9121add61348c0ac0fe34fe360bf2994", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "severus.log:md5,aaeb2c9273d359b1cecbef6713746629", + "severus.log:md5,b3dbeb98e36fcc44481b8e72a169ea14", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_somatic.vcf.gz:md5,9df34edf364a4bf20813831f7c8b08d4", @@ -442,6 +429,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-22T15:05:08.799870877" + "timestamp": "2025-09-22T17:03:33.918959524" } } \ No newline at end of file From c545fc43cd371066bf66bf4af2edc904dd5362ef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 10:33:31 +0200 Subject: [PATCH 420/557] added nftignore --- tests/.nftignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/.nftignore b/tests/.nftignore index 16409f40..e791e067 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -6,4 +6,11 @@ multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html +multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} pipeline_info/*.{html,json,txt,yml} +*/VEP/*.{vcf.gz,html} +*/variants/clair3/merge_output.vcf.gz +*/variants/severus/read_ids.csv +*/variants/severus/severus.log +*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt \ No newline at end of file From bfc9b23386376eaa67cfea312bcfcec74b125600 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 11:29:27 +0200 Subject: [PATCH 421/557] updated ignore and snap --- tests/default.nf.test.snap | 82 +++++++++++++++----------------------- 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 02696c95..f7bf42c2 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -304,22 +304,16 @@ "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz.tbi" ], [ - "mosdepth-coverage-per-contig-single.txt:md5,ea70f60066635dfddcaa99033896b54f", - "mosdepth-cumcoverage-dist-id.txt:md5,f11af2eadb5d9a88650a0a4b849f5a4e", - "mosdepth_cov_dist.txt:md5,4164fff1d67236d9c30c629d34a7f6c9", - "mosdepth_cumcov_dist.txt:md5,4164fff1d67236d9c30c629d34a7f6c9", - "mosdepth_perchrom.txt:md5,ea70f60066635dfddcaa99033896b54f", + "mosdepth-coverage-per-contig-single.txt:md5,f8e8bb2e5d4e6b5457eebf5aa883b56e", + "mosdepth-cumcoverage-dist-id.txt:md5,c7b8e06b6a8f5790b6d592052a60ca0b", + "mosdepth_cov_dist.txt:md5,90a817a24132c23a974021c257a97450", + "mosdepth_cumcov_dist.txt:md5,90a817a24132c23a974021c257a97450", + "mosdepth_perchrom.txt:md5,f8e8bb2e5d4e6b5457eebf5aa883b56e", "multiqc_citations.txt:md5,de4f3809016c5881cdc75567d9a0e9b9", - "multiqc_general_stats.txt:md5,59c70ac8ca6a819b3f810af4a8e59ade", - "sample1_SV_VEP.vcf.gz:md5,f6b27cca548f637a1d88a5fa76e9270c", + "multiqc_general_stats.txt:md5,5ce94bcef3b3cb083a84531815327442", "sample1_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_SV_VEP.vcf.gz_summary.html:md5,d185fcce88effb5cd3db72670e434ae6", - "sample1_GERMLINE_VEP.vcf.gz:md5,1c48245c57656129513b62f848f91868", "sample1_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_GERMLINE_VEP.vcf.gz_summary.html:md5,ad474af36d10959fb3a849f2f935e356", - "sample1_SOMATIC_VEP.vcf.gz:md5,338f9725628a9d7f9c499e62526e0866", "sample1_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_SOMATIC_VEP.vcf.gz_summary.html:md5,fc66e6e158cfb8bb384e725825582458", "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", @@ -334,30 +328,24 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "merge_output.vcf.gz.tbi:md5,d8e282c38be86c701b5da20c305b2503", - "sample1.vcf.gz:md5,d6cb79944b11e823c529e3dbd613bf20", + "merge_output.vcf.gz.tbi:md5,35fc4c3592251adbbe1b8f0dd13fbf1d", + "sample1.vcf.gz:md5,ff0945da58b41b66780a2a8ff1ae913b", "sample1.vcf.gz.tbi:md5,1a20eee84124bf6d0513ecdd07b923c5", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,d6d2e2da0c2cb111550af2a5a0baf14b", - "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", + "severus_all.vcf.gz:md5,edadd749be0812ff1624dd7a89dbad6f", + "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_ids.csv:md5,982dac5a10420a094f61d8d1f8a67977", + "read_ids.csv:md5,5e0308477040d4b881660501deb3746c", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "severus.log:md5,adb30885bafbd3fe48d86c7458e3d512", + "severus.log:md5,80a8e08977c4adfafad963dcb0a8864a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,b2fde30a018135064c154968dbe98d9f", + "severus_somatic.vcf.gz:md5,08fddedda8f4231555f75af730cb90cb", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SV_VEP.vcf.gz:md5,84909d65c29268a3226b42fc3a0c0cef", "sample2_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SV_VEP.vcf.gz_summary.html:md5,93b00ac2b8a52629ccccbf5d5c0acd80", - "sample2_GERMLINE_VEP.vcf.gz:md5,b154510cfa25d0f39e29ec1c2e9c1e9a", "sample2_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_GERMLINE_VEP.vcf.gz_summary.html:md5,f3778b4cfa1e732add056ead1b867a4c", - "sample2_SOMATIC_VEP.vcf.gz:md5,3d44c2165845e1802f3983671d5168e4", "sample2_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SOMATIC_VEP.vcf.gz_summary.html:md5,3afffd78871070cf48f65b99aafc56f9", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", @@ -373,29 +361,23 @@ "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "merge_output.vcf.gz.tbi:md5,f0f2046091c9bd9fd1025a949e81c392", - "sample2.vcf.gz:md5,ddf3060c4230f3be370729c9f104c1ca", - "sample2.vcf.gz.tbi:md5,a228ce187c2ab510404071e920b0f197", + "sample2.vcf.gz:md5,6c8704fb69519124afb54d52540352e2", + "sample2.vcf.gz.tbi:md5,e7b7473f27b1af0b4d56f8a7ca0547bd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,815ffa994b57a1f1173fe314fea7440d", - "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", + "severus_all.vcf.gz:md5,17371647212f9215961e50572dbbca69", + "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_ids.csv:md5,a09a1fc7361e38d952dff6dd1a49576a", + "read_ids.csv:md5,b451609014b0dedb4620ad7ea80db7dc", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "severus.log:md5,feecefe253cf2ef62527a87af11c3d73", + "severus.log:md5,3593a83ca55ec3f341d4b1b2816156d9", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,4d5c19f56c67bcc14a1876a2b1a9a209", + "severus_somatic.vcf.gz:md5,3caaa6b6ebda4f790cae80908fa8e787", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SV_VEP.vcf.gz:md5,1889383b64486091167bc48eb7bfc9f9", "sample3_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SV_VEP.vcf.gz_summary.html:md5,5997f8d6cb51d697f8495977689ae607", - "sample3_GERMLINE_VEP.vcf.gz:md5,5718802e7e17ba845f9e33fb36d7fb4b", "sample3_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_GERMLINE_VEP.vcf.gz_summary.html:md5,03665bd302095c4e3b4b5b056720fba5", - "sample3_SOMATIC_VEP.vcf.gz:md5,8b2ea7113216da84b84f01443196ee5f", "sample3_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SOMATIC_VEP.vcf.gz_summary.html:md5,df192be2263bc2adc65ba77eac7d6c80", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -403,25 +385,25 @@ "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "germline.vcf.gz:md5,f61bb5775fa0de3c05a9f65c7862a5bb", + "germline.vcf.gz:md5,635ff5a4ec1c79000e9cce822a785446", "germline.vcf.gz.tbi:md5,270003ef87e27d7c74a6ae1e3efb2771", - "indel.vcf.gz:md5,847902ecf4da9550146a37e4c10bdf6a", - "indel.vcf.gz.tbi:md5,27ead91f3bc6ddf5e0a954c482f0ebfd", - "snv.vcf.gz:md5,29448ca45011c1601b961175bdf786df", - "snv.vcf.gz.tbi:md5,8499b36e3e097f07acb7b06e68967381", - "somatic.vcf.gz:md5,dc4698e9290de45aa5a2f13bd0fcce6d", - "somatic.vcf.gz.tbi:md5,5eabbdfb0cdefa095bcf2253deebad93", + "indel.vcf.gz:md5,6041011cea1da29260a10197e3a7cbd1", + "indel.vcf.gz.tbi:md5,6e864a1c99ff7814d2209eb2abbd86da", + "snv.vcf.gz:md5,fec7e871717e2898b8a131f74c15fa96", + "snv.vcf.gz.tbi:md5,2e57ccf8293063134327e532d4e28311", + "somatic.vcf.gz:md5,ad7edbd3f2ca447e40d9c4593e0a154f", + "somatic.vcf.gz.tbi:md5,b75091c1e539b6fe1521b0b262830810", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,f6709d6ce2409b3e6d0c8a4738285996", + "severus_all.vcf.gz:md5,074631df9c421e6c9b5f60f58f9c68e2", "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_ids.csv:md5,9121add61348c0ac0fe34fe360bf2994", + "read_ids.csv:md5,e8aa64934f1122b59edd8d43546d93dc", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "severus.log:md5,b3dbeb98e36fcc44481b8e72a169ea14", + "severus.log:md5,50d86123d7d0e22f1f2314b5a1a487b7", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,9df34edf364a4bf20813831f7c8b08d4", + "severus_somatic.vcf.gz:md5,11d7e977d3974e54fd59210066661f0b", "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" ] ], @@ -429,6 +411,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-22T17:03:33.918959524" + "timestamp": "2025-09-23T11:29:02.934515643" } } \ No newline at end of file From fe7a65df05a914366c9f20c704d9a455b9592b9d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 11:29:47 +0200 Subject: [PATCH 422/557] updated nftignore --- tests/.nftignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/.nftignore b/tests/.nftignore index e791e067..9c369dfd 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -9,7 +9,7 @@ multiqc/multiqc_report.html multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} pipeline_info/*.{html,json,txt,yml} -*/VEP/*.{vcf.gz,html} +*/VEP/{SVs,germline,somatic}/*.{vcf.gz,html} */variants/clair3/merge_output.vcf.gz */variants/severus/read_ids.csv */variants/severus/severus.log From 4188702d22e917de092b30f63289975e5325d76b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 12:02:53 +0200 Subject: [PATCH 423/557] linting --- tests/.nftignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/.nftignore b/tests/.nftignore index 9c369dfd..5b1cc05b 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -13,4 +13,4 @@ pipeline_info/*.{html,json,txt,yml} */variants/clair3/merge_output.vcf.gz */variants/severus/read_ids.csv */variants/severus/severus.log -*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt \ No newline at end of file +*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt From a2ceac6941083aee95d32dfb942eeb83477ee5da Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 12:22:12 +0200 Subject: [PATCH 424/557] remove prefix from severus output --- conf/modules.config | 1 - modules/nf-core/severus/main.nf | 88 ++++++++++---------- modules/nf-core/severus/severus.diff | 120 ++++++++++++++++++--------- 3 files changed, 127 insertions(+), 82 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9e08076f..153a8c6a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -213,7 +213,6 @@ process { // withName: '.*:SEVERUS' { - ext.prefix = { "" } ext.args = '--min-support 3 --output-read-ids ' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 23af8411..7df7c4e5 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -12,24 +12,24 @@ process SEVERUS { tuple val(meta2), path(bed), path(pon_path) output: - tuple val(meta), path("${prefix}/severus.log") , emit: log - tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual - tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double - tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true - tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true - tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true - tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -51,12 +51,12 @@ process SEVERUS { $pon \\ $control \\ $phasing_vcf \\ - --out-dir ${prefix} + --out-dir . - bgzip ${prefix}/somatic_SVs/severus_somatic.vcf - tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz - bgzip ${prefix}/all_SVs/severus_all.vcf - tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz + bgzip somatic_SVs/severus_somatic.vcf + tabix -p vcf somatic_SVs/severus_somatic.vcf.gz + bgzip all_SVs/severus_all.vcf + tabix -p vcf all_SVs/severus_all.vcf.gz cat <<-END_VERSIONS > versions.yml @@ -70,28 +70,28 @@ process SEVERUS { prefix = task.ext.prefix ?: "${meta.id}" """ - mkdir -p ${prefix}/all_SVs/plots - mkdir -p ${prefix}/somatic_SVs/plots + mkdir -p all_SVs/plots + mkdir -p somatic_SVs/plots - touch ${prefix}/severus_collaped_dup.bed - touch ${prefix}/severus.log - touch ${prefix}/severus_LOH.bed - touch ${prefix}/read_alignments - touch ${prefix}/read_ids.csv - touch ${prefix}/read_qual.txt - touch ${prefix}/breakpoints_double.csv - touch ${prefix}/all_SVs/severus_all.vcf.gz - touch ${prefix}/all_SVs/severus_all.vcf.gz.tbi - touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv - touch ${prefix}/all_SVs/breakpoints_clusters.tsv - touch ${prefix}/all_SVs/plots/severus_0.html - touch ${prefix}/all_SVs/plots/severus_1.html - touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz - touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi - touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv - touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv - touch ${prefix}/somatic_SVs/plots/severus_0.html - touch ${prefix}/somatic_SVs/plots/severus_1.html + touch severus_collaped_dup.bed + touch severus.log + touch severus_LOH.bed + touch read_alignments + touch read_ids.csv + touch read_qual.txt + touch breakpoints_double.csv + touch all_SVs/severus_all.vcf.gz + touch all_SVs/severus_all.vcf.gz.tbi + touch all_SVs/breakpoints_clusters_list.tsv + touch all_SVs/breakpoints_clusters.tsv + touch all_SVs/plots/severus_0.html + touch all_SVs/plots/severus_1.html + touch somatic_SVs/severus_somatic.vcf.gz + touch somatic_SVs/severus_somatic.vcf.gz.tbi + touch somatic_SVs/breakpoints_clusters_list.tsv + touch somatic_SVs/breakpoints_clusters.tsv + touch somatic_SVs/plots/severus_0.html + touch somatic_SVs/plots/severus_1.html cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff index ab9e56b0..d5e967c7 100644 --- a/modules/nf-core/severus/severus.diff +++ b/modules/nf-core/severus/severus.diff @@ -3,7 +3,7 @@ Changes in component 'nf-core/severus' Changes in 'severus/main.nf': --- modules/nf-core/severus/main.nf +++ modules/nf-core/severus/main.nf -@@ -4,12 +4,12 @@ +@@ -4,30 +4,32 @@ conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -19,29 +19,43 @@ Changes in 'severus/main.nf': + tuple val(meta2), path(bed), path(pon_path) output: - tuple val(meta), path("${prefix}/severus.log") , emit: log -@@ -19,13 +19,15 @@ - tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true - tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true - tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true +- tuple val(meta), path("${prefix}/severus.log") , emit: log +- tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual +- tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double +- tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true +- tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true +- tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true +- tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true -+ tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true +- tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true -+ tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true - path "versions.yml" , emit: versions +- tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true +- path "versions.yml" , emit: versions ++ tuple val(meta), path("severus.log") , emit: log ++ tuple val(meta), path("read_qual.txt") , emit: read_qual ++ tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double ++ tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true ++ tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true ++ tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true ++ tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true ++ tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true ++ tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true ++ tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true ++ tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true ++ tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true ++ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true ++ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true ++ tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true ++ tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true ++ tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true ++ path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when @@ -39,15 +41,23 @@ def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" @@ -56,33 +70,65 @@ Changes in 'severus/main.nf': + $pon \\ $control \\ $phasing_vcf \\ - --out-dir ${prefix} +- --out-dir ${prefix} ++ --out-dir . + -+ bgzip ${prefix}/somatic_SVs/severus_somatic.vcf -+ tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz -+ bgzip ${prefix}/all_SVs/severus_all.vcf -+ tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz ++ bgzip somatic_SVs/severus_somatic.vcf ++ tabix -p vcf somatic_SVs/severus_somatic.vcf.gz ++ bgzip all_SVs/severus_all.vcf ++ tabix -p vcf all_SVs/severus_all.vcf.gz + cat <<-END_VERSIONS > versions.yml "${task.process}": -@@ -70,12 +80,14 @@ - touch ${prefix}/read_ids.csv - touch ${prefix}/read_qual.txt - touch ${prefix}/breakpoints_double.csv +@@ -60,26 +70,28 @@ + prefix = task.ext.prefix ?: "${meta.id}" + + """ +- mkdir -p ${prefix}/all_SVs/plots +- mkdir -p ${prefix}/somatic_SVs/plots ++ mkdir -p all_SVs/plots ++ mkdir -p somatic_SVs/plots + +- touch ${prefix}/severus_collaped_dup.bed +- touch ${prefix}/severus.log +- touch ${prefix}/severus_LOH.bed +- touch ${prefix}/read_alignments +- touch ${prefix}/read_ids.csv +- touch ${prefix}/read_qual.txt +- touch ${prefix}/breakpoints_double.csv - touch ${prefix}/all_SVs/severus_all.vcf -+ touch ${prefix}/all_SVs/severus_all.vcf.gz -+ touch ${prefix}/all_SVs/severus_all.vcf.gz.tbi - touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv - touch ${prefix}/all_SVs/breakpoints_clusters.tsv - touch ${prefix}/all_SVs/plots/severus_0.html - touch ${prefix}/all_SVs/plots/severus_1.html +- touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv +- touch ${prefix}/all_SVs/breakpoints_clusters.tsv +- touch ${prefix}/all_SVs/plots/severus_0.html +- touch ${prefix}/all_SVs/plots/severus_1.html - touch ${prefix}/somatic_SVs/severus_somatic.vcf -+ touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz -+ touch ${prefix}/somatic_SVs/severus_somatic.vcf.gz.tbi - touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv - touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv - touch ${prefix}/somatic_SVs/plots/severus_0.html +- touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv +- touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv +- touch ${prefix}/somatic_SVs/plots/severus_0.html +- touch ${prefix}/somatic_SVs/plots/severus_1.html ++ touch severus_collaped_dup.bed ++ touch severus.log ++ touch severus_LOH.bed ++ touch read_alignments ++ touch read_ids.csv ++ touch read_qual.txt ++ touch breakpoints_double.csv ++ touch all_SVs/severus_all.vcf.gz ++ touch all_SVs/severus_all.vcf.gz.tbi ++ touch all_SVs/breakpoints_clusters_list.tsv ++ touch all_SVs/breakpoints_clusters.tsv ++ touch all_SVs/plots/severus_0.html ++ touch all_SVs/plots/severus_1.html ++ touch somatic_SVs/severus_somatic.vcf.gz ++ touch somatic_SVs/severus_somatic.vcf.gz.tbi ++ touch somatic_SVs/breakpoints_clusters_list.tsv ++ touch somatic_SVs/breakpoints_clusters.tsv ++ touch somatic_SVs/plots/severus_0.html ++ touch somatic_SVs/plots/severus_1.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": 'modules/nf-core/severus/environment.yml' is unchanged 'modules/nf-core/severus/tests/tags.yml' is unchanged From b5484e0e954334e8fc7c0e60eb8074ec37ba87ef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 12:44:27 +0200 Subject: [PATCH 425/557] update snap --- tests/default.nf.test.snap | 151 +++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 80 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index f7bf42c2..1e204d62 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -164,21 +164,20 @@ "sample1/variants/clairs/sample1.vcf.gz", "sample1/variants/clairs/sample1.vcf.gz.tbi", "sample1/variants/severus", - "sample1/variants/severus/sample1", - "sample1/variants/severus/sample1/all_SVs", - "sample1/variants/severus/sample1/all_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/sample1/all_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/sample1/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/sample1/all_SVs/severus_all.vcf.gz.tbi", - "sample1/variants/severus/sample1/breakpoints_double.csv", - "sample1/variants/severus/sample1/read_ids.csv", - "sample1/variants/severus/sample1/read_qual.txt", - "sample1/variants/severus/sample1/severus.log", - "sample1/variants/severus/sample1/somatic_SVs", - "sample1/variants/severus/sample1/somatic_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/sample1/somatic_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/sample1/somatic_SVs/severus_somatic.vcf.gz", - "sample1/variants/severus/sample1/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample2", "sample2/VEP", "sample2/VEP/SVs", @@ -231,21 +230,20 @@ "sample2/variants/clairs/sample2.vcf.gz", "sample2/variants/clairs/sample2.vcf.gz.tbi", "sample2/variants/severus", - "sample2/variants/severus/sample2", - "sample2/variants/severus/sample2/all_SVs", - "sample2/variants/severus/sample2/all_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/sample2/all_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/sample2/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/sample2/all_SVs/severus_all.vcf.gz.tbi", - "sample2/variants/severus/sample2/breakpoints_double.csv", - "sample2/variants/severus/sample2/read_ids.csv", - "sample2/variants/severus/sample2/read_qual.txt", - "sample2/variants/severus/sample2/severus.log", - "sample2/variants/severus/sample2/somatic_SVs", - "sample2/variants/severus/sample2/somatic_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/sample2/somatic_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/sample2/somatic_SVs/severus_somatic.vcf.gz", - "sample2/variants/severus/sample2/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample3", "sample3/VEP", "sample3/VEP/SVs", @@ -287,30 +285,29 @@ "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", "sample3/variants/severus", - "sample3/variants/severus/sample3", - "sample3/variants/severus/sample3/all_SVs", - "sample3/variants/severus/sample3/all_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/sample3/all_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/sample3/all_SVs/severus_all.vcf.gz", - "sample3/variants/severus/sample3/all_SVs/severus_all.vcf.gz.tbi", - "sample3/variants/severus/sample3/breakpoints_double.csv", - "sample3/variants/severus/sample3/read_ids.csv", - "sample3/variants/severus/sample3/read_qual.txt", - "sample3/variants/severus/sample3/severus.log", - "sample3/variants/severus/sample3/somatic_SVs", - "sample3/variants/severus/sample3/somatic_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/sample3/somatic_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz", - "sample3/variants/severus/sample3/somatic_SVs/severus_somatic.vcf.gz.tbi" + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi" ], [ - "mosdepth-coverage-per-contig-single.txt:md5,f8e8bb2e5d4e6b5457eebf5aa883b56e", - "mosdepth-cumcoverage-dist-id.txt:md5,c7b8e06b6a8f5790b6d592052a60ca0b", - "mosdepth_cov_dist.txt:md5,90a817a24132c23a974021c257a97450", - "mosdepth_cumcov_dist.txt:md5,90a817a24132c23a974021c257a97450", - "mosdepth_perchrom.txt:md5,f8e8bb2e5d4e6b5457eebf5aa883b56e", + "mosdepth-coverage-per-contig-single.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", + "mosdepth-cumcoverage-dist-id.txt:md5,d6c6e8cdd560c9a8e5354857727c7f0c", + "mosdepth_cov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", + "mosdepth_cumcov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", + "mosdepth_perchrom.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", "multiqc_citations.txt:md5,de4f3809016c5881cdc75567d9a0e9b9", - "multiqc_general_stats.txt:md5,5ce94bcef3b3cb083a84531815327442", + "multiqc_general_stats.txt:md5,e36a149adadb2dd3886afb4a14752868", "sample1_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample1_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample1_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", @@ -328,20 +325,18 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "merge_output.vcf.gz.tbi:md5,35fc4c3592251adbbe1b8f0dd13fbf1d", - "sample1.vcf.gz:md5,ff0945da58b41b66780a2a8ff1ae913b", - "sample1.vcf.gz.tbi:md5,1a20eee84124bf6d0513ecdd07b923c5", + "merge_output.vcf.gz.tbi:md5,85e48be04299079cbb9ca5fa4b5ff799", + "sample1.vcf.gz:md5,ee3c13eb88cd46f813b588be01e855be", + "sample1.vcf.gz.tbi:md5,0db49f03105810893c976759efe4f0db", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,edadd749be0812ff1624dd7a89dbad6f", + "severus_all.vcf.gz:md5,7f7b015f940bd61cbd0f4c896d1fcff0", "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_ids.csv:md5,5e0308477040d4b881660501deb3746c", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "severus.log:md5,80a8e08977c4adfafad963dcb0a8864a", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,08fddedda8f4231555f75af730cb90cb", + "severus_somatic.vcf.gz:md5,fb0e3d90efac50a45bf01b679281f81d", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", @@ -360,20 +355,18 @@ "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "merge_output.vcf.gz.tbi:md5,f0f2046091c9bd9fd1025a949e81c392", - "sample2.vcf.gz:md5,6c8704fb69519124afb54d52540352e2", - "sample2.vcf.gz.tbi:md5,e7b7473f27b1af0b4d56f8a7ca0547bd", + "merge_output.vcf.gz.tbi:md5,08348d61127c1e67a0e8bb438f07164c", + "sample2.vcf.gz:md5,b6c71bcb801e31ecb1090fedc7faeeff", + "sample2.vcf.gz.tbi:md5,c402923787fb8b84911c30501857e797", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,17371647212f9215961e50572dbbca69", + "severus_all.vcf.gz:md5,3c7a08119a87270b1812fb0e03335b84", "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_ids.csv:md5,b451609014b0dedb4620ad7ea80db7dc", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "severus.log:md5,3593a83ca55ec3f341d4b1b2816156d9", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,3caaa6b6ebda4f790cae80908fa8e787", + "severus_somatic.vcf.gz:md5,b0c1d02343689e5b423dffefa994166b", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", @@ -385,32 +378,30 @@ "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "germline.vcf.gz:md5,635ff5a4ec1c79000e9cce822a785446", - "germline.vcf.gz.tbi:md5,270003ef87e27d7c74a6ae1e3efb2771", - "indel.vcf.gz:md5,6041011cea1da29260a10197e3a7cbd1", - "indel.vcf.gz.tbi:md5,6e864a1c99ff7814d2209eb2abbd86da", - "snv.vcf.gz:md5,fec7e871717e2898b8a131f74c15fa96", - "snv.vcf.gz.tbi:md5,2e57ccf8293063134327e532d4e28311", - "somatic.vcf.gz:md5,ad7edbd3f2ca447e40d9c4593e0a154f", - "somatic.vcf.gz.tbi:md5,b75091c1e539b6fe1521b0b262830810", + "germline.vcf.gz:md5,e8921273f0699997c4a551104b5fe54c", + "germline.vcf.gz.tbi:md5,85e35f7c37bbb3b6b265a5c5ea900b58", + "indel.vcf.gz:md5,58046c721d101d8ccfb24ec9d52f5f97", + "indel.vcf.gz.tbi:md5,3f2684bab4a92263be775c7044779fd2", + "snv.vcf.gz:md5,e3c9a4b58ec7190e279d1aab9b3b1aa9", + "snv.vcf.gz.tbi:md5,ea97b49a4cd7cd2eafb10623ed15e067", + "somatic.vcf.gz:md5,3e254eaf4080ee6abcdc6fdda48084d9", + "somatic.vcf.gz.tbi:md5,1dc5f1364b90feaea37377ff1913a723", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,074631df9c421e6c9b5f60f58f9c68e2", - "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", + "severus_all.vcf.gz:md5,c23c968fb45a2e047f0e9259f56d2ee6", + "severus_all.vcf.gz.tbi:md5,d63ffeaa2341f195c73369ce3423bd14", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_ids.csv:md5,e8aa64934f1122b59edd8d43546d93dc", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "severus.log:md5,50d86123d7d0e22f1f2314b5a1a487b7", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,11d7e977d3974e54fd59210066661f0b", - "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" + "severus_somatic.vcf.gz:md5,4123f9c610adb1c5d837f02288d82f8a", + "severus_somatic.vcf.gz.tbi:md5,32f35ffd4584d552027aef4c8840518b" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-23T11:29:02.934515643" + "timestamp": "2025-09-23T12:43:36.41253386" } } \ No newline at end of file From c65898c7a32c2cd1302b1f68da58cff748906e02 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 14:40:57 +0200 Subject: [PATCH 426/557] once again, updated snap and ignore list --- tests/.nftignore | 8 +++++--- tests/default.nf.test.snap | 32 +------------------------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 5b1cc05b..70bc6f8c 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -6,11 +6,13 @@ multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html -multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_data/*.txt multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} pipeline_info/*.{html,json,txt,yml} -*/VEP/{SVs,germline,somatic}/*.{vcf.gz,html} -*/variants/clair3/merge_output.vcf.gz +*/VEP/{SVs,germline,somatic}/*.{vcf.gz,html,vcf.gz.tbi} +*/variants/clair3/merge_output.{vcf.gz,vcf.gz.tbi} +*/variants/clairs/*.{vcf.gz,vcf.gz.tbi} +*/variants/clairsto/*.{vcf.gz,vcf.gz.tbi} */variants/severus/read_ids.csv */variants/severus/severus.log */qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 1e204d62..bbd26451 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -301,16 +301,6 @@ "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi" ], [ - "mosdepth-coverage-per-contig-single.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", - "mosdepth-cumcoverage-dist-id.txt:md5,d6c6e8cdd560c9a8e5354857727c7f0c", - "mosdepth_cov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", - "mosdepth_cumcov_dist.txt:md5,6542061427ec7ca652166e11bbb925ed", - "mosdepth_perchrom.txt:md5,a397e73cefe539bd6d0dbb1fcb812366", - "multiqc_citations.txt:md5,de4f3809016c5881cdc75567d9a0e9b9", - "multiqc_general_stats.txt:md5,e36a149adadb2dd3886afb4a14752868", - "sample1_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample1_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", @@ -325,9 +315,6 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "merge_output.vcf.gz.tbi:md5,85e48be04299079cbb9ca5fa4b5ff799", - "sample1.vcf.gz:md5,ee3c13eb88cd46f813b588be01e855be", - "sample1.vcf.gz.tbi:md5,0db49f03105810893c976759efe4f0db", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,7f7b015f940bd61cbd0f4c896d1fcff0", @@ -338,9 +325,6 @@ "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_somatic.vcf.gz:md5,fb0e3d90efac50a45bf01b679281f81d", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample2_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", @@ -355,9 +339,6 @@ "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "merge_output.vcf.gz.tbi:md5,08348d61127c1e67a0e8bb438f07164c", - "sample2.vcf.gz:md5,b6c71bcb801e31ecb1090fedc7faeeff", - "sample2.vcf.gz.tbi:md5,c402923787fb8b84911c30501857e797", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,3c7a08119a87270b1812fb0e03335b84", @@ -368,9 +349,6 @@ "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_somatic.vcf.gz:md5,b0c1d02343689e5b423dffefa994166b", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SV_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_GERMLINE_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "sample3_SOMATIC_VEP.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -378,14 +356,6 @@ "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "germline.vcf.gz:md5,e8921273f0699997c4a551104b5fe54c", - "germline.vcf.gz.tbi:md5,85e35f7c37bbb3b6b265a5c5ea900b58", - "indel.vcf.gz:md5,58046c721d101d8ccfb24ec9d52f5f97", - "indel.vcf.gz.tbi:md5,3f2684bab4a92263be775c7044779fd2", - "snv.vcf.gz:md5,e3c9a4b58ec7190e279d1aab9b3b1aa9", - "snv.vcf.gz.tbi:md5,ea97b49a4cd7cd2eafb10623ed15e067", - "somatic.vcf.gz:md5,3e254eaf4080ee6abcdc6fdda48084d9", - "somatic.vcf.gz.tbi:md5,1dc5f1364b90feaea37377ff1913a723", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "severus_all.vcf.gz:md5,c23c968fb45a2e047f0e9259f56d2ee6", @@ -402,6 +372,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-23T12:43:36.41253386" + "timestamp": "2025-09-23T14:03:31.172724099" } } \ No newline at end of file From f523fea34bfb58fe89af56ab41b87f6497c6af89 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 15:53:03 +0200 Subject: [PATCH 427/557] lowercase vep --- conf/modules.config | 6 +++--- tests/.nftignore | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 153a8c6a..5719ce0c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -302,7 +302,7 @@ process { withName : '.*:SOMATIC_VEP' { ext.prefix = { "${meta.id}_SOMATIC_VEP" } publishDir = [ - path: { "${params.outdir}/${meta.id}/VEP/somatic/" }, + path: { "${params.outdir}/${meta.id}/vep/somatic/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -310,7 +310,7 @@ process { withName : '.*:GERMLINE_VEP' { ext.prefix = { "${meta.id}_GERMLINE_VEP" } publishDir = [ - path: { "${params.outdir}/${meta.id}/VEP/germline/" }, + path: { "${params.outdir}/${meta.id}/vep/germline/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -318,7 +318,7 @@ process { withName : '.*:SV_VEP' { ext.prefix = { "${meta.id}_SV_VEP" } publishDir = [ - path: { "${params.outdir}/${meta.id}/VEP/SVs/" }, + path: { "${params.outdir}/${meta.id}/vep/SVs/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/tests/.nftignore b/tests/.nftignore index 70bc6f8c..3ee4eeb0 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -9,7 +9,7 @@ multiqc/multiqc_report.html multiqc/multiqc_data/*.txt multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} pipeline_info/*.{html,json,txt,yml} -*/VEP/{SVs,germline,somatic}/*.{vcf.gz,html,vcf.gz.tbi} +*/vep/{SVs,germline,somatic}/*.{vcf.gz,html,vcf.gz.tbi} */variants/clair3/merge_output.{vcf.gz,vcf.gz.tbi} */variants/clairs/*.{vcf.gz,vcf.gz.tbi} */variants/clairsto/*.{vcf.gz,vcf.gz.tbi} From cfd908031bcee51c88d7744cba6de3c1df5b181e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Sep 2025 17:36:53 +0200 Subject: [PATCH 428/557] updated snapshot --- tests/default.nf.test.snap | 82 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index bbd26451..7acdd2e4 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -113,19 +113,6 @@ "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", - "sample1/VEP", - "sample1/VEP/SVs", - "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz", - "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/VEP/SVs/sample1_SV_VEP.vcf.gz_summary.html", - "sample1/VEP/germline", - "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz", - "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", - "sample1/VEP/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/VEP/somatic", - "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/VEP/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample1/bamfiles", "sample1/bamfiles/sample1_normal.bam", "sample1/bamfiles/sample1_normal.bam.bai", @@ -178,20 +165,20 @@ "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", - "sample2/VEP", - "sample2/VEP/SVs", - "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz", - "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/VEP/SVs/sample2_SV_VEP.vcf.gz_summary.html", - "sample2/VEP/germline", - "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz", - "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", - "sample2/VEP/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/VEP/somatic", - "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/VEP/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample2/bamfiles", "sample2/bamfiles/sample2_normal.bam", "sample2/bamfiles/sample2_normal.bam.bai", @@ -244,20 +231,20 @@ "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", - "sample3/VEP", - "sample3/VEP/SVs", - "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz", - "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz.tbi", - "sample3/VEP/SVs/sample3_SV_VEP.vcf.gz_summary.html", - "sample3/VEP/germline", - "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz", - "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", - "sample3/VEP/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", - "sample3/VEP/somatic", - "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz", - "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/VEP/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", "sample3/bamfiles", "sample3/bamfiles/sample3_tumor.bam", "sample3/bamfiles/sample3_tumor.bam.bai", @@ -298,7 +285,20 @@ "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi" + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", @@ -372,6 +372,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-23T14:03:31.172724099" + "timestamp": "2025-09-23T17:09:54.628293448" } } \ No newline at end of file From d62e39aafb09d7baa3d3fe2065abf26d7e5080ad Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 09:06:21 +0200 Subject: [PATCH 429/557] fix laurens :) --- nextflow.config | 5 +++- subworkflows/local/tumor_normal_happhase.nf | 5 +++- subworkflows/local/tumor_only_happhase.nf | 11 +++---- workflows/lrsomatic.nf | 32 ++++++++++----------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/nextflow.config b/nextflow.config index 67516f8f..7c4152c2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -40,6 +40,9 @@ params { minimap2_pb_model = null save_secondary_alignment = true + // Fibertools options + params.autocorrelation = null + // ASCAT options ascat_ploidy = null ascat_min_base_qual = 20 @@ -56,7 +59,7 @@ params { //TODO: // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version - // and allele/loci(/gc/rt) files. For now they need to be specified + // and allele/loci(/gc/rt) files. For now they need to be specified for anything else but GRCh38 and CHM13 ascat_gc_files = null ascat_rt_files = null diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f6f4e077..fd6ed3c0 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -16,6 +16,9 @@ workflow TUMOR_NORMAL_HAPPHASE { main: ch_versions = Channel.empty() + tumor_only_severus = Channel.empty() + somatic_vep = Channel.empty() + germline_vep = Channel.empty() // Branch input bams in normal and tumour mixed_bams @@ -247,7 +250,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // normal_bai: indexes for normal bam files // phased_vcf: phased small variant vcf for normal - // Get ClairS input channel + // Get ClairS input channel tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 8303eb7c..f32326c4 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -15,8 +15,9 @@ workflow TUMOR_ONLY_HAPPHASE { main: ch_versions = Channel.empty() - - ch_versions = Channel.empty() + tumor_only_severus = Channel.empty() + somatic_vep = Channel.empty() + germline_vep = Channel.empty() tumor_bams .map{ meta, bam, bai -> @@ -163,18 +164,18 @@ workflow TUMOR_ONLY_HAPPHASE { .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.vcf) .join(LONGPHASE_PHASE.out.tbi) - .map{meta, hap_bam, hap_bai, vcf,tbi -> + .map{ meta, hap_bam, hap_bai, vcf, tbi -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - return[new_meta, hap_bam, hap_bai, [],[], vcf,tbi] + return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] } .set{ tumor_only_severus } - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // tumor_only_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // hap_bam: haplotagged aligned bam for tumor // hap_bai: indexes for tumor bam files // normal_bam: haplotagged aligned bam files for normal (empty) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 0bb48226..ed572b62 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -413,26 +413,24 @@ workflow LRSOMATIC { SEVERUS.out.all_vcf .map { meta, vcf -> def extra = [] - return [meta,vcf, extra] + return [meta, vcf, extra] } .set { sv_vep } + if(!params.skip_vep) { SV_VEP ( - sv_vep, - params.vep_genome, - params.vep_species, - params.vep_cache_version, - vep_cache, - ch_fasta, - [] - ) - - - + sv_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [] + ) + ch_versions = ch_versions.mix(SV_VEP.out.versions) } - // // MODULE: CRAMINO // @@ -453,7 +451,6 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_mosdepth) { - // prepare mosdepth input channel: we need to specify compulsory path to bed as well ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) .map { meta, bam, bai -> [meta, bam, bai, []] } @@ -497,8 +494,8 @@ workflow LRSOMATIC { if (!params.skip_ascat) { severus_reformat - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - return[meta , normal_bam, normal_bai, tumor_bam, tumor_bai] + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } @@ -524,6 +521,9 @@ workflow LRSOMATIC { // Prepare input channel for WAKHAN severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] + } .join(SEVERUS.out.all_vcf) .set { wakhan_input } From a7d8abbb3ec620a56931acfb01f58aff70e21569 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 09:25:23 +0200 Subject: [PATCH 430/557] linting --- workflows/lrsomatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index ed572b62..8cb38c33 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -416,7 +416,7 @@ workflow LRSOMATIC { return [meta, vcf, extra] } .set { sv_vep } - + if(!params.skip_vep) { SV_VEP ( sv_vep, @@ -427,7 +427,7 @@ workflow LRSOMATIC { ch_fasta, [] ) - + ch_versions = ch_versions.mix(SV_VEP.out.versions) } From 158fc9ac1f6d89d417c488e267bc7f5b9125127d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 26 Sep 2025 09:29:34 +0200 Subject: [PATCH 431/557] add .nf-test to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a42ce016..776b82fe 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ testing/ testing* *.pyc null/ +.nf-test From eae3ac1257f09f102bf04c96e6ae2213093fd124 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 11:26:02 +0200 Subject: [PATCH 432/557] fix snapshot --- .nf-test.log | 18 ++++++++++++++++++ tests/default.nf.test.snap | 24 ++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 .nf-test.log diff --git a/.nf-test.log b/.nf-test.log new file mode 100644 index 00000000..97cf4db9 --- /dev/null +++ b/.nf-test.log @@ -0,0 +1,18 @@ +Sep-26 11:02:04.136 [main] INFO com.askimed.nf.test.App - nf-test 0.9.2 +Sep-26 11:02:04.148 [main] INFO com.askimed.nf.test.App - Arguments: [test, tests/, --profile=+vsc_kul_uhasselt,wice, --update-snapshot] +Sep-26 11:02:04.838 [main] INFO com.askimed.nf.test.App - Nextflow Version: 25.09.0 +Sep-26 11:02:04.840 [main] INFO com.askimed.nf.test.commands.RunTestsCommand - Load config from file /lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/nf-test.config... +Sep-26 11:03:07.065 [main] INFO com.askimed.nf.test.lang.dependencies.DependencyResolver - Loaded 45 files from directory /lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic in 61.818 sec +Sep-26 11:03:07.068 [main] INFO com.askimed.nf.test.lang.dependencies.DependencyResolver - Found 1 files containing tests. +Sep-26 11:03:07.068 [main] DEBUG com.askimed.nf.test.lang.dependencies.DependencyResolver - Found files: [/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test] +Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.commands.RunTestsCommand - Found 1 tests to execute. +Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Started test plan +Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Running testsuite 'Test pipeline' from file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test'. +Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Run test '3c47806f: -profile test'. type: com.askimed.nf.test.lang.pipeline.PipelineTest +Sep-26 11:24:14.121 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Load snapshots from file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test.snap' +Sep-26 11:24:17.953 [main] DEBUG com.askimed.nf.test.lang.extensions.Snapshot - Snapshots '-profile test' do not match. Update snapshots flag set. +Sep-26 11:24:17.953 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Updated snapshot '-profile test' +Sep-26 11:24:23.515 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Wrote snapshots to file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test.snap' +Sep-26 11:24:23.515 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Test '3c47806f: -profile test' finished. status: PASSED +Sep-26 11:24:23.517 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Testsuite 'Test pipeline' finished. snapshot file: true, skipped tests: false, failed tests: false +Sep-26 11:24:23.519 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Executed 1 tests. 0 tests failed. Done! diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7acdd2e4..bc80af44 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,13 +317,13 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,7f7b015f940bd61cbd0f4c896d1fcff0", - "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", + "severus_all.vcf.gz:md5,2cc13bceab1c174adce0ce05d91097e5", + "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,fb0e3d90efac50a45bf01b679281f81d", + "severus_somatic.vcf.gz:md5,cdceb5a2fcd35e926b94041e9c729a7d", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", @@ -341,13 +341,13 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,3c7a08119a87270b1812fb0e03335b84", - "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", + "severus_all.vcf.gz:md5,c140bb600ae1280f1947a99692ecf70a", + "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,b0c1d02343689e5b423dffefa994166b", + "severus_somatic.vcf.gz:md5,8bf1c9b154885758b3d2eba33ed63804", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", @@ -358,20 +358,20 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,c23c968fb45a2e047f0e9259f56d2ee6", - "severus_all.vcf.gz.tbi:md5,d63ffeaa2341f195c73369ce3423bd14", + "severus_all.vcf.gz:md5,a10d145fad82ad7a2e947f879f6e6783", + "severus_all.vcf.gz.tbi:md5,260da401a1af77c6e87ab46a8b261b79", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,4123f9c610adb1c5d837f02288d82f8a", - "severus_somatic.vcf.gz.tbi:md5,32f35ffd4584d552027aef4c8840518b" + "severus_somatic.vcf.gz:md5,87c9d93cbc910f7a2552c16cdb0370a6", + "severus_somatic.vcf.gz.tbi:md5,7c7a1ba74affba75fdbb0c4e26afe735" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "25.09.0" }, - "timestamp": "2025-09-23T17:09:54.628293448" + "timestamp": "2025-09-26T11:24:17.953332539" } } \ No newline at end of file From 596a9dbcba1437bf08d55600ba12b0cfc3d7f146 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 11:26:21 +0200 Subject: [PATCH 433/557] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 776b82fe..11a54fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ testing* *.pyc null/ .nf-test +.nf.test.log \ No newline at end of file From b85f985e40bf79c1e3b8bd3b3a150d435bcbac76 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 11:32:50 +0200 Subject: [PATCH 434/557] linting --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 11a54fbb..cdf2f465 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ testing* *.pyc null/ .nf-test -.nf.test.log \ No newline at end of file +.nf.test.log From 94dd7513fcc10736b24c013268e62068db0f460c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 13:42:24 +0200 Subject: [PATCH 435/557] added clean up in CI --- .github/workflows/nf-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 593c9360..a5049ce6 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -86,6 +86,9 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: fetch-depth: 0 + + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - name: Run nf-test id: run_nf_test From a2d3f5055e452fb3aaad5140a7a2cac51ebf0311 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 26 Sep 2025 13:43:14 +0200 Subject: [PATCH 436/557] linting --- .github/workflows/nf-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index a5049ce6..e562c460 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -86,7 +86,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: fetch-depth: 0 - + - name: Clean up Disk space uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 From 11a73a019f5ac2a0cab03fce162be48b860f131d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 16:27:38 +0200 Subject: [PATCH 437/557] fix clairsto pon --- conf/igenomes.config | 6 ++++++ conf/modules.config | 3 +++ modules/local/clairsto/main.nf | 11 +++++++++++ nextflow_schema.json | 2 +- subworkflows/local/tumor_only_happhase.nf | 12 ++++++++++-- workflows/lrsomatic.nf | 17 +++++++++++++++-- 6 files changed, 46 insertions(+), 5 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 0e37a467..7a57895f 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -25,11 +25,17 @@ params { 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" genome_name = "CHM13" + vep_genome = "T2T-CHM13v2.0" + vep_species = "homo_sapiens_gca009914755v4" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" + gnomad = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_gnomad.vcf.gz" + dbsnp = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_dbsnp.vcf.gz" + onekgenomes = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_1kgenomes.vcf.gz" + colors = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_colors.vcf.gz" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/modules.config b/conf/modules.config index 5719ce0c..fa77ca52 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -300,6 +300,7 @@ process { ] } withName : '.*:SOMATIC_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SOMATIC_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/somatic/" }, @@ -308,6 +309,7 @@ process { ] } withName : '.*:GERMLINE_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_GERMLINE_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/germline/" }, @@ -316,6 +318,7 @@ process { ] } withName : '.*:SV_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SV_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/SVs/" }, diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 5735c6eb..20b3f038 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -11,6 +11,10 @@ process CLAIRSTO { tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) tuple val(meta2), path(reference) tuple val(meta3), path(index) + path(dbSNP) + path(colors) + path(onekgenomes) + path(gnomad) output: tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf @@ -26,6 +30,11 @@ process CLAIRSTO { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' + def gnomad = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' + def dbSNP = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' + def onekgenomes = onekgenomes ?: '1000g-pon.sites.vcf.gz' + def colors = colors ?: 'colors-pon.sites.vcf.gz' + """ /opt/bin/run_clairs_to \ @@ -34,6 +43,8 @@ process CLAIRSTO { --platform $model \\ --threads $task.cpus \\ --output_dir . \\ + --panel_of_normals "${gnomad},${dbSNP},${onekgenomes},${colors}" \\ + --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ $args \\ diff --git a/nextflow_schema.json b/nextflow_schema.json index 161bd159..6387625e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -72,7 +72,7 @@ "default": "s3://ngi-igenomes/igenomes/" }, "vep_cache": { - "type": "string", + "type": "integer", "description": "Path to VEP cache directory.", "fa_icon": "fas fa-database", "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 8303eb7c..f2dee5d7 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -11,6 +11,10 @@ workflow TUMOR_ONLY_HAPPHASE { fasta fai clairSTO_modelMap + dbsnp + colors + onekgenomes + gnomad main: @@ -20,7 +24,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model + def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } .set{ tumor_bams } @@ -34,7 +38,11 @@ workflow TUMOR_ONLY_HAPPHASE { CLAIRSTO ( tumor_bams, fasta, - fai + fai, + dbsnp, + colors, + onekgenomes, + gnomad ) ch_versions = ch_versions.mix(CLAIRSTO.out.versions) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 0bb48226..f26002ba 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -89,6 +89,10 @@ workflow LRSOMATIC { params.bed_file = getGenomeAttribute('bed_file') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') + params.dbsnp = getGenomeAttribute('dbsnp') + params.colors = getGenomeAttribute('colors') + params.onekgenomes = getGenomeAttribute('onekgenomes') + params.gnomad = getGenomeAttribute('gnomad') ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() @@ -344,11 +348,20 @@ workflow LRSOMATIC { // // Phasing/haplotagging for tumor only samples + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + TUMOR_ONLY_HAPPHASE ( - branched_minimap.tumor_only, + tumor_only_mapped, ch_fasta, ch_fai, - clairs_modelMap + clairs_modelMap, + dbsnp, + colors, + onekgenomes, + gnomad ) germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) From 7b4742b87692327295cc09613ba2bf1dc5a63eb5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 16:27:38 +0200 Subject: [PATCH 438/557] fix clairsto pon --- conf/igenomes.config | 6 ++++++ conf/modules.config | 3 +++ modules/local/clairsto/main.nf | 11 +++++++++++ nextflow_schema.json | 2 +- subworkflows/local/tumor_only_happhase.nf | 12 ++++++++++-- workflows/lrsomatic.nf | 17 +++++++++++++++-- 6 files changed, 46 insertions(+), 5 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 0e37a467..7a57895f 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -25,11 +25,17 @@ params { 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" genome_name = "CHM13" + vep_genome = "T2T-CHM13v2.0" + vep_species = "homo_sapiens_gca009914755v4" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" + gnomad = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_gnomad.vcf.gz" + dbsnp = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_dbsnp.vcf.gz" + onekgenomes = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_1kgenomes.vcf.gz" + colors = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_colors.vcf.gz" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/modules.config b/conf/modules.config index 5719ce0c..fa77ca52 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -300,6 +300,7 @@ process { ] } withName : '.*:SOMATIC_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SOMATIC_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/somatic/" }, @@ -308,6 +309,7 @@ process { ] } withName : '.*:GERMLINE_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_GERMLINE_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/germline/" }, @@ -316,6 +318,7 @@ process { ] } withName : '.*:SV_VEP' { + ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SV_VEP" } publishDir = [ path: { "${params.outdir}/${meta.id}/vep/SVs/" }, diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 5735c6eb..20b3f038 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -11,6 +11,10 @@ process CLAIRSTO { tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) tuple val(meta2), path(reference) tuple val(meta3), path(index) + path(dbSNP) + path(colors) + path(onekgenomes) + path(gnomad) output: tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf @@ -26,6 +30,11 @@ process CLAIRSTO { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' + def gnomad = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' + def dbSNP = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' + def onekgenomes = onekgenomes ?: '1000g-pon.sites.vcf.gz' + def colors = colors ?: 'colors-pon.sites.vcf.gz' + """ /opt/bin/run_clairs_to \ @@ -34,6 +43,8 @@ process CLAIRSTO { --platform $model \\ --threads $task.cpus \\ --output_dir . \\ + --panel_of_normals "${gnomad},${dbSNP},${onekgenomes},${colors}" \\ + --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ $args \\ diff --git a/nextflow_schema.json b/nextflow_schema.json index 161bd159..6387625e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -72,7 +72,7 @@ "default": "s3://ngi-igenomes/igenomes/" }, "vep_cache": { - "type": "string", + "type": "integer", "description": "Path to VEP cache directory.", "fa_icon": "fas fa-database", "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index f32326c4..220a8710 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -11,6 +11,10 @@ workflow TUMOR_ONLY_HAPPHASE { fasta fai clairSTO_modelMap + dbsnp + colors + onekgenomes + gnomad main: @@ -21,7 +25,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model + def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model return [meta, bam, bai, clairSTO_model] } .set{ tumor_bams } @@ -35,7 +39,11 @@ workflow TUMOR_ONLY_HAPPHASE { CLAIRSTO ( tumor_bams, fasta, - fai + fai, + dbsnp, + colors, + onekgenomes, + gnomad ) ch_versions = ch_versions.mix(CLAIRSTO.out.versions) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 8cb38c33..41f3ca6e 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -89,6 +89,10 @@ workflow LRSOMATIC { params.bed_file = getGenomeAttribute('bed_file') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') + params.dbsnp = getGenomeAttribute('dbsnp') + params.colors = getGenomeAttribute('colors') + params.onekgenomes = getGenomeAttribute('onekgenomes') + params.gnomad = getGenomeAttribute('gnomad') ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() @@ -344,11 +348,20 @@ workflow LRSOMATIC { // // Phasing/haplotagging for tumor only samples + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + TUMOR_ONLY_HAPPHASE ( - branched_minimap.tumor_only, + tumor_only_mapped, ch_fasta, ch_fai, - clairs_modelMap + clairs_modelMap, + dbsnp, + colors, + onekgenomes, + gnomad ) germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) From 307bbaaf3828869f59ca1453cc7c5e1c83230399 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 16:37:06 +0200 Subject: [PATCH 439/557] fix channel reference --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 41f3ca6e..590c7b9a 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -354,7 +354,7 @@ workflow LRSOMATIC { gnomad = file(params.gnomad) TUMOR_ONLY_HAPPHASE ( - tumor_only_mapped, + branched_minimap.tumor_only, ch_fasta, ch_fai, clairs_modelMap, From 6ce8c791a9c8db867a0e147904f5f3f050d58d39 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 17:04:29 +0200 Subject: [PATCH 440/557] Change nextflow schema --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6387625e..0be711d4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -72,13 +72,13 @@ "default": "s3://ngi-igenomes/igenomes/" }, "vep_cache": { - "type": "integer", + "type": "string", "description": "Path to VEP cache directory.", "fa_icon": "fas fa-database", "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." }, "vep_cache_version": { - "type": "string", + "type": "integer", "description": "Version of the VEP cache to use.", "fa_icon": "fas fa-hashtag", "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." From b3cb6329b07e35a7e2bb3486848c0046de64582c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 17:13:40 +0200 Subject: [PATCH 441/557] revert schema --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 0be711d4..161bd159 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -78,7 +78,7 @@ "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." }, "vep_cache_version": { - "type": "integer", + "type": "string", "description": "Version of the VEP cache to use.", "fa_icon": "fas fa-hashtag", "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." From 3cf88f8b0e9ad624461e86041171ef0521910b9a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 17:29:03 +0200 Subject: [PATCH 442/557] pon empty value channels add --- nextflow.config | 2 +- nextflow_schema.json | 2 +- workflows/lrsomatic.nf | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index 7c4152c2..7e457b7e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,7 +20,7 @@ params { // Annotation vep_cache = 's3://annotation-cache/vep_cache/' - vep_cache_version = "113" + vep_cache_version = 113 download_vep_cache = false vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" diff --git a/nextflow_schema.json b/nextflow_schema.json index 161bd159..0be711d4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -78,7 +78,7 @@ "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." }, "vep_cache_version": { - "type": "string", + "type": "integer", "description": "Version of the VEP cache to use.", "fa_icon": "fas fa-hashtag", "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 590c7b9a..1fc6c153 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -348,10 +348,10 @@ workflow LRSOMATIC { // // Phasing/haplotagging for tumor only samples - dbsnp = file(params.dbsnp) - colors = file(params.colors) - onekgenomes = file(params.onekgenomes) - gnomad = file(params.gnomad) + dbsnp = params.dbsnp ? channel.value([]) : file(params.dbsnp) + colors = params.colors ? channel.value([]) : file(params.colors) + onekgenomes = params.onekgenomes ? channel.value([]) :file(params.onekgenomes) + gnomad = params.gnomad ? channel.value([]): file(params.gnomad) TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, From e1d189260d714b3961a170bc38f2fa0d79013c34 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 18:22:40 +0200 Subject: [PATCH 443/557] add webpath for grch38 pon --- conf/igenomes.config | 4 ++++ subworkflows/local/tumor_only_happhase.nf | 1 + workflows/lrsomatic.nf | 9 +++++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 7a57895f..a596042a 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -21,6 +21,10 @@ params { bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" vep_genome = "GRCh38" vep_species = "homo_sapiens" + gnomad = "http://www.bio8.cs.hku.hk/clairs-to/databases/gnomad.r2.1.af-ge-0.001.sites.vcf.gz" + dbsnp = "http://www.bio8.cs.hku.hk/clairs-to/databases/dbsnp.b138.non-somatic.sites.vcf.gz" + onekgenomes = "http://www.bio8.cs.hku.hk/clairs-to/databases/1000g-pon.sites.vcf.gz" + colors = "http://www.bio8.cs.hku.hk/clairs-to/databases/CoLoRSdb.GRCh38.v1.1.0.deepvariant.glnexus.af-ge-0.001.vcf.gz" } 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 220a8710..e07225fd 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -30,6 +30,7 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } + // // MODULE: CLAIRSTO // diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 1fc6c153..27115966 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -348,10 +348,11 @@ workflow LRSOMATIC { // // Phasing/haplotagging for tumor only samples - dbsnp = params.dbsnp ? channel.value([]) : file(params.dbsnp) - colors = params.colors ? channel.value([]) : file(params.colors) - onekgenomes = params.onekgenomes ? channel.value([]) :file(params.onekgenomes) - gnomad = params.gnomad ? channel.value([]): file(params.gnomad) + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, From 076b5a00b870f47f4227d5fe1c54c70122ab1b45 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 29 Sep 2025 20:15:40 +0200 Subject: [PATCH 444/557] update test --- tests/default.nf.test.snap | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index bc80af44..676442ea 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,13 +317,13 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,2cc13bceab1c174adce0ce05d91097e5", - "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", + "severus_all.vcf.gz:md5,47e3f460ce9a2d07fa93429fc638c668", + "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,cdceb5a2fcd35e926b94041e9c729a7d", + "severus_somatic.vcf.gz:md5,2aff0feae812394ccdf5674efdf5fa50", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", @@ -341,13 +341,13 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,c140bb600ae1280f1947a99692ecf70a", - "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", + "severus_all.vcf.gz:md5,b2c790b87e465869a2008785efd9e6cd", + "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,8bf1c9b154885758b3d2eba33ed63804", + "severus_somatic.vcf.gz:md5,c4cc5890f679dc7ec277abc4fecb8679", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", @@ -358,20 +358,20 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,a10d145fad82ad7a2e947f879f6e6783", - "severus_all.vcf.gz.tbi:md5,260da401a1af77c6e87ab46a8b261b79", + "severus_all.vcf.gz:md5,015251f2159330f130e1d195dc52a563", + "severus_all.vcf.gz.tbi:md5,d8bdef944f8235a42a42a7a767875364", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,87c9d93cbc910f7a2552c16cdb0370a6", - "severus_somatic.vcf.gz.tbi:md5,7c7a1ba74affba75fdbb0c4e26afe735" + "severus_somatic.vcf.gz:md5,13b4b41ac72e2979bc9c2234d3cd78dd", + "severus_somatic.vcf.gz.tbi:md5,a37b4cac854818d1fc974ddf1ac90cb6" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.09.0" + "nextflow": "25.04.6" }, - "timestamp": "2025-09-26T11:24:17.953332539" + "timestamp": "2025-09-29T20:11:09.948730299" } } \ No newline at end of file From 833f396b07fc86799158a80bfa1aa4676fa354bd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 30 Sep 2025 10:47:57 +0200 Subject: [PATCH 445/557] add optional to wakhan tumor-only output --- modules/local/wakhan/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index cabaf4a6..822475a6 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -50,7 +50,7 @@ process WAKHAN { tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index - tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks path "versions.yml" , emit: versions From 84bf872c404521376b154683171abf56568714ef Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 30 Sep 2025 12:10:50 +0200 Subject: [PATCH 446/557] remove dummy file --- subworkflows/local/prepare_reference_files.nf | 2 +- tests/default.nf.test.snap | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 7220a51a..fa5da439 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -77,7 +77,7 @@ workflow PREPARE_REFERENCE_FILES { SAMTOOLS_FAIDX ( ch_prepared_fasta, - [ [:], "$projectDir/assets/dummy_file.txt" ], + [ [:], [] ], false ) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 676442ea..7c1111c0 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,13 +317,13 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,47e3f460ce9a2d07fa93429fc638c668", + "severus_all.vcf.gz:md5,e0539cb36c6dce491c9e7e22c18d0ff0", "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,2aff0feae812394ccdf5674efdf5fa50", + "severus_somatic.vcf.gz:md5,09ac9f00d7c5bb915376fa7eeb3071c9", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", @@ -341,13 +341,13 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,b2c790b87e465869a2008785efd9e6cd", + "severus_all.vcf.gz:md5,2720055744aead6531b542e2c79d2664", "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,c4cc5890f679dc7ec277abc4fecb8679", + "severus_somatic.vcf.gz:md5,e4b61a3606671dc18633965a9caeaace", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", @@ -358,20 +358,20 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,015251f2159330f130e1d195dc52a563", - "severus_all.vcf.gz.tbi:md5,d8bdef944f8235a42a42a7a767875364", + "severus_all.vcf.gz:md5,b56edd3d5af6501cceadbc384fa199f2", + "severus_all.vcf.gz.tbi:md5,d63ffeaa2341f195c73369ce3423bd14", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,13b4b41ac72e2979bc9c2234d3cd78dd", - "severus_somatic.vcf.gz.tbi:md5,a37b4cac854818d1fc974ddf1ac90cb6" + "severus_somatic.vcf.gz:md5,3a482330e8ca9a346e39c85af52bad28", + "severus_somatic.vcf.gz.tbi:md5,32f35ffd4584d552027aef4c8840518b" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-29T20:11:09.948730299" + "timestamp": "2025-09-30T12:02:33.707684068" } } \ No newline at end of file From b1b384c38aa13ca41efb1b23fd0237ccefb717ad Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 2 Oct 2025 13:29:32 +0200 Subject: [PATCH 447/557] minor formatting --- conf/igenomes.config | 4 ++-- subworkflows/local/tumor_only_happhase.nf | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index a596042a..089364cf 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -29,13 +29,13 @@ params { 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" genome_name = "CHM13" - vep_genome = "T2T-CHM13v2.0" - vep_species = "homo_sapiens_gca009914755v4" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" + vep_genome = "T2T-CHM13v2.0" + vep_species = "homo_sapiens_gca009914755v4" gnomad = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_gnomad.vcf.gz" dbsnp = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_dbsnp.vcf.gz" onekgenomes = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_1kgenomes.vcf.gz" diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index e07225fd..220a8710 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -30,7 +30,6 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } - // // MODULE: CLAIRSTO // From c06929a102add1aeb0dd080b997043f0aa2d7b56 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 2 Oct 2025 13:54:17 +0200 Subject: [PATCH 448/557] fix in gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cdf2f465..9e307203 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ testing* *.pyc null/ .nf-test -.nf.test.log +.nf-test.log From c68827ad09b40892fc01fe4113a5f5cb54acbbe1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 2 Oct 2025 13:54:47 +0200 Subject: [PATCH 449/557] update snap --- .nf-test.log | 18 ------------------ tests/default.nf.test.snap | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 30 deletions(-) delete mode 100644 .nf-test.log diff --git a/.nf-test.log b/.nf-test.log deleted file mode 100644 index 97cf4db9..00000000 --- a/.nf-test.log +++ /dev/null @@ -1,18 +0,0 @@ -Sep-26 11:02:04.136 [main] INFO com.askimed.nf.test.App - nf-test 0.9.2 -Sep-26 11:02:04.148 [main] INFO com.askimed.nf.test.App - Arguments: [test, tests/, --profile=+vsc_kul_uhasselt,wice, --update-snapshot] -Sep-26 11:02:04.838 [main] INFO com.askimed.nf.test.App - Nextflow Version: 25.09.0 -Sep-26 11:02:04.840 [main] INFO com.askimed.nf.test.commands.RunTestsCommand - Load config from file /lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/nf-test.config... -Sep-26 11:03:07.065 [main] INFO com.askimed.nf.test.lang.dependencies.DependencyResolver - Loaded 45 files from directory /lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic in 61.818 sec -Sep-26 11:03:07.068 [main] INFO com.askimed.nf.test.lang.dependencies.DependencyResolver - Found 1 files containing tests. -Sep-26 11:03:07.068 [main] DEBUG com.askimed.nf.test.lang.dependencies.DependencyResolver - Found files: [/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test] -Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.commands.RunTestsCommand - Found 1 tests to execute. -Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Started test plan -Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Running testsuite 'Test pipeline' from file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test'. -Sep-26 11:03:07.206 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Run test '3c47806f: -profile test'. type: com.askimed.nf.test.lang.pipeline.PipelineTest -Sep-26 11:24:14.121 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Load snapshots from file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test.snap' -Sep-26 11:24:17.953 [main] DEBUG com.askimed.nf.test.lang.extensions.Snapshot - Snapshots '-profile test' do not match. Update snapshots flag set. -Sep-26 11:24:17.953 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Updated snapshot '-profile test' -Sep-26 11:24:23.515 [main] DEBUG com.askimed.nf.test.lang.extensions.SnapshotFile - Wrote snapshots to file '/lustre1/project/stg_00104/lharbers/pipelines/IntGenomicsLab-lrsomatic/tests/default.nf.test.snap' -Sep-26 11:24:23.515 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Test '3c47806f: -profile test' finished. status: PASSED -Sep-26 11:24:23.517 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Testsuite 'Test pipeline' finished. snapshot file: true, skipped tests: false, failed tests: false -Sep-26 11:24:23.519 [main] INFO com.askimed.nf.test.core.TestExecutionEngine - Executed 1 tests. 0 tests failed. Done! diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7c1111c0..61dd1f95 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,13 +317,13 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,e0539cb36c6dce491c9e7e22c18d0ff0", - "severus_all.vcf.gz.tbi:md5,ba39e5569eae0dcd5f6c8b3a914ff817", + "severus_all.vcf.gz:md5,f6071824aa8fc22dd63bd04a4b756d26", + "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,09ac9f00d7c5bb915376fa7eeb3071c9", + "severus_somatic.vcf.gz:md5,dfd229eca0497efda44ad79a91687cf0", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", @@ -341,13 +341,13 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,2720055744aead6531b542e2c79d2664", - "severus_all.vcf.gz.tbi:md5,317df1b08af81094aba65c067a50b6b5", + "severus_all.vcf.gz:md5,806bd3932f0505983d1851bbe5f887ba", + "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,e4b61a3606671dc18633965a9caeaace", + "severus_somatic.vcf.gz:md5,f0fd005299d935e48889f967de29bc7e", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", @@ -358,20 +358,20 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,b56edd3d5af6501cceadbc384fa199f2", - "severus_all.vcf.gz.tbi:md5,d63ffeaa2341f195c73369ce3423bd14", + "severus_all.vcf.gz:md5,8640f700ff50532ca2e9442581bcc3b5", + "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,3a482330e8ca9a346e39c85af52bad28", - "severus_somatic.vcf.gz.tbi:md5,32f35ffd4584d552027aef4c8840518b" + "severus_somatic.vcf.gz:md5,845fd4aca40afd00e4579307baf383e8", + "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "25.09.0" }, - "timestamp": "2025-09-30T12:02:33.707684068" + "timestamp": "2025-10-02T13:53:17.373558071" } } \ No newline at end of file From 23185dd2b03bcc053e67c7412de11105eb251f9d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Sat, 4 Oct 2025 10:57:53 +0200 Subject: [PATCH 450/557] add custom path --- modules/nf-core/ensemblvep/vep/main.nf | 2 ++ nextflow.config | 1 + workflows/lrsomatic.nf | 10 +++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index d6780c4b..2ff1b9ae 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -15,6 +15,7 @@ process ENSEMBLVEP_VEP { path cache tuple val(meta2), path(fasta) path extra_files + path custom_vep output: tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true @@ -36,6 +37,7 @@ process ENSEMBLVEP_VEP { def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta ${fasta}" : "" def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" + args = args.replaceAll(/--custom file=[^,]+/, "--custom file=\${custom_vep}") """ vep \\ -i ${vcf} \\ diff --git a/nextflow.config b/nextflow.config index 7e457b7e..b38eb413 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,6 +23,7 @@ params { vep_cache_version = 113 download_vep_cache = false vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" + vep_custom = null // Skip options diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 27115966..90232f59 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -373,6 +373,7 @@ workflow LRSOMATIC { // MODULE: GERMLINE_VEP // + vep_custom = file(params.vep_custom) GERMLINE_VEP ( germline_vep, params.vep_genome, @@ -380,7 +381,8 @@ workflow LRSOMATIC { params.vep_cache_version, vep_cache, ch_fasta, - [] + [], + vep_custom ) ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) @@ -396,7 +398,8 @@ workflow LRSOMATIC { params.vep_cache_version, vep_cache, ch_fasta, - [] + [], + vep_custom ) ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) @@ -439,7 +442,8 @@ workflow LRSOMATIC { params.vep_cache_version, vep_cache, ch_fasta, - [] + [], + vep_custom ) ch_versions = ch_versions.mix(SV_VEP.out.versions) From 4349c492bdd03178d207d7da699fa5e82162172a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Sat, 4 Oct 2025 11:03:08 +0200 Subject: [PATCH 451/557] null path fix --- workflows/lrsomatic.nf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 90232f59..1dd458b3 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -372,8 +372,11 @@ workflow LRSOMATIC { // // MODULE: GERMLINE_VEP // - - vep_custom = file(params.vep_custom) + if (params.vep_custom != null) { + vep_custom = file(params.vep_custom) + } else { + vep_custom = [] + } GERMLINE_VEP ( germline_vep, params.vep_genome, From 77833c32cc56cdb2033c6d0ead2f10c3cca6ec48 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Sat, 4 Oct 2025 11:21:35 +0200 Subject: [PATCH 452/557] Fix escape --- modules/nf-core/ensemblvep/vep/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 2ff1b9ae..d1e0db34 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -37,7 +37,7 @@ process ENSEMBLVEP_VEP { def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta ${fasta}" : "" def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" - args = args.replaceAll(/--custom file=[^,]+/, "--custom file=\${custom_vep}") + args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") """ vep \\ -i ${vcf} \\ From 06562581dde2c7bdc0765d6f28a248bd02079802 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Sat, 4 Oct 2025 11:54:16 +0200 Subject: [PATCH 453/557] add index --- modules/nf-core/ensemblvep/vep/main.nf | 3 ++- nextflow.config | 1 + workflows/lrsomatic.nf | 14 +++++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index d1e0db34..baaae280 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -15,7 +15,8 @@ process ENSEMBLVEP_VEP { path cache tuple val(meta2), path(fasta) path extra_files - path custom_vep + path custom_vep optional true + path custom_vep_tbi optional true output: tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true diff --git a/nextflow.config b/nextflow.config index b38eb413..ef99d2af 100644 --- a/nextflow.config +++ b/nextflow.config @@ -24,6 +24,7 @@ params { download_vep_cache = false vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" vep_custom = null + vep_custom_tbi = null // Skip options diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 1dd458b3..9e45fe10 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -377,6 +377,11 @@ workflow LRSOMATIC { } else { vep_custom = [] } + if (params.vep_custom_tbi != null) { + vep_custom_tbi = file(params.vep_custom_tbi) + } else { + vep_custom_tbi = [] + } GERMLINE_VEP ( germline_vep, params.vep_genome, @@ -385,7 +390,8 @@ workflow LRSOMATIC { vep_cache, ch_fasta, [], - vep_custom + vep_custom, + vep_custom_tbi ) ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) @@ -402,7 +408,8 @@ workflow LRSOMATIC { vep_cache, ch_fasta, [], - vep_custom + vep_custom, + vep_custom_tbi ) ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) @@ -446,7 +453,8 @@ workflow LRSOMATIC { vep_cache, ch_fasta, [], - vep_custom + vep_custom, + vep_custom_tbi ) ch_versions = ch_versions.mix(SV_VEP.out.versions) From 57cdfdeb7ccae8ca9cc3d41d45401b223c798b12 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Sat, 4 Oct 2025 11:58:28 +0200 Subject: [PATCH 454/557] Fix syntax --- modules/nf-core/ensemblvep/vep/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index baaae280..80c91f0d 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -15,8 +15,8 @@ process ENSEMBLVEP_VEP { path cache tuple val(meta2), path(fasta) path extra_files - path custom_vep optional true - path custom_vep_tbi optional true + path custom_vep + path custom_vep_tbi output: tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true From 831e1f78572121c19f77c8516cbfbac107e40237 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 18:36:37 +0200 Subject: [PATCH 455/557] metaextract fix with rebasecalling --- modules/local/metaextract/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index 7f0e4b20..e71e9443 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -24,7 +24,7 @@ process METAEXTRACT { basecall_model="" kinetics="" if [ $ont = 'true' ]; then - basecall_model=\$(samtools view -H ${bam} ${args} | awk -F'basecall_model=' '{print \$2}' | awk '{print \$1}'| tr -d '[:space:]') + basecall_model=$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print $\2; exit}' | awk '{print \$1}' | tr -d '[:space:]') else kinetics=\$(samtools view -H ${bam} | awk '/--keep-kinetics/ {found=1} END {print (found ? "true" : "false")}') basecall_model="hifi_revio" From 9095328f2dacc00258ab7629c76e7789288d4703 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 18:41:41 +0200 Subject: [PATCH 456/557] typo --- modules/local/metaextract/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index e71e9443..a19b57dd 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -24,7 +24,7 @@ process METAEXTRACT { basecall_model="" kinetics="" if [ $ont = 'true' ]; then - basecall_model=$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print $\2; exit}' | awk '{print \$1}' | tr -d '[:space:]') + basecall_model=\$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print $\2; exit}' | awk '{print \$1}' | tr -d '[:space:]') else kinetics=\$(samtools view -H ${bam} | awk '/--keep-kinetics/ {found=1} END {print (found ? "true" : "false")}') basecall_model="hifi_revio" From 233a2f577a20c79f2b5f5366baffd490da82332e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 18:43:14 +0200 Subject: [PATCH 457/557] double typo --- modules/local/metaextract/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index a19b57dd..48d75ed1 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -24,7 +24,7 @@ process METAEXTRACT { basecall_model="" kinetics="" if [ $ont = 'true' ]; then - basecall_model=\$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print $\2; exit}' | awk '{print \$1}' | tr -d '[:space:]') + basecall_model=\$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print \$2; exit}' | awk '{print \$1}' | tr -d '[:space:]') else kinetics=\$(samtools view -H ${bam} | awk '/--keep-kinetics/ {found=1} END {print (found ? "true" : "false")}') basecall_model="hifi_revio" From b4729e3b3095d4d8dea773df61436d8bbcabf412 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 19:07:14 +0200 Subject: [PATCH 458/557] add vep download args --- conf/modules.config | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index fa77ca52..d4f5d0a2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -299,6 +299,14 @@ process { enabled: false ] } + + ///////// + // VEP // + ///////// + withName : '.*:ENSEMBLVEP_DOWNLOAD' { + ext.args = { "--NO_HTSLIB" } + } + withName : '.*:SOMATIC_VEP' { ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SOMATIC_VEP" } From 7d35bfdd10ab0e7a32a309e6ca161eb94a7f723a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 19:26:22 +0200 Subject: [PATCH 459/557] remove ext args --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d4f5d0a2..76e6ac74 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -304,7 +304,7 @@ process { // VEP // ///////// withName : '.*:ENSEMBLVEP_DOWNLOAD' { - ext.args = { "--NO_HTSLIB" } + ext.args = { "" } } withName : '.*:SOMATIC_VEP' { From 2a1317cf8ca598eeb820d0750632edc3a5a9936e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 19:58:43 +0200 Subject: [PATCH 460/557] add sarek ext args --- conf/modules.config | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 76e6ac74..473c23ec 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -303,8 +303,12 @@ process { ///////// // VEP // ///////// - withName : '.*:ENSEMBLVEP_DOWNLOAD' { - ext.args = { "" } + withName: 'ENSEMBLVEP_DOWNLOAD' { + ext.args = { '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' } + publishDir = [ + mode: params.publish_dir_mode, + path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } + ] } withName : '.*:SOMATIC_VEP' { From 01a91bcc7510a57e64f185c4acb4a907bb3d084d Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 6 Oct 2025 22:04:49 +0200 Subject: [PATCH 461/557] update snap --- conf/modules.config | 8 ++++---- tests/default.nf.test.snap | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 473c23ec..db5fb149 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -299,18 +299,18 @@ process { enabled: false ] } - + ///////// - // VEP // + // VEP // ///////// withName: 'ENSEMBLVEP_DOWNLOAD' { - ext.args = { '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' } + //ext.args = { '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' } publishDir = [ mode: params.publish_dir_mode, path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } ] } - + withName : '.*:SOMATIC_VEP' { ext.args = { "$params.vep_args" } ext.prefix = { "${meta.id}_SOMATIC_VEP" } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 61dd1f95..2134e435 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,13 +317,13 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,f6071824aa8fc22dd63bd04a4b756d26", + "severus_all.vcf.gz:md5,62d168c44ff8056be57b94e2cce8cfdf", "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,dfd229eca0497efda44ad79a91687cf0", + "severus_somatic.vcf.gz:md5,a62181e807d5c9bdb3621496a690e05f", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", @@ -341,13 +341,13 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,806bd3932f0505983d1851bbe5f887ba", + "severus_all.vcf.gz:md5,a88a9672e34613ba3ec9af8a5bb88083", "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,f0fd005299d935e48889f967de29bc7e", + "severus_somatic.vcf.gz:md5,9b19cc4e9a63b8ec88ef56ff7a317a60", "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", @@ -358,13 +358,13 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,8640f700ff50532ca2e9442581bcc3b5", + "severus_all.vcf.gz:md5,afc948fa15b80edba182bdf52e225a4d", "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,845fd4aca40afd00e4579307baf383e8", + "severus_somatic.vcf.gz:md5,fb32b89efcf6d6251b3cee048e39eb8d", "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" ] ], @@ -372,6 +372,6 @@ "nf-test": "0.9.2", "nextflow": "25.09.0" }, - "timestamp": "2025-10-02T13:53:17.373558071" + "timestamp": "2025-10-06T21:47:30.875936725" } } \ No newline at end of file From e891870740676bf91aef108d0722cce87f10d306 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 9 Oct 2025 10:25:51 +0200 Subject: [PATCH 462/557] update wakhan --- modules/local/wakhan/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 822475a6..fab6e81e 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -21,8 +21,8 @@ process WAKHAN { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/wakhan:0.1.2--pyhdfd78af_0 ': - 'biocontainers/wakhan:0.1.2--pyhdfd78af_0 ' }" + 'https://depot.galaxyproject.org/singularity/wakhan:0.2.0--pyhdfd78af_1': + 'biocontainers/wakhan:0.2.0--pyhdfd78af_1' }" input: tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) From f92af47f142aefcd563981d9da262ed1e4b3231c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 9 Oct 2025 11:33:02 +0200 Subject: [PATCH 463/557] update test ignore --- tests/.nftignore | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/.nftignore b/tests/.nftignore index 3ee4eeb0..2c22303c 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -15,4 +15,5 @@ pipeline_info/*.{html,json,txt,yml} */variants/clairsto/*.{vcf.gz,vcf.gz.tbi} */variants/severus/read_ids.csv */variants/severus/severus.log +*/variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} */qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt From f937eb60f780f314e3fdd227fd5d810eca2d0247 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 9 Oct 2025 13:00:57 +0200 Subject: [PATCH 464/557] update snap --- tests/default.nf.test.snap | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 2134e435..e15225dc 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -317,14 +317,10 @@ "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,62d168c44ff8056be57b94e2cce8cfdf", - "severus_all.vcf.gz.tbi:md5,8f919ebc536eb691f0cb0b889c2622de", "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,a62181e807d5c9bdb3621496a690e05f", - "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", @@ -341,14 +337,10 @@ "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,a88a9672e34613ba3ec9af8a5bb88083", - "severus_all.vcf.gz.tbi:md5,de251d60a3a310fbdcc99facb78c9686", "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,9b19cc4e9a63b8ec88ef56ff7a317a60", - "severus_somatic.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -358,20 +350,16 @@ "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_all.vcf.gz:md5,afc948fa15b80edba182bdf52e225a4d", - "severus_all.vcf.gz.tbi:md5,1dd2bb15ee720e482ed098e297f91fe8", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "severus_somatic.vcf.gz:md5,fb32b89efcf6d6251b3cee048e39eb8d", - "severus_somatic.vcf.gz.tbi:md5,4535b0d071e2c6032a50d644dce475c9" + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.09.0" }, - "timestamp": "2025-10-06T21:47:30.875936725" + "timestamp": "2025-10-09T12:54:36.36718409" } } \ No newline at end of file From 52360a9557c2d930c52923ab41ebbe0fc6674560 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 10 Oct 2025 10:41:04 +0200 Subject: [PATCH 465/557] add centromere bed --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index db5fb149..9cd2e5a7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -279,6 +279,7 @@ process { params.wakhan_chroms ? "--contigs ${params.wakhan_chroms}" : (meta.sex == "female" ? "--contigs chr1-22,chrX" : "--contigs chr1-22,chrX,chrY"), "--pdf-enable", + "--centromere ${params.centromere_bed}" ].join(' ').trim() } publishDir = [ path: { "${params.outdir}/${meta.id}/wakhan" }, From 6da0cd9e7dc299cb039cc6df9c5a7653854a10e6 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 10 Oct 2025 14:46:15 +0200 Subject: [PATCH 466/557] update wakhan version and fix new input --- modules/local/wakhan/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index fab6e81e..8bd5d5b9 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -60,9 +60,9 @@ process WAKHAN { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-vcf $vcf" + def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-phased-vcf $vcf" // WARN: Version information not provided by tool on CLI. Please update this string when upgrading BLAZE code - def VERSION = "0.1.2" + def VERSION = "0.2.0" """ wakhan \\ --target-bam ${tumor_input} \\ @@ -83,7 +83,7 @@ process WAKHAN { stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "0.1.2" + def VERSION = "0.2.0" // TODO nf-core: A stub section should mimic the execution of the original module as best as possible // Have a look at the following examples: From e4cf7501dfc09809e0f11fffc61dc78cbbe746c4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 15 Oct 2025 11:38:36 +0200 Subject: [PATCH 467/557] change normal_fiber default --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index b0b143c7..582d9c25 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,7 +25,7 @@ params { vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" - normal_fiber = false + normal_fiber = true // Skip options skip_qc = false From 8d7f84a6a86783b2e12cfb72417865da3e1f6e95 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 15 Oct 2025 16:54:01 +0200 Subject: [PATCH 468/557] add patch file --- modules.json | 103 +++++++++++++----- .../ensemblvep/vep/ensemblvep-vep.diff | 30 +++++ 2 files changed, 107 insertions(+), 26 deletions(-) create mode 100644 modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff diff --git a/modules.json b/modules.json index 043e4e4c..dd0d6c88 100644 --- a/modules.json +++ b/modules.json @@ -8,112 +8,155 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -122,25 +165,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff new file mode 100644 index 00000000..3104732a --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -0,0 +1,30 @@ +Changes in component 'nf-core/ensemblvep/vep' +'modules/nf-core/ensemblvep/vep/meta.yml' is unchanged +Changes in 'ensemblvep/vep/main.nf': +--- modules/nf-core/ensemblvep/vep/main.nf ++++ modules/nf-core/ensemblvep/vep/main.nf +@@ -15,6 +15,8 @@ + path cache + tuple val(meta2), path(fasta) + path extra_files ++ path custom_vep ++ path custom_vep_tbi + + output: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true +@@ -36,6 +38,7 @@ + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta ${fasta}" : "" + def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" ++ args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") + """ + vep \\ + -i ${vcf} \\ + +'modules/nf-core/ensemblvep/vep/environment.yml' is unchanged +'modules/nf-core/ensemblvep/vep/tests/main.nf.test' is unchanged +'modules/nf-core/ensemblvep/vep/tests/vcf.config' is unchanged +'modules/nf-core/ensemblvep/vep/tests/tab.gz.config' is unchanged +'modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap' is unchanged +'modules/nf-core/ensemblvep/vep/tests/nextflow.config' is unchanged +************************************************************ From d4032eb75e90ed2ed6d106caf2720055a3b531c9 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 15 Oct 2025 16:57:48 +0200 Subject: [PATCH 469/557] fix linting --- modules.json | 102 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/modules.json b/modules.json index dd0d6c88..52190c75 100644 --- a/modules.json +++ b/modules.json @@ -8,155 +8,113 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -165,33 +123,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From b6d0e239057cde813ec42efdb0f2b5f271a5e9ad Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 15 Oct 2025 17:01:47 +0200 Subject: [PATCH 470/557] fix default value --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index b73ef151..12dabb38 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -350,7 +350,7 @@ }, "normal_fiber": { "type": "boolean", - "default": false, + "default": true, "description": "do fiber-seq on normal samples", "fa_icon": "fas fa-fiber", "hidden": true From 4c5973f8125cdf68b3ca7eae47ec968578db0538 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 30 Oct 2025 17:02:21 +0100 Subject: [PATCH 471/557] fix clairs indel calling --- modules/local/clairs/main.nf | 6 +++++- modules/nf-core/ensemblvep/vep/main.nf | 2 +- subworkflows/local/tumor_normal_happhase.nf | 2 +- tests/default.nf.test.snap | 12 ++++++++++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 5d710693..f727c214 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,7 +12,9 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("${meta.id}.vcf.gz"), emit: all_vcf + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi path "versions.yml", emit: versions @@ -29,6 +31,8 @@ process CLAIRS { --normal_bam_fn $normal_bam \\ --ref_fn $reference \\ --threads $task.cpus \\ + --enable_indel_calling \\ + --haplotagged_tumor_bam_provided_so_skip_intermediate_phasing_and_haplotagging \\ --platform $model \\ --output_dir . \\ --output_prefix $prefix \\ diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 80c91f0d..6ef37082 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -1,6 +1,6 @@ process ENSEMBLVEP_VEP { tag "${meta.id}" - label 'process_medium' + label 'process_very_high' conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index fd6ed3c0..cf998016 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -268,7 +268,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) - CLAIRS.out.vcf + CLAIRS.out.all_vcf .map { meta, vcf -> def extra = [] return [meta,vcf, extra] diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index e15225dc..64647d66 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -148,8 +148,12 @@ "sample1/variants/clair3/merge_output.vcf.gz", "sample1/variants/clair3/merge_output.vcf.gz.tbi", "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/sample1.vcf.gz", "sample1/variants/clairs/sample1.vcf.gz.tbi", + "sample1/variants/clairs/snv.vcf.gz", + "sample1/variants/clairs/snv.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -214,8 +218,12 @@ "sample2/variants/clair3/merge_output.vcf.gz", "sample2/variants/clair3/merge_output.vcf.gz.tbi", "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/sample2.vcf.gz", "sample2/variants/clairs/sample2.vcf.gz.tbi", + "sample2/variants/clairs/snv.vcf.gz", + "sample2/variants/clairs/snv.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -358,8 +366,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.09.0" + "nextflow": "25.04.6" }, - "timestamp": "2025-10-09T12:54:36.36718409" + "timestamp": "2025-10-30T17:00:44.230935974" } } \ No newline at end of file From d60b5eea79a8311f608b38a8dac6a02e3dde4c9f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 11:34:36 +0100 Subject: [PATCH 472/557] view --- conf/modules.config | 8 ++------ modules/local/clairs/main.nf | 8 ++++---- modules/local/metaextract/main.nf | 4 ++-- subworkflows/local/prepare_reference_files.nf | 2 ++ .../local/utils_nfcore_lrsomatic_pipeline/main.nf | 2 ++ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9cd2e5a7..2e86eb6d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -168,18 +168,14 @@ process { ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/fibertoolsrs/predictm6a" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } withName: '.*:FIBERTOOLSRS_FIRE' { ext.args = { (meta.platform == "ont") ? "--ont" : "" } publishDir = [ - path: { "${params.outdir}/${meta.id}/methylation/${meta.type}/fibertoolsrs/fire" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index f727c214..065eb46c 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -13,10 +13,10 @@ process CLAIRS { output: tuple val(meta), path("${meta.id}.vcf.gz"), emit: all_vcf - tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml", emit: versions + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index 48d75ed1..7f032250 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -11,8 +11,8 @@ process METAEXTRACT { tuple val(meta), path(bam) output: - tuple val(meta), env(basecall_model),env(kinetics) , emit: meta_ext - path "versions.yml" , emit: versions + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index fa5da439..a7d94704 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,6 +39,7 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } + basecall_meta.view() basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def meta_new = [id: basecall_model_meta] @@ -50,6 +51,7 @@ workflow PREPARE_REFERENCE_FILES { .unique() .set{ model_urls } + model_urls.view() // // MODULE: Download model diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 60e847cc..788af9c9 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -100,6 +100,8 @@ workflow PIPELINE_INITIALISATION { } .set { ch_samplesheet } + ch_samplesheet.view() + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] // bam: unaligned bams From b20166fa374a51c012323c15377dce6625d54092 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 14:24:52 +0100 Subject: [PATCH 473/557] fix id --- subworkflows/local/prepare_reference_files.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index a7d94704..36fcada3 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -42,7 +42,8 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.view() basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - def meta_new = [id: basecall_model_meta] + def id_new = basecall_model_meta ?: meta.clair3_model + def meta_new = [id: id_new] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" From 233059acedd585494a39b76c7726c215b7f750d9 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 14:36:05 +0100 Subject: [PATCH 474/557] remove view --- subworkflows/local/prepare_reference_files.nf | 2 -- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 1 - workflows/lrsomatic.nf | 5 ----- 3 files changed, 8 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 36fcada3..722b9f73 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,7 +39,6 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } - basecall_meta.view() basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def id_new = basecall_model_meta ?: meta.clair3_model @@ -52,7 +51,6 @@ workflow PREPARE_REFERENCE_FILES { .unique() .set{ model_urls } - model_urls.view() // // MODULE: Download model diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 788af9c9..91915a3e 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -100,7 +100,6 @@ workflow PIPELINE_INITIALISATION { } .set { ch_samplesheet } - ch_samplesheet.view() // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] // bam: unaligned bams diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 5ff7997d..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -218,7 +218,6 @@ workflow LRSOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { - //ch_cat_ubams.view() if(!params.normal_fiber){ ch_cat_ubams .branch { meta, bams -> @@ -228,9 +227,7 @@ workflow LRSOMATIC { .set { ch_cat_ubams_normal_branching } normal_bams = ch_cat_ubams_normal_branching.normal - normal_bams.view() ubams = ch_cat_ubams_normal_branching.tumor - ubams.view() } else { ubams = ch_cat_ubams @@ -243,7 +240,6 @@ workflow LRSOMATIC { .set{ch_cat_ubams_pacbio_ont_branching} pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio - pacbio_bams.view() pacbio_bams .branch{meta, bams -> kinetics: meta.kinetics == "true" @@ -295,7 +291,6 @@ workflow LRSOMATIC { fiber_branch.nonFiber .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) - .view() .set{ch_cat_ubams} } From 4350f5743ea22f2da535d7b7d502b46e2c681feb Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 19:09:05 +0100 Subject: [PATCH 475/557] Revert "fix id" This reverts commit b20166fa374a51c012323c15377dce6625d54092. --- subworkflows/local/prepare_reference_files.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 722b9f73..fa5da439 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -41,8 +41,7 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - def id_new = basecall_model_meta ?: meta.clair3_model - def meta_new = [id: id_new] + def meta_new = [id: basecall_model_meta] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" From d3623ac99fc88573fb3fbb9ca304b80061ac91ad Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 19:11:00 +0100 Subject: [PATCH 476/557] revert --- subworkflows/local/prepare_reference_files.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index fa5da439..722b9f73 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -41,7 +41,8 @@ workflow PREPARE_REFERENCE_FILES { basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - def meta_new = [id: basecall_model_meta] + def id_new = basecall_model_meta ?: meta.clair3_model + def meta_new = [id: id_new] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) def url = "${download_prefix}/${model}.tar.gz" From 424befd3e01577006cbc8414cef84424986d8eaa Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 19:17:38 +0100 Subject: [PATCH 477/557] patch --- modules.json | 102 +++++++++++++----- .../ensemblvep/vep/ensemblvep-vep.diff | 8 ++ 2 files changed, 84 insertions(+), 26 deletions(-) diff --git a/modules.json b/modules.json index 52190c75..dd0d6c88 100644 --- a/modules.json +++ b/modules.json @@ -8,113 +8,155 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -123,25 +165,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff index 3104732a..71c05d4b 100644 --- a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -3,6 +3,14 @@ Changes in component 'nf-core/ensemblvep/vep' Changes in 'ensemblvep/vep/main.nf': --- modules/nf-core/ensemblvep/vep/main.nf +++ modules/nf-core/ensemblvep/vep/main.nf +@@ -1,6 +1,6 @@ + process ENSEMBLVEP_VEP { + tag "${meta.id}" +- label 'process_medium' ++ label 'process_very_high' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container @@ -15,6 +15,8 @@ path cache tuple val(meta2), path(fasta) From c70e403f5ae98ff1442953419995878ffabd0b2a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 18 Nov 2025 19:18:42 +0100 Subject: [PATCH 478/557] prettier --- modules.json | 102 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/modules.json b/modules.json index dd0d6c88..52190c75 100644 --- a/modules.json +++ b/modules.json @@ -8,155 +8,113 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -165,33 +123,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From dadd850e1536553dd28a7848660bf2a089ca61a2 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 10:46:55 +0100 Subject: [PATCH 479/557] view --- conf/modules.config | 7 +++++++ subworkflows/local/tumor_normal_happhase.nf | 2 ++ 2 files changed, 9 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 2e86eb6d..a119e03f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -179,6 +179,13 @@ process { ] } + withName: '.*:FIBERTOOLSRS_NUCLEOSOMES' { + ext.args = { (meta.platform == "ont") ? "--ont" : "" } + publishDir = [ + enabled: false + ] + } + // // Phasing processes // diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index cf998016..1c0bf976 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -220,6 +220,8 @@ workflow TUMOR_NORMAL_HAPPHASE { // bais: indexes for bam files // Group everything back together in one channel + mixed_hapbams.view() + mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> def new_meta = [id: meta.id, From e45936715c37a29f796811f31fccd948981da481 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 11:11:05 +0100 Subject: [PATCH 480/557] grouptuple fix --- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 1c0bf976..22e6714b 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -221,7 +221,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Group everything back together in one channel mixed_hapbams.view() - + mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> def new_meta = [id: meta.id, @@ -232,7 +232,7 @@ workflow TUMOR_NORMAL_HAPPHASE { basecall_model: meta.basecall_model] return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } - .groupTuple() + .groupTuple(size: 2) .map{ meta, bam, bai -> def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] From dc306316fa233e5970a88e6c8bfd8e6b2aa33d22 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 11:46:53 +0100 Subject: [PATCH 481/557] Template update for nf-core/tools version 3.2.0 --- .github/CONTRIBUTING.md | 16 +++---- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 8 ++-- .github/workflows/branch.yml | 4 +- .github/workflows/ci.yml | 4 +- .github/workflows/download_pipeline.yml | 28 ++++++----- .github/workflows/fix-linting.yml | 4 +- .github/workflows/linting_comment.yml | 2 +- .nf-core.yml | 46 +++++++++---------- .pre-commit-config.yaml | 2 +- CHANGELOG.md | 4 +- CITATIONS.md | 2 +- LICENSE | 2 +- README.md | 20 ++++---- assets/adaptivecard.json | 2 +- assets/email_template.html | 14 +++--- assets/email_template.txt | 8 ++-- assets/methods_description_template.yml | 8 ++-- assets/multiqc_config.yml | 6 +-- assets/schema_input.json | 4 +- assets/sendmail_template.txt | 6 +-- assets/slackreport.json | 2 +- conf/base.config | 2 +- conf/test.config | 6 +-- conf/test_full.config | 2 +- docs/README.md | 4 +- docs/output.md | 6 ++- docs/usage.md | 10 ++-- main.nf | 22 ++++----- modules.json | 6 +-- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 +++++----- nextflow.config | 32 ++++++------- nextflow_schema.json | 4 +- ro-crate-metadata.json | 32 ++++++------- .../main.nf | 2 +- workflows/{lr_somatic.nf => lrsomatic.nf} | 6 +-- 39 files changed, 183 insertions(+), 177 deletions(-) rename subworkflows/local/{utils_nfcore_lr_somatic_pipeline => utils_nfcore_lrsomatic_pipeline}/main.nf (99%) rename workflows/{lr_somatic.nf => lrsomatic.nf} (96%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 720724b7..03608b2f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,9 +1,9 @@ -# `IntGenomicsLab/lr_somatic`: Contributing Guidelines +# `IntGenomicsLab/lrsomatic`: Contributing Guidelines Hi there! -Many thanks for taking an interest in improving IntGenomicsLab/lr_somatic. +Many thanks for taking an interest in improving IntGenomicsLab/lrsomatic. -We try to manage the required tasks for IntGenomicsLab/lr_somatic using GitHub issues, you probably came to this page when creating one. +We try to manage the required tasks for IntGenomicsLab/lrsomatic using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. However, don't be put off by this template - other more general issues and suggestions are welcome! @@ -11,10 +11,10 @@ Contributions to the code are even more welcome ;) ## Contribution workflow -If you'd like to write some code for IntGenomicsLab/lr_somatic, the standard workflow is as follows: +If you'd like to write some code for IntGenomicsLab/lrsomatic, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lr_somatic issues](https://github.com/IntGenomicsLab/lr_somatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lr_somatic repository](https://github.com/IntGenomicsLab/lr_somatic) to your GitHub account +1. Check that there isn't already an issue about your idea in the [IntGenomicsLab/lrsomatic issues](https://github.com/IntGenomicsLab/lrsomatic/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [IntGenomicsLab/lrsomatic repository](https://github.com/IntGenomicsLab/lrsomatic) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged @@ -58,7 +58,7 @@ These tests are run both with the latest available version of `Nextflow` and als ## Pipeline contribution conventions -To make the `IntGenomicsLab/lr_somatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. +To make the `IntGenomicsLab/lrsomatic` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. ### Adding a new step @@ -108,7 +108,7 @@ This repo includes a devcontainer configuration which will create a GitHub Codes To get started: -- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lr_somatic/codespaces) +- Open the repo in [Codespaces](https://github.com/IntGenomicsLab/lrsomatic/codespaces) - Tools installed - nf-core - Nextflow diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1cd94f85..458770e1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -39,4 +39,4 @@ body: * Executor _(eg. slurm, local, awsbatch)_ * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter, Charliecloud, or Apptainer)_ * OS _(eg. CentOS Linux, macOS, Linux Mint)_ - * Version of IntGenomicsLab/lr_somatic _(eg. 1.1, 1.5, 1.8.2)_ + * Version of IntGenomicsLab/lrsomatic _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 8a49b9b9..0e27f761 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Suggest an idea for the IntGenomicsLab/lr_somatic pipeline +description: Suggest an idea for the IntGenomicsLab/lrsomatic pipeline labels: enhancement body: - type: textarea diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d23d77b4..6d5a41ed 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,21 +1,21 @@ ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lr_somatic/tree/main/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lrsomatic/tree/master/.github/CONTRIBUTING.md) - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 6b774892..0e125373 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,9 +13,9 @@ jobs: steps: # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs - if: github.repository == 'IntGenomicsLab/lr_somatic' + if: github.repository == 'IntGenomicsLab/lrsomatic' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lr_somatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == IntGenomicsLab/lrsomatic ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ad5fc3a..05e97821 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: test: name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'IntGenomicsLab/lr_somatic') }}" + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'IntGenomicsLab/lrsomatic') }}" runs-on: ubuntu-latest strategy: matrix: @@ -46,6 +46,8 @@ jobs: steps: - name: Check out pipeline code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 - name: Set up Nextflow uses: nf-core/setup-nextflow@v2 diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 13b51e2c..ab06316e 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -34,6 +34,17 @@ jobs: REPO_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPO_LOWERCASE }} REPOTITLE_LOWERCASE: ${{ steps.get_repo_properties.outputs.REPOTITLE_LOWERCASE }} REPO_BRANCH: ${{ steps.get_repo_properties.outputs.REPO_BRANCH }} + steps: + - name: Get the repository name and current branch + id: get_repo_properties + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" + echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" + + download: + runs-on: ubuntu-latest + needs: configure steps: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -56,21 +67,10 @@ jobs: python -m pip install --upgrade pip pip install git+https://github.com/nf-core/tools.git@dev - - name: Get the repository name and current branch set as environment variable - id: get_repo_properties - run: | - echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" - echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> "$GITHUB_OUTPUT" - echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> "$GITHUB_OUTPUT" - - name: Make a cache directory for the container images run: | mkdir -p ./singularity_container_images - download: - runs-on: ubuntu-latest - needs: configure - steps: - name: Download the pipeline env: NXF_SINGULARITY_CACHEDIR: ./singularity_container_images @@ -87,6 +87,9 @@ jobs: - name: Inspect download run: tree ./${{ needs.configure.outputs.REPOTITLE_LOWERCASE }} + - name: Inspect container images + run: tree ./singularity_container_images | tee ./container_initial + - name: Count the downloaded number of container images id: count_initial run: | @@ -123,7 +126,8 @@ jobs: final_count=${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }} difference=$((final_count - initial_count)) echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" - tree ./singularity_container_images + tree ./singularity_container_images > ./container_afterwards + diff ./container_initial ./container_afterwards exit 1 else echo "The pipeline can be downloaded successfully!" diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 0075e577..42190fc1 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -9,7 +9,7 @@ jobs: if: > contains(github.event.comment.html_url, '/pull/') && contains(github.event.comment.body, '@nf-core-bot fix linting') && - github.repository == 'IntGenomicsLab/lr_somatic' + github.repository == 'IntGenomicsLab/lrsomatic' runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later @@ -86,4 +86,4 @@ jobs: issue-number: ${{ github.event.issue.number }} body: | @${{ github.actor }} I tried to fix the linting errors, but it didn't work. Please fix them manually. - See [CI log](https://github.com/IntGenomicsLab/lr_somatic/actions/runs/${{ github.run_id }}) for more details. + See [CI log](https://github.com/IntGenomicsLab/lrsomatic/actions/runs/${{ github.run_id }}) for more details. diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 0bed96d3..95b6b6af 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@80620a5d27ce0ae443b965134db88467fc607b43 # v7 + uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.nf-core.yml b/.nf-core.yml index 80948bbf..71b40212 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,18 +1,24 @@ -repository_type: pipeline - -nf_core_version: 3.1.1 - lint: + files_exist: + - CODE_OF_CONDUCT.md + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png + - .github/ISSUE_TEMPLATE/config.yml + - .github/workflows/awstest.yml + - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md - assets/email_template.txt - docs/README.md + multiqc_config: + - report_comment nextflow_config: - manifest.name - manifest.homePage @@ -20,25 +26,17 @@ lint: - validation.help.afterText - validation.summary.beforeText - validation.summary.afterText - multiqc_config: - - report_comment - files_exist: - - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png - - .github/ISSUE_TEMPLATE/config.yml - - .github/workflows/awstest.yml - - .github/workflows/awsfulltest.yml - + schema_params: false +nf_core_version: 3.2.0 +repository_type: pipeline template: - org: IntGenomicsLab - name: lr_somatic - description: Workflow for somatic variant calling of long read data author: Jonas Demeulemeester - version: 1.0.0dev - force: true + description: Workflow for somatic variant calling of long read data + force: false + is_nfcore: false + name: lrsomatic + org: IntGenomicsLab outdir: . skip_features: - fastqc - is_nfcore: false + version: 1.0.0dev diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e9f0e1c..1dec8650 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: - prettier@3.2.5 - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.0.3" + rev: "3.1.2" hooks: - id: editorconfig-checker alias: ec diff --git a/CHANGELOG.md b/CHANGELOG.md index ee035dca..5b2733d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ -# IntGenomicsLab/lr_somatic: Changelog +# IntGenomicsLab/lrsomatic: Changelog The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## v1.0.0dev - [date] -Initial release of IntGenomicsLab/lr_somatic, created with the [nf-core](https://nf-co.re/) template. +Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` diff --git a/CITATIONS.md b/CITATIONS.md index 08105ad6..33c9f5f1 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Citations +# IntGenomicsLab/lrsomatic: Citations ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) diff --git a/LICENSE b/LICENSE index 21de0ec6..27d3cdc5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) The IntGenomicsLab/lr_somatic team +Copyright (c) The IntGenomicsLab/lrsomatic team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 3b4672ea..d65adb7e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# IntGenomicsLab/lr_somatic +# IntGenomicsLab/lrsomatic -[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml) -[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml) +[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) -[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic) +[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic) ## Introduction -**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ... ```bash -nextflow run IntGenomicsLab/lr_somatic \ +nextflow run IntGenomicsLab/lrsomatic \ -profile \ --input samplesheet.csv \ --outdir @@ -61,7 +61,7 @@ nextflow run IntGenomicsLab/lr_somatic \ ## Credits -IntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester. We thank the following people for their extensive assistance in the development of this pipeline: @@ -74,7 +74,9 @@ If you would like to contribute to this pipeline, please see the [contributing g ## Citations - + + + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json index 12604f03..a7f7c25d 100644 --- a/assets/adaptivecard.json +++ b/assets/adaptivecard.json @@ -17,7 +17,7 @@ "size": "Large", "weight": "Bolder", "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", - "text": "IntGenomicsLab/lr_somatic v${version} - ${runName}", + "text": "IntGenomicsLab/lrsomatic v${version} - ${runName}", "wrap": true }, { diff --git a/assets/email_template.html b/assets/email_template.html index 43e12a3f..f1b77923 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -4,21 +4,21 @@ - - IntGenomicsLab/lr_somatic Pipeline Report + + IntGenomicsLab/lrsomatic Pipeline Report
-

IntGenomicsLab/lr_somatic ${version}

+

IntGenomicsLab/lrsomatic ${version}

Run Name: $runName

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

IntGenomicsLab/lr_somatic execution completed unsuccessfully!

+

IntGenomicsLab/lrsomatic execution completed unsuccessfully!

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

The full error message was:

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

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

Pipeline Configuration:

-

IntGenomicsLab/lr_somatic

-

https://github.com/IntGenomicsLab/lr_somatic

+

IntGenomicsLab/lrsomatic

+

https://github.com/IntGenomicsLab/lrsomatic

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

Methods

-

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

+

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

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

${workflow.commandLine}

${tool_citations}

diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index d1ad8766..1a75540e 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,12 +1,12 @@ report_comment: > - This report has been generated by the IntGenomicsLab/lr_somatic + This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. report_section_order: - "IntGenomicsLab-lr_somatic-methods-description": + "IntGenomicsLab-lrsomatic-methods-description": order: -1000 software_versions: order: -1001 - "IntGenomicsLab-lr_somatic-summary": + "IntGenomicsLab-lrsomatic-summary": order: -1002 export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index fda49a3f..fb9a2466 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/assets/schema_input.json", - "title": "IntGenomicsLab/lr_somatic pipeline - params.input schema", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/master/assets/schema_input.json", + "title": "IntGenomicsLab/lrsomatic pipeline - params.input schema", "description": "Schema for the file provided with params.input", "type": "array", "items": { diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 831121de..2e397d1b 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -9,12 +9,12 @@ Content-Type: text/html; charset=utf-8 $email_html --nfcoremimeboundary -Content-Type: image/png;name="IntGenomicsLab-lr_somatic_logo.png" +Content-Type: image/png;name="IntGenomicsLab-lrsomatic_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="IntGenomicsLab-lr_somatic_logo_light.png" +Content-Disposition: inline; filename="IntGenomicsLab-lrsomatic_logo_light.png" -<% out << new File("$projectDir/assets/IntGenomicsLab-lr_somatic_logo_light.png"). +<% out << new File("$projectDir/assets/IntGenomicsLab-lrsomatic_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/assets/slackreport.json b/assets/slackreport.json index c7f8d912..e8425ad8 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "IntGenomicsLab/lr_somatic ${version} - ${runName}", + "author_name": "IntGenomicsLab/lrsomatic ${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/base.config b/conf/base.config index 8bc8e250..4a012faa 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow base config file + IntGenomicsLab/lrsomatic Nextflow base config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on diff --git a/conf/test.config b/conf/test.config index ec9b4d95..117abf0c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test, --outdir ---------------------------------------------------------------------------------------- */ @@ -25,8 +25,6 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - - // Genome references + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv'// Genome references genome = 'R64-1-1' } diff --git a/conf/test_full.config b/conf/test_full.config index 67045bb5..bc82ecba 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run IntGenomicsLab/lr_somatic -profile test_full, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/README.md b/docs/README.md index 4d1ead62..14889bd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# IntGenomicsLab/lr_somatic: Documentation +# IntGenomicsLab/lrsomatic: Documentation -The IntGenomicsLab/lr_somatic documentation is split into the following pages: +The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. diff --git a/docs/output.md b/docs/output.md index fc35fed4..b3f2ed82 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Output +# IntGenomicsLab/lrsomatic: Output ## Introduction @@ -29,7 +29,9 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see .### Pipeline information +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +### Pipeline information
Output files diff --git a/docs/usage.md b/docs/usage.md index 3881d3c1..e0528582 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,4 +1,4 @@ -# IntGenomicsLab/lr_somatic: Usage +# IntGenomicsLab/lrsomatic: Usage > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ @@ -55,7 +55,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run IntGenomicsLab/lr_somatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -79,7 +79,7 @@ Pipeline settings can be provided in a `yaml` or `json` file via `-params-file < The above pipeline run specified with a params file in yaml format: ```bash -nextflow run IntGenomicsLab/lr_somatic -profile docker -params-file params.yaml +nextflow run IntGenomicsLab/lrsomatic -profile docker -params-file params.yaml ``` with: @@ -98,14 +98,14 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: ```bash -nextflow pull IntGenomicsLab/lr_somatic +nextflow pull IntGenomicsLab/lrsomatic ``` ### Reproducibility It is a good idea to specify the pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [IntGenomicsLab/lr_somatic releases page](https://github.com/IntGenomicsLab/lr_somatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. +First, go to the [IntGenomicsLab/lrsomatic releases page](https://github.com/IntGenomicsLab/lrsomatic/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. diff --git a/main.nf b/main.nf index 502dad5c..21003825 100644 --- a/main.nf +++ b/main.nf @@ -1,9 +1,9 @@ #!/usr/bin/env nextflow /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic + IntGenomicsLab/lrsomatic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Github : https://github.com/IntGenomicsLab/lr_somatic + Github : https://github.com/IntGenomicsLab/lrsomatic ---------------------------------------------------------------------------------------- */ @@ -13,10 +13,10 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { LR_SOMATIC } from './workflows/lr_somatic' -include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { LRSOMATIC } from './workflows/lrsomatic' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,7 +38,7 @@ params.fasta = getGenomeAttribute('fasta') // // WORKFLOW: Run main analysis pipeline depending on type of input // -workflow INTGENOMICSLAB_LR_SOMATIC { +workflow INTGENOMICSLAB_LRSOMATIC { take: samplesheet // channel: samplesheet read in from --input @@ -48,11 +48,11 @@ workflow INTGENOMICSLAB_LR_SOMATIC { // // WORKFLOW: Run pipeline // - LR_SOMATIC ( + LRSOMATIC ( samplesheet ) emit: - multiqc_report = LR_SOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html + multiqc_report = LRSOMATIC.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -78,7 +78,7 @@ workflow { // // WORKFLOW: Run main workflow // - INTGENOMICSLAB_LR_SOMATIC ( + INTGENOMICSLAB_LRSOMATIC ( PIPELINE_INITIALISATION.out.samplesheet ) // @@ -91,7 +91,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - INTGENOMICSLAB_LR_SOMATIC.out.multiqc_report + INTGENOMICSLAB_LRSOMATIC.out.multiqc_report ) } diff --git a/modules.json b/modules.json index 99f2f4e0..f194d41e 100644 --- a/modules.json +++ b/modules.json @@ -1,13 +1,13 @@ { - "name": "IntGenomicsLab/lr_somatic", - "homePage": "https://github.com/IntGenomicsLab/lr_somatic", + "name": "IntGenomicsLab/lrsomatic", + "homePage": "https://github.com/IntGenomicsLab/lrsomatic", "repos": { "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { "multiqc": { "branch": "master", - "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", + "git_sha": "f0719ae309075ae4a291533883847c3f7c441dad", "installed_by": ["modules"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 6f5b867b..a27122ce 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.25.1 + - bioconda::multiqc=1.27 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index cc0643e1..58d9313c 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : - 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : + 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 2fcbb5ff..7b7c1322 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:51:46.317523" + "timestamp": "2025-01-27T09:29:57.631982377" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:52:20.680978" + "timestamp": "2025-01-27T09:30:34.743726958" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" + "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "24.10.4" }, - "timestamp": "2024-10-02T17:52:09.185842" + "timestamp": "2025-01-27T09:30:21.44383553" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index bcf75c6f..3d9651f0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IntGenomicsLab/lr_somatic Nextflow config file + IntGenomicsLab/lrsomatic Nextflow config file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- @@ -167,9 +167,9 @@ profiles { // Load nf-core custom profiles from different Institutions includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" -// Load IntGenomicsLab/lr_somatic custom profiles from different institutions. +// Load IntGenomicsLab/lrsomatic custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/lr_somatic.config" : "/dev/null" +// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -195,14 +195,14 @@ env { } // Set bash options -process.shell = """\ -bash - -set -e # Exit if a tool returns a non-zero status/exit code -set -u # Treat unset variables and parameters as an error -set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute -set -C # No clobber - prevent output redirection from overwriting files. -""" +process.shell = [ + "bash", + "-C", // No clobber - prevent output redirection from overwriting files. + "-e", // Exit if a tool returns a non-zero status/exit code + "-u", // Treat unset variables and parameters as an error + "-o", // Returns the status of the last command to exit.. + "pipefail" // ..with a non-zero status or zero if all successfully execute +] // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false @@ -225,7 +225,7 @@ dag { } manifest { - name = 'IntGenomicsLab/lr_somatic' + name = 'IntGenomicsLab/lrsomatic' author = """Jonas Demeulemeester""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 @@ -238,10 +238,10 @@ manifest { orcid: '' ], ] - homePage = 'https://github.com/IntGenomicsLab/lr_somatic' + homePage = 'https://github.com/IntGenomicsLab/lrsomatic' description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' - defaultBranch = 'main' + defaultBranch = 'master' nextflowVersion = '!>=24.04.2' version = '1.0.0dev' doi = '' @@ -249,7 +249,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.1.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { @@ -257,7 +257,7 @@ validation { monochromeLogs = params.monochrome_logs help { enabled = true - command = "nextflow run IntGenomicsLab/lr_somatic -profile --input samplesheet.csv --outdir " + command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " fullParameter = "help_full" showHiddenParameter = "show_hidden" } diff --git a/nextflow_schema.json b/nextflow_schema.json index a33030c5..1d3318a3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lr_somatic/main/nextflow_schema.json", - "title": "IntGenomicsLab/lr_somatic pipeline parameters", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/master/nextflow_schema.json", + "title": "IntGenomicsLab/lrsomatic pipeline parameters", "description": "Workflow for somatic variant calling of long read data", "type": "object", "$defs": { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 792a7686..2a581778 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-02-04T09:18:13+00:00", - "description": "# IntGenomicsLab/lr_somatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lr_somatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lr_somatic)\n\n## Introduction\n\n**IntGenomicsLab/lr_somatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow.Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lr_somatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-11-19T10:46:46+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -86,17 +86,17 @@ "@id": ".prettierignore" } ], - "isBasedOn": "https://github.com/IntGenomicsLab/lr_somatic", + "isBasedOn": "https://github.com/IntGenomicsLab/lrsomatic", "license": "MIT", "mainEntity": { "@id": "main.nf" }, "mentions": [ { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4" + "@id": "#2f44f760-b43e-4d7d-a433-9e0168809b65" } ], - "name": "IntGenomicsLab/lr_somatic" + "name": "IntGenomicsLab/lrsomatic" }, { "@id": "ro-crate-metadata.json", @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-02-04T10:18:13Z", + "dateModified": "2025-11-19T11:46:46Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -131,7 +131,7 @@ "MIT" ], "name": [ - "IntGenomicsLab/lr_somatic" + "IntGenomicsLab/lrsomatic" ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" @@ -140,11 +140,11 @@ "@id": "https://nf-co.re/" }, "url": [ - "https://github.com/IntGenomicsLab/lr_somatic", - "https://nf-co.re/IntGenomicsLab/lr_somatic/dev/" + "https://github.com/IntGenomicsLab/lrsomatic", + "https://nf-co.re/IntGenomicsLab/lrsomatic/dev/" ], "version": [ - "0.0.1dev" + "1.0.0dev" ] }, { @@ -160,23 +160,23 @@ "version": "!>=24.04.2" }, { - "@id": "#a8b3165d-dbe4-4de1-8c6e-bf3699fba9b4", + "@id": "#2f44f760-b43e-4d7d-a433-9e0168809b65", "@type": "TestSuite", "instance": [ { - "@id": "#50633232-76d9-47a1-a630-a13639384949" + "@id": "#38cd2023-c9c0-485d-8dc7-49258af762ab" } ], "mainEntity": { "@id": "main.nf" }, - "name": "Test suite for IntGenomicsLab/lr_somatic" + "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#50633232-76d9-47a1-a630-a13639384949", + "@id": "#38cd2023-c9c0-485d-8dc7-49258af762ab", "@type": "TestInstance", - "name": "GitHub Actions workflow for testing IntGenomicsLab/lr_somatic", - "resource": "repos/IntGenomicsLab/lr_somatic/actions/workflows/ci.yml", + "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", + "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf similarity index 99% rename from subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf rename to subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index d366b8f6..0b29b1cd 100644 --- a/subworkflows/local/utils_nfcore_lr_somatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -1,5 +1,5 @@ // -// Subworkflow with functionality specific to the IntGenomicsLab/lr_somatic pipeline +// Subworkflow with functionality specific to the IntGenomicsLab/lrsomatic pipeline // /* diff --git a/workflows/lr_somatic.nf b/workflows/lrsomatic.nf similarity index 96% rename from workflows/lr_somatic.nf rename to workflows/lrsomatic.nf index 922fbf25..f92e50c0 100644 --- a/workflows/lr_somatic.nf +++ b/workflows/lrsomatic.nf @@ -7,7 +7,7 @@ include { MULTIQC } from '../modules/nf-core/multiqc/main' include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_somatic_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -15,7 +15,7 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lr_s ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -workflow LR_SOMATIC { +workflow LRSOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input @@ -30,7 +30,7 @@ workflow LR_SOMATIC { softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", - name: 'lr_somatic_software_' + 'mqc_' + 'versions.yml', + name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', sort: true, newLine: true ).set { ch_collated_versions } From 28ffe69e8f094db64651991d3242cda98ddad318 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 12:00:05 +0100 Subject: [PATCH 482/557] Template update for nf-core/tools version 3.2.0 --- ro-crate-metadata.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 2a581778..b28e5186 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-11-19T10:46:46+00:00", + "datePublished": "2025-11-19T11:00:03+00:00", "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#2f44f760-b43e-4d7d-a433-9e0168809b65" + "@id": "#78cffc0e-19b3-4de4-b59f-d666870311de" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-19T11:46:46Z", + "dateModified": "2025-11-19T12:00:03Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +160,11 @@ "version": "!>=24.04.2" }, { - "@id": "#2f44f760-b43e-4d7d-a433-9e0168809b65", + "@id": "#78cffc0e-19b3-4de4-b59f-d666870311de", "@type": "TestSuite", "instance": [ { - "@id": "#38cd2023-c9c0-485d-8dc7-49258af762ab" + "@id": "#4c70ccad-3a80-45df-9714-d7851e441e59" } ], "mainEntity": { @@ -173,7 +173,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#38cd2023-c9c0-485d-8dc7-49258af762ab", + "@id": "#4c70ccad-3a80-45df-9714-d7851e441e59", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml", From 09e76f5b500d9aa1e382592a5e1b1c4bd94f7a7c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 12:00:55 +0100 Subject: [PATCH 483/557] Template update for nf-core/tools version 3.2.0 --- ro-crate-metadata.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b28e5186..666b78c7 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-11-19T11:00:03+00:00", + "datePublished": "2025-11-19T11:00:53+00:00", "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#78cffc0e-19b3-4de4-b59f-d666870311de" + "@id": "#ca2cacc1-0011-4c13-ac4d-341313a5533b" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-19T12:00:03Z", + "dateModified": "2025-11-19T12:00:53Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +160,11 @@ "version": "!>=24.04.2" }, { - "@id": "#78cffc0e-19b3-4de4-b59f-d666870311de", + "@id": "#ca2cacc1-0011-4c13-ac4d-341313a5533b", "@type": "TestSuite", "instance": [ { - "@id": "#4c70ccad-3a80-45df-9714-d7851e441e59" + "@id": "#5fdb974f-cdce-4e2f-a2cd-cefba401b75b" } ], "mainEntity": { @@ -173,7 +173,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#4c70ccad-3a80-45df-9714-d7851e441e59", + "@id": "#5fdb974f-cdce-4e2f-a2cd-cefba401b75b", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml", From 678dc48c8460852c532f5f4868a3d80aeef46a82 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 13:47:33 +0100 Subject: [PATCH 484/557] remove nucleo arg --- conf/modules.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index a119e03f..95d310d6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -180,7 +180,6 @@ process { } withName: '.*:FIBERTOOLSRS_NUCLEOSOMES' { - ext.args = { (meta.platform == "ont") ? "--ont" : "" } publishDir = [ enabled: false ] From b57b036f1efe1a06e7692e05ff2b79cea93ac404 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 19 Nov 2025 14:20:19 +0100 Subject: [PATCH 485/557] Template update for nf-core/tools version 3.4.1 --- .devcontainer/devcontainer.json | 28 ++-- .devcontainer/setup.sh | 13 ++ .editorconfig | 37 ----- .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 +++++++++ .github/actions/nf-test/action.yml | 111 ++++++++++++++ .github/workflows/ci.yml | 87 ----------- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 22 +-- .../{fix-linting.yml => fix_linting.yml} | 16 +- .github/workflows/linting.yml | 21 ++- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 141 ++++++++++++++++++ ...mment.yml => template-version-comment.yml} | 4 +- .gitpod.yml | 10 -- .nf-core.yml | 2 +- .pre-commit-config.yaml | 26 +++- .prettierignore | 1 + .prettierrc.yml | 5 + README.md | 8 +- assets/schema_input.json | 4 +- conf/base.config | 6 +- docs/usage.md | 2 +- main.nf | 5 +- modules.json | 8 +- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++++------ .../nf-core/multiqc/tests/main.nf.test.snap | 18 +-- modules/nf-core/multiqc/tests/tags.yml | 2 - nextflow.config | 57 +++---- nextflow_schema.json | 12 ++ nf-test.config | 24 +++ ro-crate-metadata.json | 18 +-- .../utils_nfcore_lrsomatic_pipeline/main.nf | 15 +- .../utils_nextflow_pipeline/tests/tags.yml | 2 - .../utils_nfcore_pipeline/tests/tags.yml | 2 - .../nf-core/utils_nfschema_plugin/main.nf | 40 ++++- .../utils_nfschema_plugin/tests/main.nf.test | 56 +++++++ .../tests/nextflow.config | 4 +- tests/.nftignore | 10 ++ tests/default.nf.test | 33 ++++ tests/nextflow.config | 14 ++ 43 files changed, 744 insertions(+), 315 deletions(-) create mode 100755 .devcontainer/setup.sh delete mode 100644 .editorconfig create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix-linting.yml => fix_linting.yml} (80%) create mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template_version_comment.yml => template-version-comment.yml} (91%) delete mode 100644 .gitpod.yml delete mode 100644 modules/nf-core/multiqc/tests/tags.yml create mode 100644 nf-test.config delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..1ab19682 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the IntGenomicsLab/lrsomatic devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 03608b2f..cefff7d3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -71,7 +71,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..3b9724c7 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,111 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + with: + python-version: "3.14" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge + channel-priority: strict + conda-remove-defaults: true + + - name: Run nf-test + shell: bash + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 05e97821..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'IntGenomicsLab/lrsomatic') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ab06316e..6d94bcbf 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -52,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -65,7 +57,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | @@ -120,6 +112,7 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -132,3 +125,10 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 80% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index 42190fc1..dd821a9a 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,21 +67,21 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..30e66026 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -14,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -31,18 +28,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.12" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 95b6b6af..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..c7448f3e --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,141 @@ +name: Run nf-test +on: + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.3" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use GitHub runners + - "ubuntu-latest" + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use GitHub runners + - "ubuntu-latest" + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "25.04.0" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + with: + fetch-depth: 0 + + - name: Run nf-test + id: run_nf_test + uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} + env: + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use GitHub runners + - "ubuntu-latest" + steps: + - name: One or more tests failed (excluding latest-everything) + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 91% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..c5988af9 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,12 +9,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index 71b40212..359178c3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -27,7 +27,7 @@ lint: - validation.summary.beforeText - validation.summary.afterText schema_params: false -nf_core_version: 3.2.0 +nf_core_version: 3.4.1 repository_type: pipeline template: author: Jonas Demeulemeester diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec8650..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + - prettier@3.6.2 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierignore b/.prettierignore index edd29f01..2255e3e3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,5 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/README.md b/README.md index d65adb7e..8e40e389 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # IntGenomicsLab/lrsomatic -[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic) +[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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/3.4.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/) @@ -21,7 +23,7 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> 2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/assets/schema_input.json b/assets/schema_input.json index fb9a2466..04228241 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -17,14 +17,14 @@ "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" } }, diff --git a/conf/base.config b/conf/base.config index 4a012faa..9cb82881 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -59,4 +59,8 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } + } } diff --git a/docs/usage.md b/docs/usage.md index e0528582..190ad95f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -147,7 +147,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 21003825..14012f28 100644 --- a/main.nf +++ b/main.nf @@ -72,7 +72,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index f194d41e..9032f990 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "multiqc": { "branch": "master", - "git_sha": "f0719ae309075ae4a291533883847c3f7c441dad", + "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", "installed_by": ["modules"] } } @@ -16,17 +16,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index a27122ce..dd513cbd 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.27 + - bioconda::multiqc=1.31 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 58d9313c..5288f5cc 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : + 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7b7c1322..17881d15 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-27T09:29:57.631982377" + "timestamp": "2025-09-08T20:57:36.139055243" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-27T09:30:34.743726958" + "timestamp": "2025-09-08T20:59:15.142230631" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-27T09:30:21.44383553" + "timestamp": "2025-09-08T20:58:29.629087066" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index 3d9651f0..2d6c41c6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,13 +32,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = null + hook_url = System.getenv('HOOK_URL') help = false help_full = false show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options config_profile_name = null config_profile_description = null @@ -91,7 +93,18 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm { + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -148,28 +161,27 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB - process { - resourceLimits = [ - memory: 8.GB, - cpus : 4, - time : 1.h - ] - } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Set AWS client to anonymous when using the default igenomes_base +aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load IntGenomicsLab/lrsomatic custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + // Load IntGenomicsLab/lrsomatic custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -226,7 +238,6 @@ dag { manifest { name = 'IntGenomicsLab/lrsomatic' - author = """Jonas Demeulemeester""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -242,25 +253,19 @@ manifest { description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=25.04.0' version = '1.0.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index 1d3318a3..f33141b9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -224,6 +224,18 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } } diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..3a1fff59 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' + + // run all test with defined profile(s) from the main nextflow.config + profile "test" + + // list of filenames or patterns that should be trigger a full test run + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 666b78c7..e09324c1 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-11-19T11:00:53+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-11-19T13:20:15+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](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.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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/3.4.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 bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#ca2cacc1-0011-4c13-ac4d-341313a5533b" + "@id": "#fb093d1a-fc14-4d4f-93a6-e9a1dac85303" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-19T12:00:53Z", + "dateModified": "2025-11-19T14:20:15Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -157,14 +157,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=25.04.0" }, { - "@id": "#ca2cacc1-0011-4c13-ac4d-341313a5533b", + "@id": "#fb093d1a-fc14-4d4f-93a6-e9a1dac85303", "@type": "TestSuite", "instance": [ { - "@id": "#5fdb974f-cdce-4e2f-a2cd-cefba401b75b" + "@id": "#17c6952f-1a01-4a74-9901-44b9a60c6bef" } ], "mainEntity": { @@ -173,10 +173,10 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#5fdb974f-cdce-4e2f-a2cd-cefba401b75b", + "@id": "#17c6952f-1a01-4a74-9901-44b9a60c6bef", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", - "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/ci.yml", + "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 0b29b1cd..4fc500c4 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,6 +33,9 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: @@ -50,10 +54,18 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + "", + "", + command ) // @@ -259,4 +271,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303e..ee4738c8 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb30164..c977917a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..8d8c7371 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..83f7a0a5 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,10 @@ +.DS_Store +multiqc/multiqc_data/multiqc.parquet +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..d4daad19 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,33 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..59f352c4 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,14 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/lrsomatic' +} + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From 8ad5e9d651b35c6f981dde314335dfd69969b8fa Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 10:56:41 +0100 Subject: [PATCH 486/557] Template update for nf-core/tools version 3.5.1 --- .github/workflows/download_pipeline.yml | 2 +- .github/workflows/fix_linting.yml | 2 +- .github/workflows/linting.yml | 6 +-- .github/workflows/nf-test.yml | 4 +- .../workflows/template-version-comment.yml | 2 +- .nf-core.yml | 2 +- .prettierignore | 2 + README.md | 4 +- modules.json | 4 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 ++++++------ nextflow.config | 2 - ro-crate-metadata.json | 14 +++---- .../utils_nfcore_lrsomatic_pipeline/main.nf | 4 +- .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- workflows/lrsomatic.nf | 38 ++++++++++++++----- 17 files changed, 68 insertions(+), 50 deletions(-) diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 6d94bcbf..45884ff9 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -127,7 +127,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index dd821a9a..b9b23241 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e66026..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index c7448f3e..7fd88b52 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -39,7 +39,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -83,7 +83,7 @@ jobs: TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index c5988af9..e8560fc7 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.nf-core.yml b/.nf-core.yml index 359178c3..27d6da9b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -27,7 +27,7 @@ lint: - validation.summary.beforeText - validation.summary.afterText schema_params: false -nf_core_version: 3.4.1 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Jonas Demeulemeester diff --git a/.prettierignore b/.prettierignore index 2255e3e3..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/README.md b/README.md index 8e40e389..7281c292 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # IntGenomicsLab/lrsomatic -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic) +[![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) [![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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/3.4.1) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.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/modules.json b/modules.json index 9032f990..1abe8cc7 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] } } @@ -21,7 +21,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cbd..d02016a0 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.31 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5cc..c1158fb0 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 17881d15..a88bafd6 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 2d6c41c6..26e20599 100644 --- a/nextflow.config +++ b/nextflow.config @@ -170,8 +170,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Set AWS client to anonymous when using the default igenomes_base -aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index e09324c1..2d439fec 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-11-19T13:20:15+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](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.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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/3.4.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 bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-11-20T09:56: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.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.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 bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#fb093d1a-fc14-4d4f-93a6-e9a1dac85303" + "@id": "#75fcd790-ddea-4e5f-ad8a-a3bcb0ee570b" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-19T14:20:15Z", + "dateModified": "2025-11-20T10:56:35Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +160,11 @@ "version": "!>=25.04.0" }, { - "@id": "#fb093d1a-fc14-4d4f-93a6-e9a1dac85303", + "@id": "#75fcd790-ddea-4e5f-ad8a-a3bcb0ee570b", "@type": "TestSuite", "instance": [ { - "@id": "#17c6952f-1a01-4a74-9901-44b9a60c6bef" + "@id": "#96bff4ee-228f-4a92-b1d1-e4fc3c4656c5" } ], "mainEntity": { @@ -173,7 +173,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#17c6952f-1a01-4a74-9901-44b9a60c6bef", + "@id": "#96bff4ee-228f-4a92-b1d1-e4fc3c4656c5", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 4fc500c4..0f35e34c 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -39,7 +39,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -84,7 +84,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index f92e50c0..9748f8a2 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -21,13 +21,31 @@ workflow LRSOMATIC { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // Collate and save software versions // - softwareVersionsToYAML(ch_versions) + def topic_versions = Channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', @@ -39,24 +57,24 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From c23c9676409b995ae12ba863d2d7b8f28047d942 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 12:05:21 +0100 Subject: [PATCH 487/557] lint fix --- modules.json | 103 ++++ modules/nf-core/ascat/ascat.diff | 153 ------ .../ensemblvep/vep/ensemblvep-vep.diff | 103 +++- .../longphase/phase/longphase-phase.diff | 474 +++++++++++++++++- .../minimap2/align/minimap2-align.diff | 18 - .../samtools/stats/samtools-stats.diff | 18 - 6 files changed, 664 insertions(+), 205 deletions(-) delete mode 100644 modules/nf-core/ascat/ascat.diff delete mode 100644 modules/nf-core/minimap2/align/minimap2-align.diff delete mode 100644 modules/nf-core/samtools/stats/samtools-stats.diff diff --git a/modules.json b/modules.json index 1abe8cc7..66d82ef9 100644 --- a/modules.json +++ b/modules.json @@ -5,10 +5,113 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { + "ascat": { + "branch": "master", + "git_sha": "98ffb090029d17a9fb8de75dadcfe6bc8b6377ec", + "installed_by": ["modules"] + }, + "ensemblvep/download": { + "branch": "master", + "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", + "installed_by": ["modules"] + }, + "ensemblvep/vep": { + "branch": "master", + "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", + "installed_by": ["modules"], + "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" + }, + "longphase/haplotag": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "longphase/phase": { + "branch": "master", + "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", + "installed_by": ["modules"], + "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" + }, + "minimap2/align": { + "branch": "master", + "git_sha": "1a5a9e7b4009dcf34e6867dd1a5a1d9a718b027b", + "installed_by": ["modules"] + }, + "minimap2/index": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, + "modkit/pileup": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "mosdepth": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, "multiqc": { "branch": "master", "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] + }, + "pigz/uncompress": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, + "samtools/cat": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/flagstat": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/idxstats": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/index": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "samtools/stats": { + "branch": "master", + "git_sha": "f4eab7945952dc4934224309701a49913ea05ae6", + "installed_by": ["modules"] + }, + "severus": { + "branch": "master", + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"], + "patch": "modules/nf-core/severus/severus.diff" + }, + "untar": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "unzip": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] + }, + "wget": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff deleted file mode 100644 index 67d68dbf..00000000 --- a/modules/nf-core/ascat/ascat.diff +++ /dev/null @@ -1,153 +0,0 @@ -Changes in component 'nf-core/ascat' -'modules/nf-core/ascat/meta.yml' is unchanged -Changes in 'ascat/main.nf': ---- modules/nf-core/ascat/main.nf -+++ modules/nf-core/ascat/main.nf -@@ -4,11 +4,12 @@ - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': -- 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" -+ 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': -+ 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" - - input: - tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) -+ val(genomeVersion) - path(allele_files) - path(loci_files) - path(bed_file) // optional -@@ -23,8 +24,10 @@ - tuple val(meta), path("*LogR.txt"), emit: logrs - tuple val(meta), path("*metrics.txt"), emit: metrics - tuple val(meta), path("*png"), emit: png -+ tuple val(meta), path("*pdf"), emit: pdf, optional: true - tuple val(meta), path("*purityploidy.txt"), emit: purityploidy - tuple val(meta), path("*segments.txt"), emit: segments -+ tuple val(meta), path("*segments_raw.txt"), emit: segments_raw - path "versions.yml", emit: versions - - when: -@@ -34,9 +37,9 @@ - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def gender = args.gender ? "$args.gender" : "NULL" -- def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" - def purity = args.purity ? "$args.purity" : "NULL" - def ploidy = args.ploidy ? "$args.ploidy" : "NULL" -+ def penalty = args.penalty ? "$args.penalty" : "NULL" - def gc_input = gc_file ? "$gc_file" : "NULL" - def rt_input = rt_file ? "$rt_file" : "NULL" - -@@ -48,7 +51,12 @@ - def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" - def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" - def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" -- -+ -+ def normal_exists = input_normal ? 'TRUE' : 'FALSE' -+ def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" -+ def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" -+ def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" -+ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" - """ - #!/usr/bin/env Rscript - library(RColorBrewer) -@@ -65,21 +73,23 @@ - #prepare from BAM files - ascat.prepareHTS( - tumourseqfile = "$input_tumor", -- normalseqfile = "$input_normal", - tumourname = paste0("$prefix", ".tumour"), -- normalname = paste0("$prefix", ".normal"), - allelecounter_exe = "alleleCounter", - alleles.prefix = allele_prefix, - loci.prefix = loci_prefix, - gender = "$gender", - genomeVersion = "$genomeVersion", - nthreads = $task.cpus -+ $normal_bam -+ $normal_name - $minCounts_arg - $bed_file_arg - $chrom_names_arg - $min_base_qual_arg - $min_map_qual_arg -+ $longread_bins - $fasta_arg -+ $allele_counter_flags - $skip_allele_counting_tumour_arg - $skip_allele_counting_normal_arg, - seed = 42 -@@ -87,37 +97,55 @@ - - - #Load the data -- ascat.bc = ascat.loadData( -- Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), -- Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), -- Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), -- Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), -- genomeVersion = "$genomeVersion", -- gender = "$gender" -- ) -+ if($normal_exists) { -+ print("normal exists") -+ ascat.bc = ascat.loadData( -+ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), -+ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), -+ Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), -+ Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), -+ genomeVersion = "$genomeVersion", -+ gender = "$gender" -+ ) -+ } else { -+ print("normal does not exist") -+ ascat.bc = ascat.loadData( -+ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), -+ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), -+ genomeVersion = "$genomeVersion", -+ gender = "$gender") -+ gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") -+ -+ } -+ print("printing ascat.bc") -+ print(ascat.bc) - - #Plot the raw data - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) - - # optional LogRCorrection - if("$gc_input" != "NULL") { -- gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") -+ gc_input = paste0(normalizePath("$gc_input")) - - if("$rt_input" != "NULL"){ -- rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") -+ rt_input = paste0(normalizePath("$rt_input")) - ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) - } - else { -- ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) -+ ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) - } - } - - #Segment the data -- ascat.bc = ascat.aspcf(ascat.bc, seed=42) -+ if($normal_exists) { -+ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) -+ } else { -+ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) -+ } - - #Plot the segmented data - ascat.plotSegmentedData(ascat.bc) - -'modules/nf-core/ascat/environment.yml' is unchanged -************************************************************ diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff index 71c05d4b..659e2264 100644 --- a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -3,7 +3,7 @@ Changes in component 'nf-core/ensemblvep/vep' Changes in 'ensemblvep/vep/main.nf': --- modules/nf-core/ensemblvep/vep/main.nf +++ modules/nf-core/ensemblvep/vep/main.nf -@@ -1,6 +1,6 @@ +@@ -1,11 +1,11 @@ process ENSEMBLVEP_VEP { tag "${meta.id}" - label 'process_medium' @@ -11,6 +11,13 @@ Changes in 'ensemblvep/vep/main.nf': conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container +- ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4b/4b5a8c173dc9beaa93effec76b99687fc926b1bd7be47df5d6ce19d7d6b4d6b7/data' +- : 'community.wave.seqera.io/library/ensembl-vep:115.2--90ec797ecb088e9a'}" ++ ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' ++ : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" + + input: + tuple val(meta), path(vcf), path(custom_extra_files) @@ -15,6 +15,8 @@ path cache tuple val(meta2), path(fasta) @@ -29,10 +36,96 @@ Changes in 'ensemblvep/vep/main.nf': vep \\ -i ${vcf} \\ -'modules/nf-core/ensemblvep/vep/environment.yml' is unchanged -'modules/nf-core/ensemblvep/vep/tests/main.nf.test' is unchanged +Changes in 'ensemblvep/vep/environment.yml': +--- modules/nf-core/ensemblvep/vep/environment.yml ++++ modules/nf-core/ensemblvep/vep/environment.yml +@@ -4,5 +4,4 @@ + - conda-forge + - bioconda + dependencies: +- # renovate: datasource=conda depName=bioconda/ensembl-vep +- - bioconda::ensembl-vep=115.2=pl5321h2a3209d_1 ++ - bioconda::ensembl-vep=114.2 + +Changes in 'ensemblvep/vep/tests/main.nf.test': +--- modules/nf-core/ensemblvep/vep/tests/main.nf.test ++++ modules/nf-core/ensemblvep/vep/tests/main.nf.test +@@ -16,7 +16,7 @@ + when { + process { + """ +- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() ++ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map +@@ -55,7 +55,7 @@ + when { + process { + """ +- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() ++ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + + input[0] = Channel.of([ + [ id:'test' ], // meta map +@@ -79,7 +79,7 @@ + assert process.success + assertAll( + { assert snapshot(process.out.versions).match() }, +- { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v115.2") } ++ { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } + ) + } + } + 'modules/nf-core/ensemblvep/vep/tests/vcf.config' is unchanged 'modules/nf-core/ensemblvep/vep/tests/tab.gz.config' is unchanged -'modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap' is unchanged -'modules/nf-core/ensemblvep/vep/tests/nextflow.config' is unchanged +Changes in 'ensemblvep/vep/tests/main.nf.test.snap': +--- modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap ++++ modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap +@@ -2,27 +2,27 @@ + "test_ensemblvep_vep_fasta_tab_gz": { + "content": [ + [ +- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" ++ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ] + ], + "meta": { + "nf-test": "0.9.2", +- "nextflow": "25.04.7" ++ "nextflow": "25.04.6" + }, +- "timestamp": "2025-09-29T10:00:37.755173" ++ "timestamp": "2025-08-21T13:16:46.760065318" + }, + "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { + "content": [ + [ +- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" ++ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" + ], + "d41d8cd98f00b204e9800998ecf8427e", + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.9.2", +- "nextflow": "25.04.7" ++ "nextflow": "25.04.6" + }, +- "timestamp": "2025-09-29T10:00:03.682447" ++ "timestamp": "2025-08-21T13:16:00.65871573" + } + } +Changes in 'ensemblvep/vep/tests/nextflow.config': +--- modules/nf-core/ensemblvep/vep/tests/nextflow.config ++++ modules/nf-core/ensemblvep/vep/tests/nextflow.config +@@ -1,5 +1,5 @@ + params { +- vep_cache_version = "115" ++ vep_cache_version = "113" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + } + ************************************************************ diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff index 43a29b24..1e9d2652 100644 --- a/modules/nf-core/longphase/phase/longphase-phase.diff +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -1,40 +1,492 @@ Changes in component 'nf-core/longphase/phase' -'modules/nf-core/longphase/phase/meta.yml' is unchanged +Changes in 'longphase/phase/meta.yml': +--- modules/nf-core/longphase/phase/meta.yml ++++ modules/nf-core/longphase/phase/meta.yml +@@ -34,7 +34,7 @@ + description: Index of sorted BAM/CRAM file(s) + pattern: "*.{bai,crai,csi}" + ontologies: [] +- - snvs: ++ - snps: + type: file + description: VCF file with SNPs (and INDELs) + pattern: "*.{vcf,vcf.gz}" +@@ -70,39 +70,15 @@ + pattern: "*.fai" + ontologies: [] + output: +- snv_vcf: ++ vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}.vcf.gz": ++ - "*.vcf.gz": + type: file +- description: Compressed VCF file with phased SNVs and indels +- pattern: "*.vcf.gz" +- ontologies: +- - edam: http://edamontology.org/format_3989 # GZIP format +- sv_vcf: +- - - meta: +- type: map +- description: | +- Groovy Map containing sample information +- e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}_SV.vcf.gz": +- type: file +- description: Compressed VCF file with phased SVs +- pattern: "*_SV.vcf.gz" +- ontologies: +- - edam: http://edamontology.org/format_3989 # GZIP format +- mod_vcf: +- - - meta: +- type: map +- description: | +- Groovy Map containing sample information +- e.g. `[ id:'sample1', single_end:false ]` +- - "${prefix}_mod.vcf.gz": +- type: file +- description: Compressed VCF file with phased modifications ++ description: Compressed VCF file with phased variants + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + Changes in 'longphase/phase/main.nf': --- modules/nf-core/longphase/phase/main.nf +++ modules/nf-core/longphase/phase/main.nf -@@ -14,8 +14,9 @@ +@@ -4,20 +4,19 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': +- 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': ++ 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" + + input: +- tuple val(meta), path(bam), path(bai), path(snvs), path(svs), path(mods) ++ tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) output: -- tuple val(meta), path("*.vcf.gz"), emit: vcf -- path "versions.yml" , emit: versions +- tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf +- tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true +- tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true +- path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when -@@ -43,6 +44,8 @@ +@@ -25,7 +24,7 @@ + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' +- prefix = task.ext.prefix ?: "${meta.id}" ++ def prefix = task.ext.prefix ?: "${meta.id}" + def sv_file = svs ? "--sv-file ${svs}" : "" + def mod_file = mods ? "--mod-file ${mods}" : "" + def bams = bam.collectMany { file -> ["-b", file] }.join(" ") +@@ -36,7 +35,7 @@ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ +- --snp-file ${snvs} \\ ++ --snp-file ${snps} \\ + ${bams} \\ + ${sv_file} \\ + ${mod_file} \\ +@@ -44,7 +43,9 @@ + bgzip \\ --threads $task.cpus \\ $args2 \\ - ${prefix}.vcf +- ${prefix}*.vcf ++ ${prefix}.vcf + + tabix -p vcf ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": -@@ -55,6 +58,7 @@ - def prefix = task.ext.prefix ?: "${meta.id}" +@@ -54,15 +55,10 @@ + + stub: + def args = task.ext.args ?: '' +- prefix = task.ext.prefix ?: "${meta.id}" +- def sv_command = svs ? "echo '' | bgzip -c > ${prefix}_SV.vcf.gz" : "" +- def mod_command = mods ? "echo '' | bgzip -c > ${prefix}_mod.vcf.gz" : "" ++ def prefix = task.ext.prefix ?: "${meta.id}" """ +- echo $args echo "" | bgzip -c > ${prefix}.vcf.gz +- +- $sv_command +- $mod_command + echo "" > ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": -'modules/nf-core/longphase/phase/environment.yml' is unchanged -'modules/nf-core/longphase/phase/tests/main.nf.test' is unchanged -'modules/nf-core/longphase/phase/tests/main.nf.test.snap' is unchanged +Changes in 'longphase/phase/environment.yml': +--- modules/nf-core/longphase/phase/environment.yml ++++ modules/nf-core/longphase/phase/environment.yml +@@ -5,5 +5,5 @@ + - bioconda + + dependencies: +- - bioconda::htslib=1.22.1 +- - bioconda::longphase=2.0 ++ - bioconda::htslib=1.20 ++ - bioconda::longphase=1.7.3 + +Changes in 'longphase/phase/tests/main.nf.test': +--- modules/nf-core/longphase/phase/tests/main.nf.test ++++ modules/nf-core/longphase/phase/tests/main.nf.test +@@ -44,7 +44,7 @@ + + } + +- test("[ bam, bai, snps, svs, [] ], fasta, fai") { ++test("[ bam, bai, snps, svs, [] ], fasta, fai") { + + when { + process { +@@ -78,7 +78,7 @@ + + } + +- test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { ++test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { + + when { + process { +@@ -154,38 +154,4 @@ + + } + +- test("[ bam, bai, snps, svs, [] ], fasta, fai - stub") { +- options "-stub" +- +- when { +- process { +- """ +- input[0] = [ +- [ id:'test' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz', checkIfExists: true), +- [] +- ] +- input[1] = [ +- [ id:'reference' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) +- ] +- input[2] = [ +- [ id:'reference' ], +- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) +- ] +- """ +- } +- } +- +- then { +- assertAll( +- { assert process.success }, +- { assert snapshot(process.out).match() } +- ) +- } +- +- } + } + +Changes in 'longphase/phase/tests/main.nf.test.snap': +--- modules/nf-core/longphase/phase/tests/main.nf.test.snap ++++ modules/nf-core/longphase/phase/tests/main.nf.test.snap +@@ -1,59 +1,4 @@ + { +- "[ bam, bai, snps, svs, [] ], fasta, fai - stub": { +- "content": [ +- { +- "0": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "1": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" +- ] +- ], +- "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ] +- } +- ], +- "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" +- }, +- "timestamp": "2025-11-06T16:06:24.025191062" +- }, + "[ bam, bai, snps, [], [] ], fasta, fai": { + "content": [ + { +@@ -62,42 +7,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ++ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], + "1": [ +- ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ ++ "vcf": [ + [ + { + "id": "test" + }, +- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ++ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + ] + ], +- "sv_vcf": [ +- +- ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.8.4", ++ "nextflow": "24.04.2" + }, +- "timestamp": "2025-11-06T16:05:57.029934447" ++ "timestamp": "2024-07-22T12:14:04.269956432" + }, + "[ bam, bai, snps, svs, [] ], fasta, fai": { + "content": [ +@@ -107,52 +40,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" ++ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "1": [ ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" ++ ], ++ "vcf": [ + [ + { + "id": "test" + }, +- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" ++ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + ] + ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.9.0", ++ "nextflow": "24.04.4" + }, +- "timestamp": "2025-11-06T16:06:03.319855838" ++ "timestamp": "2024-10-04T13:37:16.921910004" + }, + "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { + "content": [ +@@ -162,52 +73,30 @@ + { + "id": "test" + }, +- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" ++ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "1": [ ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" ++ ], ++ "vcf": [ + [ + { + "id": "test" + }, +- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" +- ] +- ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" +- ] +- ], +- "sv_vcf": [ +- [ +- { +- "id": "test" +- }, +- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" ++ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + ] + ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.9.0", ++ "nextflow": "24.04.4" + }, +- "timestamp": "2025-11-06T16:06:10.867281359" ++ "timestamp": "2024-10-04T13:37:23.41768963" + }, + "[ bam, bai, snps, [], [] ], fasta, fai - stub": { + "content": [ +@@ -221,18 +110,9 @@ + ] + ], + "1": [ +- ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], +- "2": [ +- +- ], +- "3": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" +- ], +- "mod_vcf": [ +- +- ], +- "snv_vcf": [ ++ "vcf": [ + [ + { + "id": "test" +@@ -240,18 +120,15 @@ + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], +- "sv_vcf": [ +- +- ], + "versions": [ +- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ++ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ] + } + ], + "meta": { +- "nf-test": "0.9.2", +- "nextflow": "25.04.5" ++ "nf-test": "0.8.4", ++ "nextflow": "24.04.2" + }, +- "timestamp": "2025-11-06T16:06:17.992733472" ++ "timestamp": "2024-07-22T12:15:40.296227382" + } + } 'modules/nf-core/longphase/phase/tests/nextflow.config' is unchanged ************************************************************ diff --git a/modules/nf-core/minimap2/align/minimap2-align.diff b/modules/nf-core/minimap2/align/minimap2-align.diff deleted file mode 100644 index 967bb654..00000000 --- a/modules/nf-core/minimap2/align/minimap2-align.diff +++ /dev/null @@ -1,18 +0,0 @@ -Changes in component 'nf-core/minimap2/align' -'modules/nf-core/minimap2/align/meta.yml' is unchanged -Changes in 'minimap2/align/main.nf': ---- modules/nf-core/minimap2/align/main.nf -+++ modules/nf-core/minimap2/align/main.nf -@@ -1,6 +1,6 @@ - process MINIMAP2_ALIGN { - tag "$meta.id" -- label 'process_high' -+ label 'process_very_high' - - // Note: the versions here need to match the versions used in the mulled container below and minimap2/index - conda "${moduleDir}/environment.yml" - -'modules/nf-core/minimap2/align/environment.yml' is unchanged -'modules/nf-core/minimap2/align/tests/main.nf.test' is unchanged -'modules/nf-core/minimap2/align/tests/main.nf.test.snap' is unchanged -************************************************************ diff --git a/modules/nf-core/samtools/stats/samtools-stats.diff b/modules/nf-core/samtools/stats/samtools-stats.diff deleted file mode 100644 index f6a5b76c..00000000 --- a/modules/nf-core/samtools/stats/samtools-stats.diff +++ /dev/null @@ -1,18 +0,0 @@ -Changes in component 'nf-core/samtools/stats' -'modules/nf-core/samtools/stats/meta.yml' is unchanged -Changes in 'samtools/stats/main.nf': ---- modules/nf-core/samtools/stats/main.nf -+++ modules/nf-core/samtools/stats/main.nf -@@ -1,6 +1,6 @@ - process SAMTOOLS_STATS { - tag "$meta.id" -- label 'process_single' -+ label 'process_medium' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - -'modules/nf-core/samtools/stats/environment.yml' is unchanged -'modules/nf-core/samtools/stats/tests/main.nf.test' is unchanged -'modules/nf-core/samtools/stats/tests/main.nf.test.snap' is unchanged -************************************************************ From 1f610c44d01d2e6f763d6a5b2a15a83b4e27cc0f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 13:31:43 +0100 Subject: [PATCH 488/557] update snapshot, revert test changes --- assets/schema_input.json | 42 ++- conf/base.config | 2 +- conf/test.config | 27 +- conf/test_full.config | 35 +- docs/README.md | 2 +- docs/output.md | 112 ++++++- docs/usage.md | 4 +- nextflow.config | 145 +++++--- subworkflows/local/tumor_normal_happhase.nf | 1 - tests/default.nf.test.snap | 352 +------------------- 10 files changed, 295 insertions(+), 427 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 04228241..ba9344a2 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/master/assets/schema_input.json", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/assets/schema_input.json", "title": "IntGenomicsLab/lrsomatic pipeline - params.input schema", "description": "Schema for the file provided with params.input", "type": "array", @@ -13,21 +13,45 @@ "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["id"] }, - "fastq_1": { + "bam_tumor": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of tumor sample must be provided, cannot contain spaces and must have extension '.bam'" }, - "fastq_2": { + "bam_normal": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "pattern": "^\\S+\\.bam$", + "errorMessage": "Bam file of normal sample must be provided, cannot contain spaces and must have extension '.bam'" + }, + "platform": { + "type": "string", + "enum": ["pb", "ont"], + "errorMessage": "Method must be one of the following: 'pb' or 'ont'" + }, + "sex": { + "type": "string", + "enum": ["male", "female"], + "errorMessage": "Biological sex must be either 'male' or 'female'" + }, + "fiber": { + "type": "string", + "enum": ["y", "n"], + "errorMessage": "Specifiy (y/n) if sample has had fiberseq performed" + }, + "clair3_model": { + "type": "string" + }, + "clairSTO_model": { + "type": "string" + }, + "clairS_model": { + "type": "string" } }, - "required": ["sample", "fastq_1"] + "required": ["sample", "bam_tumor", "platform", "sex", "fiber"] } -} +} \ No newline at end of file diff --git a/conf/base.config b/conf/base.config index 84625158..da7020bf 100644 --- a/conf/base.config +++ b/conf/base.config @@ -68,4 +68,4 @@ process { ext.use_gpu = { workflow.profile.contains('gpu') } accelerator = { workflow.profile.contains('gpu') ? 1 : null } } -} +} \ No newline at end of file diff --git a/conf/test.config b/conf/test.config index 117abf0c..d376b95f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -11,11 +11,13 @@ */ process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h' - ] + withName: '.*' { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] + } } params { @@ -23,8 +25,13 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv'// Genome references - genome = 'R64-1-1' -} + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" + + // Additional params + genome = "GRCh38" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + skip_wakhan = true + skip_ascat = true +} \ No newline at end of file diff --git a/conf/test_full.config b/conf/test_full.config index bc82ecba..416ed610 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,24 +1,37 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running full-size tests + Nextflow config file for running minimal tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a full size pipeline test. + Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run IntGenomicsLab/lrsomatic -profile test_full, --outdir + nextflow run IntGenomicsLab/lrsomatic -profile test, --outdir ---------------------------------------------------------------------------------------- */ +process { + withName: '.*' { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] + } +} + params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + // Input data + input = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/samplesheets/samplesheet_lr-somatic.csv" + fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" - // Genome references - genome = 'R64-1-1' + // Additional params + genome = "GRCh38" + vep_genome = "WBcel235" + vep_species = "caenorhabditis_elegans" + skip_wakhan = true + skip_ascat = true } diff --git a/docs/README.md b/docs/README.md index 14889bd3..936ae5c6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,4 +5,4 @@ The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. - [Output](output.md) - - An overview of the different results produced by the pipeline and how to interpret them. + - An overview of the different results produced by the pipeline and how to interpret them. \ No newline at end of file diff --git a/docs/output.md b/docs/output.md index b3f2ed82..2b2ee9c4 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,8 +12,104 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +- [samtools/cat](#samtools_cat) - Concatenate replicates from the same sample +- [minimap2/index](#minimap2) - Creating minimap2 index +- [minimap2/align](#minimap2) - Aligning long-read samples to the reference genome +- [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files +- [Modkit](#modkit) - Tool to process methylation data +- [Mosdepth](#mosdepth) - Tool to check the sequencing depth +- [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples +- [Severus](#severus) - Tool to call somatic and germline structural variants - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [Longphase](#longphase) - Phase the variants into haplotype blocks + +### samtools + +### Minimap2 + +[ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . + +### Cramino + +
+Output files + +- `cramino/` + - `*_cramino.txt`: text file containing the quality check results from Cramino + +
+ +[Cramino](https://github.com/wdecoster/cramino) is a tool for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . + +### Modkit + +
+Output files + +- `modkit/` + - `*.bed`: bed file with genomic positions with modified bases + - `*.bedgraph`: bedgraph file with genomic positions with modified bases + - `*log`: log file + +
+ +[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see . + +### Mosdepth + +
+Output files + +- `mosdepth` + - `*.summary.txt'`: summary text file + - `*.global.dist.txt`: global information on sequencing depth file + - optionally outputs other files by regions. + +
+ +[Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . + +### ClairS-TO + +
+Output files + +- `clairsto/` + - `germline.vcf.gz`: a VCF file containing germline SNP and indel calls + - `somatic.vcf.gz`: a VCF file containing somatic SNP and indel calls + - `logs`: directory containing log files for the ClairS-TO run + - `run_clairs_to.log`: a text file containing a summary of the ClairS-TO run + - `run_clairs_to.log.bak`: a text file containing the run command + +
+ +### Severus + +
+Output files + +- `severus` +- `severus.log`: severus log file +- `read_qual.txt`: the read quality +- `breakpoints_double.csv`: the breakpoint file + +
+ +[Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . + +### Longphase + +
+Output files + +TODO - add description ot output file + +- `longphase/` + +
+ +[Longphase](https://github.com/twolinin/longphase) isa tool to phase your input variant calls and haplotag your bam. To see more, see . ### MultiQC @@ -31,6 +127,20 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . +
+Output files + +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats. + +
+ +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + ### Pipeline information
@@ -44,4 +154,4 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md index 190ad95f..3c496f77 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -147,7 +147,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) + - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` @@ -209,4 +209,4 @@ We recommend adding the following line to your environment to limit this (typica ```bash NXF_OPTS='-Xms1g -Xmx4g' -``` +``` \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 26e20599..14ecd9b8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,46 +11,94 @@ params { // TODO nf-core: Specify your pipeline's command line flags // Input options - input = null + input = null // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false + genome = null + igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_ignore = false + + // Annotation + vep_cache = 's3://annotation-cache/vep_cache/' + vep_cache_version = 113 + download_vep_cache = false + vep_args = "--everything --filter_common --per_gene --total_length --offline --format vcf" + vep_custom = null + vep_custom_tbi = null + + + normal_fiber = true + + // Skip options + skip_qc = false + skip_cramino = false + skip_mosdepth = false + skip_bamstats = false + skip_ascat = false + skip_wakhan = false + skip_fiber = false + skip_vep = false + + // minimap2 options + minimap2_ont_model = null + minimap2_pb_model = null + save_secondary_alignment = true + + // Fibertools options + params.autocorrelation = null + + // ASCAT options + ascat_ploidy = null + ascat_min_base_qual = 20 + ascat_min_counts = 10 + ascat_min_map_qual = 10 + ascat_penalty = 150 + ascat_purity = null + ascat_longread_bins = 2000 + ascat_allelecounter_flags = "-f 0" + ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) + + // Wakhan options + wakhan_chroms = null + + //TODO: + // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version + // and allele/loci(/gc/rt) files. For now they need to be specified for anything else but GRCh38 and CHM13 + ascat_gc_files = null + ascat_rt_files = null + // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' + multiqc_config = null + multiqc_title = null + multiqc_logo = null + max_multiqc_email_size = '25.MB' multiqc_methods_description = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = System.getenv('HOOK_URL') - help = false - help_full = false - show_hidden = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + help_full = false + show_hidden = false + version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options + config_profile_name = null + config_profile_description = null - // Config options - config_profile_name = null - config_profile_description = null - - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Schema validation default options - validate_params = true + validate_params = true } // Load base.config by default for all pipelines @@ -93,18 +141,7 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm64 { - process.arch = 'arm64' - // TODO https://github.com/nf-core/modules/issues/6694 - // For now if you're using arm64 you have to use wave for the sake of the maintainers - // wave profile - apptainer.ociAutoPull = true - singularity.ociAutoPull = true - wave.enabled = true - wave.freeze = true - wave.strategy = 'conda,container' - } - emulate_amd64 { + arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -161,6 +198,18 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } + gitpod { + executor.name = 'local' + executor.cpus = 4 + executor.memory = 8.GB + process { + resourceLimits = [ + memory: 8.GB, + cpus : 4, + time : 1.h + ] + } + } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' apptainer.runOptions = '--nv' @@ -250,21 +299,27 @@ manifest { homePage = 'https://github.com/IntGenomicsLab/lrsomatic' description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' - defaultBranch = 'master' - nextflowVersion = '!>=25.04.0' + defaultBranch = 'main' + nextflowVersion = '!>=24.10.5' version = '1.0.0dev' doi = '' } // 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.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs + help { + enabled = true + command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " + fullParameter = "help_full" + showHiddenParameter = "show_hidden" + } } // Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +includeConfig 'conf/modules.config' \ No newline at end of file diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 22e6714b..5ab83690 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -220,7 +220,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // bais: indexes for bam files // Group everything back together in one channel - mixed_hapbams.view() mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 64647d66..cf34b7ac 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,81 +1,7 @@ { "-profile test": { "content": [ - 78, { - "CLAIR3": { - "clair3": "1.2.0" - }, - "CLAIRS": { - "clairs": "0.4.1" - }, - "CLAIRSTO": { - "clairsto": "0.4.0" - }, - "CRAMINO_POST": { - "cramino": "1.0.0" - }, - "CRAMINO_PRE": { - "cramino": "1.0.0" - }, - "GERMLINE_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "LONGPHASE_HAPLOTAG": { - "longphase": "1.7.3" - }, - "LONGPHASE_PHASE": { - "longphase": "1.7.3" - }, - "METAEXTRACT": { - "samtools": 1.21 - }, - "MINIMAP2_ALIGN": { - "minimap2": "2.29-r1283", - "samtools": 1.21 - }, - "MOSDEPTH": { - "mosdepth": "0.3.10" - }, - "SAMTOOLS_FAIDX": { - "samtools": 1.21 - }, - "SAMTOOLS_FLAGSTAT": { - "samtools": 1.21 - }, - "SAMTOOLS_IDXSTATS": { - "samtools": 1.21 - }, - "SAMTOOLS_INDEX": { - "samtools": 1.21 - }, - "SAMTOOLS_STATS": { - "samtools": 1.21 - }, - "SEVERUS": { - "severus": 1.6 - }, - "SOMATIC_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "SV_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "UNTAR": { - "untar": 1.34 - }, - "UNZIP_FASTA": { - "pigz": 2.8 - }, - "VCFSPLIT": { - "vcfsplit": 1.2 - }, - "WGET": { - "wget": "1.21.4" - }, "Workflow": { "IntGenomicsLab/lrsomatic": "v1.0.0dev" } @@ -83,291 +9,25 @@ [ "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/llms-full.txt", - "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", - "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", - "multiqc/multiqc_data/mosdepth_cov_dist.txt", - "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", - "multiqc/multiqc_data/mosdepth_perchrom.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", - "multiqc/multiqc_data/multiqc_general_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_plots", - "multiqc/multiqc_plots/pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", - "multiqc/multiqc_plots/png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", - "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", - "multiqc/multiqc_plots/svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", - "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/lrsomatic_software_mqc_versions.yml", - "sample1", - "sample1/bamfiles", - "sample1/bamfiles/sample1_normal.bam", - "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", - "sample1/qc", - "sample1/qc/normal", - "sample1/qc/normal/cramino_aln", - "sample1/qc/normal/cramino_aln/sample1_cramino.txt", - "sample1/qc/normal/cramino_ubam", - "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", - "sample1/qc/normal/mosdepth", - "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/normal/samtools", - "sample1/qc/normal/samtools/sample1.flagstat", - "sample1/qc/normal/samtools/sample1.idxstats", - "sample1/qc/normal/samtools/sample1.stats", - "sample1/qc/tumor", - "sample1/qc/tumor/cramino_aln", - "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", - "sample1/qc/tumor/cramino_ubam", - "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", - "sample1/qc/tumor/mosdepth", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/tumor/samtools", - "sample1/qc/tumor/samtools/sample1.flagstat", - "sample1/qc/tumor/samtools/sample1.idxstats", - "sample1/qc/tumor/samtools/sample1.stats", - "sample1/variants", - "sample1/variants/clair3", - "sample1/variants/clair3/merge_output.vcf.gz", - "sample1/variants/clair3/merge_output.vcf.gz.tbi", - "sample1/variants/clairs", - "sample1/variants/clairs/indel.vcf.gz", - "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/sample1.vcf.gz", - "sample1/variants/clairs/sample1.vcf.gz.tbi", - "sample1/variants/clairs/snv.vcf.gz", - "sample1/variants/clairs/snv.vcf.gz.tbi", - "sample1/variants/severus", - "sample1/variants/severus/all_SVs", - "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample1/variants/severus/breakpoints_double.csv", - "sample1/variants/severus/read_ids.csv", - "sample1/variants/severus/read_qual.txt", - "sample1/variants/severus/severus.log", - "sample1/variants/severus/somatic_SVs", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample1/vep", - "sample1/vep/SVs", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", - "sample1/vep/germline", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/vep/somatic", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", - "sample2", - "sample2/bamfiles", - "sample2/bamfiles/sample2_normal.bam", - "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", - "sample2/qc", - "sample2/qc/normal", - "sample2/qc/normal/cramino_aln", - "sample2/qc/normal/cramino_aln/sample2_cramino.txt", - "sample2/qc/normal/cramino_ubam", - "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", - "sample2/qc/normal/mosdepth", - "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/normal/samtools", - "sample2/qc/normal/samtools/sample2.flagstat", - "sample2/qc/normal/samtools/sample2.idxstats", - "sample2/qc/normal/samtools/sample2.stats", - "sample2/qc/tumor", - "sample2/qc/tumor/cramino_aln", - "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", - "sample2/qc/tumor/cramino_ubam", - "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", - "sample2/qc/tumor/mosdepth", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/tumor/samtools", - "sample2/qc/tumor/samtools/sample2.flagstat", - "sample2/qc/tumor/samtools/sample2.idxstats", - "sample2/qc/tumor/samtools/sample2.stats", - "sample2/variants", - "sample2/variants/clair3", - "sample2/variants/clair3/merge_output.vcf.gz", - "sample2/variants/clair3/merge_output.vcf.gz.tbi", - "sample2/variants/clairs", - "sample2/variants/clairs/indel.vcf.gz", - "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/sample2.vcf.gz", - "sample2/variants/clairs/sample2.vcf.gz.tbi", - "sample2/variants/clairs/snv.vcf.gz", - "sample2/variants/clairs/snv.vcf.gz.tbi", - "sample2/variants/severus", - "sample2/variants/severus/all_SVs", - "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample2/variants/severus/breakpoints_double.csv", - "sample2/variants/severus/read_ids.csv", - "sample2/variants/severus/read_qual.txt", - "sample2/variants/severus/severus.log", - "sample2/variants/severus/somatic_SVs", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample2/vep", - "sample2/vep/SVs", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", - "sample2/vep/germline", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/vep/somatic", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", - "sample3", - "sample3/bamfiles", - "sample3/bamfiles/sample3_tumor.bam", - "sample3/bamfiles/sample3_tumor.bam.bai", - "sample3/qc", - "sample3/qc/tumor", - "sample3/qc/tumor/cramino_aln", - "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", - "sample3/qc/tumor/cramino_ubam", - "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", - "sample3/qc/tumor/mosdepth", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", - "sample3/qc/tumor/samtools", - "sample3/qc/tumor/samtools/sample3.flagstat", - "sample3/qc/tumor/samtools/sample3.idxstats", - "sample3/qc/tumor/samtools/sample3.stats", - "sample3/variants", - "sample3/variants/clairsto", - "sample3/variants/clairsto/germline.vcf.gz", - "sample3/variants/clairsto/germline.vcf.gz.tbi", - "sample3/variants/clairsto/indel.vcf.gz", - "sample3/variants/clairsto/indel.vcf.gz.tbi", - "sample3/variants/clairsto/snv.vcf.gz", - "sample3/variants/clairsto/snv.vcf.gz.tbi", - "sample3/variants/clairsto/somatic.vcf.gz", - "sample3/variants/clairsto/somatic.vcf.gz.tbi", - "sample3/variants/severus", - "sample3/variants/severus/all_SVs", - "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample3/variants/severus/breakpoints_double.csv", - "sample3/variants/severus/read_ids.csv", - "sample3/variants/severus/read_qual.txt", - "sample3/variants/severus/severus.log", - "sample3/variants/severus/somatic_SVs", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample3/vep", - "sample3/vep/SVs", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", - "sample3/vep/germline", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", - "sample3/vep/somatic", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + "pipeline_info/lrsomatic_software_mqc_versions.yml" ], [ - "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", - "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", - "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", - "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", - "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", - "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", - "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", - "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", - "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", - "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", - "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", - "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", - "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", - "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", - "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", - "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", - "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", - "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", - "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", - "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", - "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", - "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", - "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", - "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-10-30T17:00:44.230935974" + "timestamp": "2025-11-20T13:31:18.762778941" } } \ No newline at end of file From c64acc863f04b56b825df6ce78dd2bcabd6caa8d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 13:46:01 +0100 Subject: [PATCH 489/557] linting fix --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 14ecd9b8..3ef6e864 100644 --- a/nextflow.config +++ b/nextflow.config @@ -300,7 +300,7 @@ manifest { description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'main' - nextflowVersion = '!>=24.10.5' + nextflowVersion = '!>=25.04.0' version = '1.0.0dev' doi = '' } From 1eddb33deca7fcc3a071070b8ff2509a6e5a8301 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 13:48:16 +0100 Subject: [PATCH 490/557] precommit --- assets/schema_input.json | 2 +- conf/base.config | 2 +- conf/test.config | 2 +- docs/README.md | 2 +- docs/output.md | 2 +- docs/usage.md | 2 +- nextflow.config | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index ba9344a2..89ccc0bb 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -54,4 +54,4 @@ }, "required": ["sample", "bam_tumor", "platform", "sex", "fiber"] } -} \ No newline at end of file +} diff --git a/conf/base.config b/conf/base.config index da7020bf..84625158 100644 --- a/conf/base.config +++ b/conf/base.config @@ -68,4 +68,4 @@ process { ext.use_gpu = { workflow.profile.contains('gpu') } accelerator = { workflow.profile.contains('gpu') ? 1 : null } } -} \ No newline at end of file +} diff --git a/conf/test.config b/conf/test.config index d376b95f..416ed610 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,4 +34,4 @@ params { vep_species = "caenorhabditis_elegans" skip_wakhan = true skip_ascat = true -} \ No newline at end of file +} diff --git a/docs/README.md b/docs/README.md index 936ae5c6..14889bd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,4 +5,4 @@ The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. - [Output](output.md) - - An overview of the different results produced by the pipeline and how to interpret them. \ No newline at end of file + - An overview of the different results produced by the pipeline and how to interpret them. diff --git a/docs/output.md b/docs/output.md index 2b2ee9c4..ba58d5e5 100644 --- a/docs/output.md +++ b/docs/output.md @@ -154,4 +154,4 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. \ No newline at end of file +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/usage.md b/docs/usage.md index 3c496f77..e0528582 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -209,4 +209,4 @@ We recommend adding the following line to your environment to limit this (typica ```bash NXF_OPTS='-Xms1g -Xmx4g' -``` \ No newline at end of file +``` diff --git a/nextflow.config b/nextflow.config index 3ef6e864..a3eb8548 100644 --- a/nextflow.config +++ b/nextflow.config @@ -322,4 +322,4 @@ validation { } // Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' \ No newline at end of file +includeConfig 'conf/modules.config' From a0b10e10229ebff6d7f2d27ae30b2aaf503c9f20 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 14:27:08 +0100 Subject: [PATCH 491/557] revert readme --- README.md | 107 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 7281c292..7dd67967 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,11 @@ # IntGenomicsLab/lrsomatic -[![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) [![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -14,13 +13,45 @@ ## Introduction -**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. - +This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. + +It can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design. + +Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. + +## Pipeline summary + +**1) Pre-processing:** + +a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) + +b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) + +c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) + +d. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs)) + +**2i) Matched mode: small variant calling:** + +a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) + +b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) + +**2ii) Tumour only mode: small variant calling:** + +a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) + +b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +**3) Large variant calling:** + +a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) + +b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) @@ -31,26 +62,20 @@ > [!NOTE] > If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. - +Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: - - ```bash nextflow run IntGenomicsLab/lrsomatic \ -profile \ @@ -63,11 +88,41 @@ nextflow run IntGenomicsLab/lrsomatic \ ## Credits -IntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. + +## Pipeline output + +This pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report. -We thank the following people for their extensive assistance in the development of this pipeline: +Besides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles. - +Example output directory structure: + +``` +results +| +├── multiqc +│ +├── sample1 +│ ├── bamfiles +│ ├── qc +│ │ ├── tumour +│ │ └── normal +│ ├── variants +│ │ ├── severus +│ │ └── clairs +│ └── ascat +│ +└── sample2 + ├── bamfiles + ├── qc + │ ├── tumour + │ └── normal + ├── variants + │ ├── severus + │ └── clairs + └── ascat +``` ## Contributions and Support @@ -88,4 +143,4 @@ This pipeline uses code and infrastructure developed and maintained by the [nf-c > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). \ No newline at end of file From f26893dcf6adb39e539bda5daa15d3b932572881 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 20 Nov 2025 16:01:19 +0100 Subject: [PATCH 492/557] Fix input --- README.md | 115 +++++++++++++++++++++++++++++++++++++------------ docs/README.md | 1 + docs/usage.md | 115 +++++++++++++++++++++++++++++++++++++------------ 3 files changed, 176 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 7281c292..e832099e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,11 @@ # IntGenomicsLab/lrsomatic -[![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) [![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -14,43 +13,75 @@ ## Introduction -**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ... +**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**. - +This **end-to-end pipeline** handles the entire workflow — **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases. + +It can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design. + +Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. + +## Pipeline summary + +**1) Pre-processing:** + +a. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino)) + +b. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2)) + +c. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools)) + +d. Specific for calling modified base calling ([`Fibertools`](https://github.com/fiberseq/fibertools-rs)) + +**2i) Matched mode: small variant calling:** + +a. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3)) + +b. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +c. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS)) + +**2ii) Tumour only mode: small variant calling:** + +a. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO)) + +b. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase)) + +**3) Large variant calling:** + +a. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus)) + +b. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat)) + +**4) Annotation:** + +a. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep)) + +b. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) + ## Usage > [!NOTE] > If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. - +Each row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No. Now, you can run the pipeline using: - - ```bash nextflow run IntGenomicsLab/lrsomatic \ -profile \ @@ -63,11 +94,41 @@ nextflow run IntGenomicsLab/lrsomatic \ ## Credits -IntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester. +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. + +## Pipeline output + +This pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report. -We thank the following people for their extensive assistance in the development of this pipeline: +Besides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles. - +Example output directory structure: + +``` +results +| +├── multiqc +│ +├── sample1 +│ ├── bamfiles +│ ├── qc +│ │ ├── tumour +│ │ └── normal +│ ├── variants +│ │ ├── severus +│ │ └── clairs +│ └── ascat +│ +└── sample2 + ├── bamfiles + ├── qc + │ ├── tumour + │ └── normal + ├── variants + │ ├── severus + │ └── clairs + └── ascat +``` ## Contributions and Support @@ -88,4 +149,4 @@ This pipeline uses code and infrastructure developed and maintained by the [nf-c > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 14889bd3..34a069c5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,5 +4,6 @@ The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + - [Output](output.md) - An overview of the different results produced by the pipeline and how to interpret them. diff --git a/docs/usage.md b/docs/usage.md index e0528582..52a0d92d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,7 +8,27 @@ ## Samplesheet input -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file of the following form: + +```csv +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,tumour.bam,normal.bam,ont,female,n +sample2,tumour.bam,,ont,female,y +sample3,tumour.bam,,pb,male,n +sample4,tumour.bam,normal.bam,pb,male,y +``` + +lrsomatic extracts information from the bam header files to decide which models to use for Clair3, ClairS, or ClairS-TO. However, this can optionally be specified manually. You can do this for one or many samples, if the field is left blank, the pipeline will default to extracting this information. You can specify this by creating your csv in the following form: + +```csv +ample,bam_tumor,bam_normal,platform,sex,fiber,clair3_model,clairSTO_model,clairS_model +sample1,tumour.bam,normal.bam,ont,female,n +sample2,tumour.bam,,ont,female,y +sample3,tumour.bam,normal.bam,pb,male,n,r1041_e82_400bps_sup_v420,,ont_r10_dorado_sup_5khz_ssrs +sample4,tumour.bam,normal.bam,pb,male,y +``` + +Use the `input` parameter to specify the location to this input csv. ```bash --input '[path to samplesheet file]' @@ -18,35 +38,28 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +```csv +sample,bam_tumor,bam_normal,platform,sex,fiber +sample1,tumour1.bam,normal.bam,ont,female,n +sample1,tumour2.bam,,ont,female,y +sample1,tumour3.bam,,pb,male,n ``` -### Full samplesheet +### Full Description of Samplesheet Columns -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` | Column | Description | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `bam_tumor` | Full path to BAM file for the tumor. File must end in `.bam`. | +| `bam_normal` | Full path to BAM file for the tumor. File must end in `.bam`. | +|`platform`| A string specifying the platform used for sequencing, can be either `pb` for PacBio sequencing data or `ont` for Oxford Nanopore sequencing data +| `sex` | A string specifying the biological sex of the sample, can either be `m` or `f` +|`fiber`| A string specifying if the sample has been subjected to Fiber-seq. Can either be `y` or `n` +|`clair3_model` | A string describing which model is to be used for Clair3's small variant calling (*optional*) +|`clairSTO_model` | A string describing which model is to be used for ClairS-TO's small variant calling (*optional*) +|`clairS_model` | A string describing which model is to be used for ClairS's small variant calling (*optional*) An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -55,7 +68,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh38 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -67,12 +80,8 @@ work # Directory containing the nextflow working files # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. -``` - -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. - -Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. +``` > [!WARNING] > Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). @@ -93,6 +102,56 @@ genome: 'GRCh37' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +### Pipeline options +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`-input` | Full file path to input samplesheet, must be in `.csv` format and conform to specifications noted above +|`--genome`| Specified genome assembly, support is given for `GRCh38` and `CHM13`| +|`--normal_fiber`| A boolean which skips fiber-seq processing on normal files (on those which have fiber-seq for the tumor). Default = `true` (*does not skip fiber-seq processing for normal*) + +#### Skipping options: +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` +|`--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` +|`--skip_cramino` | A boolean to skip `cramino`. Default = `false` +|`--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` +|`--skip_ascat` | A boolean to skip `ascat`. Default = `false` +|`--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` +|`--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` +|`--skip_vep` | A boolean to skip `vep`. Default = `false` + +#### VEP options: +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`--vep_cache` | Full path to a vep cache. If left blank, this will default to pulling from this [Annotation Cache Storage](https://annotation-cache.github.io/). +|`--vep_cache_version`| Integer specifying version of vep cache. Default = `113` +|`--vep_args`| A string specifying arguments to vep. Default = `"--everything --filter_common --per_gene --total_length --offline --format vcf"` +|`--vep_custom`| A full path to a vcf file containing custom variants for annotation. Must be bgzipped and have `.vcf.gz` format. Default = `null` +|`--vep_custom_tbi`| A full path to a index file for cutom vcf for vep. Default = `null` + +#### Minimap2 Options +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--minimap2_ont_model`| specifies which model to use minimap2 with for ONT samples. Default = `null` +|`--minimap2_pb_model`| specifies which model to use minimap2 with for PacBio samples. Default = `null` +|`--save_secondary_alignments`| A boolean to specify if secondary alignmetns are kept in aligned bam file. Defualt = `true` + +#### ASCAT Options +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +``--ascat_ploidy``| integer to enforce a given ploidy value. Default = `null` +``--ascat_purity``| integer to enforce a given purity value. Default = `null` +`--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` +`--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` +`--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` +`--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` +`--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` +`--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` +`--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` + + + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: From eaf4cae1e8cb2263b223db8aa65c0e38e5962740 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:17:51 +0100 Subject: [PATCH 493/557] change meta.id to prefix in CLAIRS` --- modules/local/clairs/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 065eb46c..99857f89 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,7 +12,7 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("${meta.id}.vcf.gz"), emit: all_vcf + tuple val(meta), path("${prefix}.vcf.gz"), emit: all_vcf tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi @@ -23,7 +23,7 @@ process CLAIRS { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ /opt/bin/run_clairs \ From 49d337e6480e0aa68136374ff6562b1b83d35c16 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:19:15 +0100 Subject: [PATCH 494/557] indentation --- modules/local/clairs/main.nf | 2 +- modules/nf-core/ensemblvep/vep/main.nf | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 99857f89..e7744781 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,7 +12,7 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("${prefix}.vcf.gz"), emit: all_vcf + tuple val(meta), path("${prefix}.vcf.gz"), emit: all_vcf tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 6ef37082..9daaadab 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -19,12 +19,12 @@ process ENSEMBLVEP_VEP { path custom_vep_tbi output: - tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true - tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true - tuple val(meta), path("*.tab.gz"), emit: tab, optional: true - tuple val(meta), path("*.json.gz"), emit: json, optional: true - path "*.html", emit: report, optional: true - path "versions.yml", emit: versions + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when From 484a09110a579faa303547d7153f252a081db09a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:20:05 +0100 Subject: [PATCH 495/557] remove view statement --- subworkflows/local/tumor_normal_happhase.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 22e6714b..3d9635ac 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -220,8 +220,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // bais: indexes for bam files // Group everything back together in one channel - mixed_hapbams.view() - mixed_hapbams .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> def new_meta = [id: meta.id, From a5a343f76672b1194b37d997c75001b8074ae90e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:37:11 +0100 Subject: [PATCH 496/557] add disk clean up back in --- .github/workflows/nf-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 7fd88b52..a22a97fc 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -87,6 +87,8 @@ jobs: with: fetch-depth: 0 + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - name: Run nf-test id: run_nf_test uses: ./.github/actions/nf-test From 170e72bafef37da6cf28936bf4c6e12657796c3e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:39:07 +0100 Subject: [PATCH 497/557] or branch is still "main" so would keep it like it was --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6d5a41ed..41961fd1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,14 +8,14 @@ These are the most common things requested on pull requests (PRs). Remember that PRs should be made against the dev branch, unless you're preparing a pipeline release. -Learn more about contributing: [CONTRIBUTING.md](https://github.com/IntGenomicsLab/lrsomatic/tree/master/.github/CONTRIBUTING.md) +Learn more about contributing: [CONTRIBUTING.md](https://github.com/IntGenomicsLab/lrsomatic/tree/main/.github/CONTRIBUTING.md) --> ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lrsomatic/tree/master/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/IntGenomicsLab/lrsomatic/tree/main/.github/CONTRIBUTING.md) - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). From 815f25520c53b623a80057f0206fe758322b152e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:45:46 +0100 Subject: [PATCH 498/557] revert some changes --- .../local/utils_nfcore_lrsomatic_pipeline/main.nf | 1 - tests/.nftignore | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index b0ef5f22..554f072f 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -112,7 +112,6 @@ workflow PIPELINE_INITIALISATION { } .set { ch_samplesheet } - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] // bam: unaligned bams diff --git a/tests/.nftignore b/tests/.nftignore index 83f7a0a5..9651e78a 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -7,4 +7,14 @@ multiqc/multiqc_data/multiqc_software_versions.txt multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html +multiqc/multiqc_data/*.txt +multiqc/multiqc_plots/{pdf,svg,png}/*.{png,svg,pdf} pipeline_info/*.{html,json,txt,yml} +*/vep/{SVs,germline,somatic}/*.{vcf.gz,html,vcf.gz.tbi} +*/variants/clair3/merge_output.{vcf.gz,vcf.gz.tbi} +*/variants/clairs/*.{vcf.gz,vcf.gz.tbi} +*/variants/clairsto/*.{vcf.gz,vcf.gz.tbi} +*/variants/severus/read_ids.csv +*/variants/severus/severus.log +*/variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} +*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt From 14d4b7b72e288e5cdcdf8e778545aef57a1752ef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 18:53:24 +0100 Subject: [PATCH 499/557] revert more --- nextflow_schema.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f33141b9..93909e90 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,7 +53,8 @@ "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details.", + "enum": ["GRCh38", "CHM13"] }, "fasta": { "type": "string", @@ -62,7 +63,7 @@ "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", + "help_text": "This parameter is *mandatory* if `--genome` is not specified.", "fa_icon": "far fa-file-code" }, "igenomes_ignore": { From ccd84a1056fe017eb1f5666e7ec50db59183c036 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 20 Nov 2025 19:02:10 +0100 Subject: [PATCH 500/557] linting and nextflow badge --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7dd67967..c9addb8d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) [![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) @@ -143,4 +143,4 @@ This pipeline uses code and infrastructure developed and maintained by the [nf-c > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). \ No newline at end of file +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). From 200b95f41cd195cc0a93cd64086c46acb2d215ba Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 09:54:28 +0100 Subject: [PATCH 501/557] add view --- subworkflows/local/tumor_only_happhase.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 220a8710..644f5aac 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -22,7 +22,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_only_severus = Channel.empty() somatic_vep = Channel.empty() germline_vep = Channel.empty() - + tumor_bams.view() tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model @@ -30,6 +30,8 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } + tumor_bams.view() + // // MODULE: CLAIRSTO // From 550ba65ea05aac00e4f143ebcf5efbdbf305d694 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 10:01:32 +0100 Subject: [PATCH 502/557] fix read-in --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 91915a3e..7cd833a4 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -76,7 +76,7 @@ workflow PIPELINE_INITIALISATION { .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model - def real_clairS_model = (clair3_model == null ) ? null : clairSTO_model + def real_clairS_model = (clair3_model == null ) ? null : clairS_model def real_clairSTO_model = (clair3_model == null ) ? null : clairS_model def paired_data = bam_normal ? true : false def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] From afbb03a15ac22884a50fb3ea0fdadd974a81eaa6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 10:06:35 +0100 Subject: [PATCH 503/557] fix read-in --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 7cd833a4..6db20132 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -77,7 +77,7 @@ workflow PIPELINE_INITIALISATION { .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model def real_clairS_model = (clair3_model == null ) ? null : clairS_model - def real_clairSTO_model = (clair3_model == null ) ? null : clairS_model + def real_clairSTO_model = (clair3_model == null ) ? null : real_clairSTO_model def paired_data = bam_normal ? true : false def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] From ec83c21dfd65ad226bbccd0072cdf870987d2136 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 10:44:15 +0100 Subject: [PATCH 504/557] fix read-in --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 6db20132..58508b54 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -77,7 +77,7 @@ workflow PIPELINE_INITIALISATION { .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model def real_clairS_model = (clair3_model == null ) ? null : clairS_model - def real_clairSTO_model = (clair3_model == null ) ? null : real_clairSTO_model + def real_clairSTO_model = (clair3_model == null ) ? null : clairSTO_model def paired_data = bam_normal ? true : false def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] From 339449aaa056b78c46bbdde8beba1f7ac6b86276 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 10:52:09 +0100 Subject: [PATCH 505/557] fix read-in --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 58508b54..a9266bed 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -76,8 +76,8 @@ workflow PIPELINE_INITIALISATION { .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model - def real_clairS_model = (clair3_model == null ) ? null : clairS_model - def real_clairSTO_model = (clair3_model == null ) ? null : clairSTO_model + def real_clairS_model = (clairS_model == null ) ? null : clairS_model + def real_clairSTO_model = (clairSTO_model == null ) ? null : clairSTO_model def paired_data = bam_normal ? true : false def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] @@ -99,6 +99,7 @@ workflow PIPELINE_INITIALISATION { return result } .set { ch_samplesheet } + ch_samplesheet.view() // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] From b60d5f4a91ed1771c0225cfd8b03a5ab0e386790 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 11:17:39 +0100 Subject: [PATCH 506/557] Update JSON schema --- nextflow_schema.json | 168 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 147 insertions(+), 21 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 93909e90..12dabb38 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/master/nextflow_schema.json", + "$id": "https://raw.githubusercontent.com/IntGenomicsLab/lrsomatic/main/nextflow_schema.json", "title": "IntGenomicsLab/lrsomatic pipeline parameters", "description": "Workflow for somatic variant calling of long read data", "type": "object", @@ -56,16 +56,6 @@ "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details.", "enum": ["GRCh38", "CHM13"] }, - "fasta": { - "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/plain", - "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified.", - "fa_icon": "far fa-file-code" - }, "igenomes_ignore": { "type": "boolean", "description": "Do not load the iGenomes reference config.", @@ -80,6 +70,138 @@ "fa_icon": "fas fa-ban", "hidden": true, "default": "s3://ngi-igenomes/igenomes/" + }, + "vep_cache": { + "type": "string", + "description": "Path to VEP cache directory.", + "fa_icon": "fas fa-database", + "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." + }, + "vep_cache_version": { + "type": "integer", + "description": "Version of the VEP cache to use.", + "fa_icon": "fas fa-hashtag", + "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." + }, + "vep_args": { + "type": "string", + "description": "Additional command line arguments to pass to VEP.", + "fa_icon": "fas fa-terminal" + } + } + }, + "minimap2_options": { + "title": "minimap2 options", + "type": "object", + "description": "", + "default": "", + "properties": { + "minimap2_ont_model": { + "type": "string", + "description": "Minimap ont model to use" + }, + "minimap2_pb_model": { + "type": "string", + "description": "Minimap Pacbio model to use" + }, + "save_secondary_alignment": { + "type": "boolean", + "default": true, + "description": "Whether to save secondary alignments" + } + } + }, + "ascat_parameters": { + "title": "ASCAT parameters", + "type": "object", + "description": "ASCAT specific parameters", + "default": "", + "properties": { + "ascat_ploidy": { + "type": "string", + "description": "Enforce a ploidy" + }, + "ascat_purity": { + "type": "string", + "description": "Enforce a purity" + }, + "ascat_penalty": { + "type": "integer", + "default": 150, + "description": "Penalty value" + }, + "ascat_min_base_qual": { + "type": "integer", + "default": 20, + "description": "Minimum base quality for allelecounter" + }, + "ascat_min_counts": { + "type": "integer", + "default": 10, + "description": "Minimum counts for allelecounter" + }, + "ascat_min_map_qual": { + "type": "integer", + "default": 10, + "description": "Minimum mapping quality for allelecounter" + }, + "ascat_longread_bins": { + "type": "integer", + "default": 2000, + "description": "Binsize for long-read" + }, + "ascat_allelecounter_flags": { + "type": "string", + "default": "-f 0", + "description": "Additional allelecounter flags to use" + }, + "ascat_chroms": { + "type": "string", + "description": "Chromosomes to process (automatically inferred, only use if you want to run on a subset)" + }, + "ascat_gc_files": { + "type": "string", + "description": "Path to (zip) of GC files" + }, + "ascat_rt_files": { + "type": "string", + "description": "path to (zip) of RT files" + } + } + }, + "skip_options": { + "title": "Skip options", + "type": "object", + "description": "Define whether to skip certain steps", + "default": "", + "properties": { + "skip_qc": { + "type": "boolean", + "description": "Skips all QC steps" + }, + "skip_cramino": { + "type": "boolean", + "description": "Skips Cramino" + }, + "skip_mosdepth": { + "type": "boolean", + "description": "Skips Mosdepth" + }, + "skip_bamstats": { + "type": "boolean", + "description": "Skips samtools flagstat, stats, and idxstats" + }, + "skip_wakhan": { + "type": "boolean", + "description": "Skips wakhan" + }, + "skip_fiber": { + "type": "boolean", + "description": "Skip Fibertools steps" + }, + "skip_ascat": { + "type": "boolean", + "description": "Skip ASCAT" } } }, @@ -226,17 +348,12 @@ "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 }, - "help": { - "type": ["boolean", "string"], - "description": "Display the help message." - }, - "help_full": { - "type": "boolean", - "description": "Display the full detailed help message." - }, - "show_hidden": { + "normal_fiber": { "type": "boolean", - "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." + "default": true, + "description": "do fiber-seq on normal samples", + "fa_icon": "fas fa-fiber", + "hidden": true } } } @@ -248,6 +365,15 @@ { "$ref": "#/$defs/reference_genome_options" }, + { + "$ref": "#/$defs/minimap2_options" + }, + { + "$ref": "#/$defs/ascat_parameters" + }, + { + "$ref": "#/$defs/skip_options" + }, { "$ref": "#/$defs/institutional_config_options" }, From 6bf8ee8dac17a5ceea62cf16b55e16afd1b3219b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 16:34:50 +0100 Subject: [PATCH 507/557] merge + index clairS output --- conf/modules.config | 14 +- modules.json | 25 ++ modules/local/clairs/main.nf | 16 +- .../nf-core/bcftools/concat/environment.yml | 10 + modules/nf-core/bcftools/concat/main.nf | 72 ++++ modules/nf-core/bcftools/concat/meta.yml | 82 ++++ .../bcftools/concat/tests/main.nf.test | 315 ++++++++++++++ .../bcftools/concat/tests/main.nf.test.snap | 395 ++++++++++++++++++ .../bcftools/concat/tests/nextflow.config | 3 + .../bcftools/concat/tests/vcf_gz_index.config | 4 + .../concat/tests/vcf_gz_index_csi.config | 4 + .../concat/tests/vcf_gz_index_tbi.config | 4 + modules/nf-core/bcftools/sort/environment.yml | 10 + modules/nf-core/bcftools/sort/main.nf | 70 ++++ modules/nf-core/bcftools/sort/meta.yml | 71 ++++ .../nf-core/bcftools/sort/tests/main.nf.test | 222 ++++++++++ .../bcftools/sort/tests/main.nf.test.snap | 350 ++++++++++++++++ .../bcftools/sort/tests/vcf_gz_index.config | 4 + .../sort/tests/vcf_gz_index_csi.config | 4 + .../sort/tests/vcf_gz_index_tbi.config | 4 + subworkflows/local/tumor_normal_happhase.nf | 22 +- .../utils_nfcore_lrsomatic_pipeline/main.nf | 1 + tests/default.nf.test.snap | 24 +- 23 files changed, 1705 insertions(+), 21 deletions(-) create mode 100644 modules/nf-core/bcftools/concat/environment.yml create mode 100644 modules/nf-core/bcftools/concat/main.nf create mode 100644 modules/nf-core/bcftools/concat/meta.yml create mode 100644 modules/nf-core/bcftools/concat/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/concat/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/concat/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config create mode 100644 modules/nf-core/bcftools/sort/environment.yml create mode 100644 modules/nf-core/bcftools/sort/main.nf create mode 100644 modules/nf-core/bcftools/sort/meta.yml create mode 100644 modules/nf-core/bcftools/sort/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/sort/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/sort/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config diff --git a/conf/modules.config b/conf/modules.config index 95d310d6..9bb7b46f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -226,7 +226,18 @@ process { // // Small variant calling processes // - + withName: '.*:BCFTOOLS_CONCAT' { + ext.args = '--output-type z' + publishDir = [ + enabled: false + ] + } + withName: '.*:BCFTOOLS_SORT' { + ext.arge = '--output-type z' + publishDir = [ + enabled: false + ] + } withName: '.*:CLAIRSTO' { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, @@ -236,6 +247,7 @@ process { } withName: '.*:CLAIRS' { + ext.args = '--enable_indel_calling --haplotagged_tumor_bam_provided_so_skip_intermediate_phasing_and_haplotagging' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairs" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index 52190c75..7f7e910d 100644 --- a/modules.json +++ b/modules.json @@ -11,6 +11,21 @@ "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, + "bcftools/concat": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules", "vcf_gather_bcftools"] + }, + "bcftools/merge": { + "branch": "master", + "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "installed_by": ["modules"] + }, + "bcftools/sort": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["vcf_gather_bcftools"] + }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", @@ -101,6 +116,11 @@ "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, + "tabix/tabix": { + "branch": "master", + "git_sha": "61846a0d757ff9c0682ba3e28ab0441afd95ad7e", + "installed_by": ["vcf_gather_bcftools"] + }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", @@ -139,6 +159,11 @@ "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", "installed_by": ["subworkflows"] + }, + "vcf_gather_bcftools": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["subworkflows"] } } } diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index e7744781..cef7bbe3 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,9 +12,7 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("${prefix}.vcf.gz"), emit: all_vcf - tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("*.vcf.gz"), emit: vcfs tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi path "versions.yml", emit: versions @@ -31,12 +29,14 @@ process CLAIRS { --normal_bam_fn $normal_bam \\ --ref_fn $reference \\ --threads $task.cpus \\ - --enable_indel_calling \\ - --haplotagged_tumor_bam_provided_so_skip_intermediate_phasing_and_haplotagging \\ --platform $model \\ --output_dir . \\ - --output_prefix $prefix \\ + --output_prefix snvs \\ $args + + if [[ -f "snv.vcf.gz" ]]; then + rm snv.vcf.gz + fi cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -49,8 +49,8 @@ process CLAIRS { def prefix = task.ext.prefix ?: "${meta.id}" """ - echo "" | gzip > ${prefix}.vcf.gz - touch ${prefix}.vcf.gz.tbi + echo "" | gzip > snv.vcf.gz + touch snv.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/concat/environment.yml b/modules/nf-core/bcftools/concat/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/concat/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf new file mode 100644 index 00000000..5415b069 --- /dev/null +++ b/modules/nf-core/bcftools/concat/main.nf @@ -0,0 +1,72 @@ +process BCFTOOLS_CONCAT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcfs), path(tbi) + + output: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def tbi_names = tbi.findAll { file -> !(file instanceof List) }.collect { file -> file.name } + def create_input_index = vcfs.collect { vcf -> tbi_names.contains(vcf.name + ".tbi") || tbi_names.contains(vcf.name + ".csi") ? "" : "tabix ${vcf}" }.join("\n ") + extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def input = vcfs.sort{it.toString()}.join(" ") + """ + ${create_input_index} + + bcftools concat \\ + --output ${prefix}.${extension} \\ + $args \\ + --threads $task.cpus \\ + ${input} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index_extension = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index_extension.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index_extension}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml new file mode 100644 index 00000000..5e14b5a3 --- /dev/null +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -0,0 +1,82 @@ +name: bcftools_concat +description: Concatenate VCF files +keywords: + - variant calling + - concat + - bcftools + - VCF +tools: + - concat: + description: | + Concatenate VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: list + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + - tbi: + type: list + description: | + List containing 2 or more index files (optional) + e.g. [ 'file1.tbi', 'file2.tbi' ] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}.tbi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.tbi" + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.${extension}.csi: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + pattern: "*.csi" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@abhi18av" + - "@nvnieuwk" +maintainers: + - "@abhi18av" + - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test new file mode 100644 index 00000000..442f4b4e --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -0,0 +1,315 @@ +nextflow_process { + + name "Test Process BCFTOOLS_CONCAT" + script "../main.nf" + process "BCFTOOLS_CONCAT" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/concat" + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + + test("homo_sapiens - [[vcf1, vcf2], []]") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test3' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + +} diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap new file mode 100644 index 00000000..b82169c9 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -0,0 +1,395 @@ +{ + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:25.259752" + }, + "homo_sapiens - [[vcf1, vcf2], []]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T10:03:17.250013" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:52:50.140505" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:52:55.544079" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:31.742638" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T10:29:33.203302" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + ] + ], + [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T11:26:17.482474" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:53:07.368971" + }, + "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ], + "csi": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-15T09:53:01.405995" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/concat/tests/nextflow.config b/modules/nf-core/bcftools/concat/tests/nextflow.config new file mode 100644 index 00000000..c6a5142a --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = "--no-version" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config new file mode 100644 index 00000000..b6f9165c --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..afa03d74 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..1ca85231 --- /dev/null +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version --allow-overlaps" +} diff --git a/modules/nf-core/bcftools/sort/environment.yml b/modules/nf-core/bcftools/sort/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/sort/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf new file mode 100644 index 00000000..80a120b8 --- /dev/null +++ b/modules/nf-core/bcftools/sort/main.nf @@ -0,0 +1,70 @@ +process BCFTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcf) + + output: + tuple val(meta), path("*_sorted.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + + """ + bcftools \\ + sort \\ + --output ${prefix}_sorted.${extension} \\ + --temp-dir . \\ + $args \\ + $vcf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml new file mode 100644 index 00000000..c15487c7 --- /dev/null +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -0,0 +1,71 @@ +name: bcftools_sort +description: Sorts VCF files +keywords: + - sorting + - VCF + - variant calling +tools: + - sort: + description: Sort VCF files by coordinates. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + tool_dev_url: https://github.com/samtools/bcftools + doi: "10.1093/bioinformatics/btp352" + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: The VCF/BCF file to be sorted + pattern: "*.{vcf.gz,vcf,bcf}" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: Sorted VCF file + pattern: "*.{vcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@Gwennid" +maintainers: + - "@Gwennid" diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test new file mode 100644 index 00000000..7d580e4f --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -0,0 +1,222 @@ +nextflow_process { + + name "Test Process BCFTOOLS_SORT" + script "../main.nf" + process "BCFTOOLS_SORT" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/sort" + + test("sarscov2 - vcf") { + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("vcf") } + ) + } + + } + + test("sarscov2 - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + test("sarscov2 - vcf - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } +} diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap new file mode 100644 index 00000000..3cbca56c --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -0,0 +1,350 @@ +{ + "sarscov2 - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:49:07.959267" + }, + "vcf": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:35.236174" + }, + "sarscov2 - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:39.95133" + }, + "sarscov2 - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:44.50977" + }, + "sarscov2 - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:58.749279" + }, + "sarscov2 - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:49:03.283017" + }, + "sarscov2 - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:54.113947" + }, + "sarscov2 - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:48:48.979311" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config new file mode 100644 index 00000000..aacd1346 --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index" +} diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..640eb0ba --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi" +} diff --git a/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..589a50c6 --- /dev/null +++ b/modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi" +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 3d9635ac..c107413c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -3,6 +3,8 @@ include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phas include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { CLAIRS } from '../../modules/local/clairs/main.nf' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' +include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' workflow TUMOR_NORMAL_HAPPHASE { take: @@ -268,10 +270,26 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) - CLAIRS.out.all_vcf + CLAIRS.out.vcfs + .join(CLAIRS.out.tbi) + .set{clairs_out} + + BCFTOOLS_CONCAT( + clairs_out + ) + + ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + + BCFTOOLS_SORT( + BCFTOOLS_CONCAT.out.vcf + ) + + ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions) + + BCFTOOLS_SORT.out.vcf .map { meta, vcf -> def extra = [] - return [meta,vcf, extra] + return [meta, vcf, extra] } .set { somatic_vep } diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index a9266bed..8c3eb330 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -99,6 +99,7 @@ workflow PIPELINE_INITIALISATION { return result } .set { ch_samplesheet } + ch_samplesheet.view() diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 64647d66..3fc27b00 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,8 +1,14 @@ { "-profile test": { "content": [ - 78, + 82, { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, "CLAIR3": { "clair3": "1.2.0" }, @@ -150,10 +156,9 @@ "sample1/variants/clairs", "sample1/variants/clairs/indel.vcf.gz", "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/sample1.vcf.gz", - "sample1/variants/clairs/sample1.vcf.gz.tbi", - "sample1/variants/clairs/snv.vcf.gz", "sample1/variants/clairs/snv.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -220,10 +225,9 @@ "sample2/variants/clairs", "sample2/variants/clairs/indel.vcf.gz", "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/sample2.vcf.gz", - "sample2/variants/clairs/sample2.vcf.gz.tbi", - "sample2/variants/clairs/snv.vcf.gz", "sample2/variants/clairs/snv.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", @@ -365,9 +369,9 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-10-30T17:00:44.230935974" + "timestamp": "2025-11-24T16:33:33.367615182" } } \ No newline at end of file From 2c95ed27eb758feb26c31333dcb7d6659f1aa378 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 24 Nov 2025 16:45:31 +0100 Subject: [PATCH 508/557] remove view --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 8c3eb330..787e9f29 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -99,8 +99,7 @@ workflow PIPELINE_INITIALISATION { return result } .set { ch_samplesheet } - - ch_samplesheet.view() + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] From da63f263051b6d7cde8242dc868b530251597e03 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 10:31:11 +0100 Subject: [PATCH 509/557] adjust concat params --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 9bb7b46f..d82196bb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -227,7 +227,7 @@ process { // Small variant calling processes // withName: '.*:BCFTOOLS_CONCAT' { - ext.args = '--output-type z' + ext.args = '--output-type z -a' publishDir = [ enabled: false ] From 67b6f9abcb49fabb07463e50c45ab550b0b0850f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 12:35:17 +0100 Subject: [PATCH 510/557] update test snap --- tests/default.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index cf34b7ac..ab9930e7 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -21,13 +21,13 @@ "pipeline_info/lrsomatic_software_mqc_versions.yml" ], [ - "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f" + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-20T13:31:18.762778941" + "timestamp": "2025-11-25T12:33:14.698235309" } } \ No newline at end of file From faf07bb352a988b7ecca9780506218e58fb8394b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 12:47:23 +0100 Subject: [PATCH 511/557] revert --- workflows/lrsomatic.nf | 619 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 589 insertions(+), 30 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 9748f8a2..7b56a332 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -8,6 +8,40 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' + +// +// IMPORT MODULES +// +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +// +// IMPORT SUBWORKFLOWS +// +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' + + + + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -19,33 +53,546 @@ workflow LRSOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input + // Channel format is [[meta], [bam]]. + // Where [meta] is [id, paired_data, method, specs, type] + main: - ch_versions = channel.empty() - ch_multiqc_files = channel.empty() + def clair3_modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'r1041_e82_400bps_sup_v520', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + 'hifi_revio' : 'hifi_revio' + ] + + def clairs_modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + + // Load in igenomes + params.fasta = getGenomeAttribute('fasta') + params.genome_name = getGenomeAttribute('genome_name') + params.ascat_allele_files = getGenomeAttribute('ascat_alleles') + params.ascat_loci_files = getGenomeAttribute('ascat_loci') + params.centromere_bed = getGenomeAttribute('centromere_bed') + params.pon_file = getGenomeAttribute('pon_file') + params.bed_file = getGenomeAttribute('bed_file') + params.vep_genome = getGenomeAttribute('vep_genome') + params.vep_species = getGenomeAttribute('vep_species') + params.dbsnp = getGenomeAttribute('dbsnp') + params.colors = getGenomeAttribute('colors') + params.onekgenomes = getGenomeAttribute('onekgenomes') + params.gnomad = getGenomeAttribute('gnomad') + + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() // - // Collate and save software versions + // MODULE: METAEXTRACT + // + // extracts the base calling model from the bam files + + METAEXTRACT( ch_samplesheet ) + + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) + basecall_meta = METAEXTRACT.out.meta_ext + // Adds the base calling model to meta.basecall_model + + ch_samplesheet + .join(basecall_meta) + .map { meta, bam, basecall_model_meta, kinetics_meta -> + def meta_new = meta + [ basecall_model: basecall_model_meta, kinetics: kinetics_meta] + return[ meta_new, bam ] + } + .groupTuple() + .map { meta, bam -> + [ meta, bam.flatten()] + } + .set{ch_samplesheet} + + + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of unaligned bams + + ch_split = ch_samplesheet + .branch { meta, bam -> + single: bam.size() == 1 + multiple: bam.size() > 1 + } + + // + // MODULE: SAMTOOLS_CAT + // + // concatenates bam files from single sample + + SAMTOOLS_CAT ( ch_split.multiple ) + .bam + .mix ( ch_split.single ) + .set { ch_cat_ubams } + + + // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated unaligned bams + + ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) + + // + // MODULE: CRAMINO + // + // QC the unaligned bams + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_PRE ( ch_cat_ubams ) + + ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) + } + + + // + // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // + + PREPARE_REFERENCE_FILES ( + params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_files, + params.ascat_rt_files, + basecall_meta, + clair3_modelMap + ) + + vep_cache = Channel.empty() + + if (!params.skip_vep) { + + Channel + .of([ + vep_cache: params.vep_cache, + vep_cache_version: params.vep_cache_version, + vep_genome: params.vep_genome, + vep_args: params.vep_args, + vep_species: params.vep_species, + download_vep_cache: params.download_vep_cache + ]) + + PREPARE_ANNOTATION ( + params.vep_cache, + params.vep_cache_version, + params.vep_genome, + params.vep_args, + params.vep_species, + params.download_vep_cache + ) + ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) + vep_cache = PREPARE_ANNOTATION.out.vep_cache + + } + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) + ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta + ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + + downloaded_model_files = PREPARE_REFERENCE_FILES.out.downloaded_model_files + + // ASCAT files + allele_files = PREPARE_REFERENCE_FILES.out.allele_files + loci_files = PREPARE_REFERENCE_FILES.out.loci_files + gc_file = PREPARE_REFERENCE_FILES.out.gc_file + rt_file = PREPARE_REFERENCE_FILES.out.rt_file + + // + // MODULE: FIBERTOOLSRS_PREDICTM6A // - def topic_versions = Channel.topic("versions") - .distinct() - .branch { entry -> - versions_file: entry instanceof Path - versions_tuple: true + // predict m6a in unaligned bam + + if (!params.skip_fiber) { + if(!params.normal_fiber){ + ch_cat_ubams + .branch { meta, bams -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set { ch_cat_ubams_normal_branching } + + normal_bams = ch_cat_ubams_normal_branching.normal + ubams = ch_cat_ubams_normal_branching.tumor + } + else { + ubams = ch_cat_ubams + } + ubams + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams_pacbio_ont_branching} + + pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} + + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} + + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + + ch_cat_ubams_pacbio_ont_branching.ont + .mix(predicted_bams) + .set{fiber_branch} + + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + + // + // MODULE: FIBERTOOLSRS_FIRE + // + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + + if(!params.normal_fiber){ + fiber_branch.nonFiber + .mix(normal_bams) + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + } + else { + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} - def topic_versions_string = topic_versions.versions_tuple - .map { process, tool, version -> - [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] } - .groupTuple(by:0) - .map { process, tool_versions -> - tool_versions.unique().sort() - "${process}:\n${tool_versions.join('\n')}" + + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + } + + } + // + // MODULE: MINIMAP2_ALIGN + // + // Aligns ubams + + MINIMAP2_ALIGN ( + ch_cat_ubams, + ch_fasta, + true, + 'bai', + "", + "" + ) + MINIMAP2_ALIGN.out.bam + .set { ch_minimap_bam } + + + // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] + // bam: list of concatenated aligned bams + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + + + // ch_minimap_bams into tumor and paired to phase the paired ones on normal + // and add index + + ch_minimap_bam + .join(MINIMAP2_ALIGN.out.index) + .branch { meta, bams, bais -> + paired: meta.paired_data + tumor_only: !meta.paired_data } + .set { branched_minimap } + + + // branched_minimap -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bais: indexes for bam files - softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) - .mix(topic_versions_string) + // + // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE + // + // Phasing/haplotaging/small germline variant calling for tumor-normal samples + + TUMOR_NORMAL_HAPPHASE ( + branched_minimap.paired, + ch_fasta, + ch_fai, + clair3_modelMap, + clairs_modelMap, + downloaded_model_files + ) + + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + + // + // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE + // + // Phasing/haplotagging for tumor only samples + + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + + + TUMOR_ONLY_HAPPHASE ( + branched_minimap.tumor_only, + ch_fasta, + ch_fai, + clairs_modelMap, + dbsnp, + colors, + onekgenomes, + gnomad + ) + + germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) + somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + + if (!params.skip_vep) { + // + // MODULE: GERMLINE_VEP + // + if (params.vep_custom != null) { + vep_custom = file(params.vep_custom) + } else { + vep_custom = [] + } + if (params.vep_custom_tbi != null) { + vep_custom_tbi = file(params.vep_custom_tbi) + } else { + vep_custom_tbi = [] + } + GERMLINE_VEP ( + germline_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) + + // + // MODULE: SOMATIC_VEP + // + + SOMATIC_VEP ( + somatic_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) + } + + + ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) + + // Get Severus input channel + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .set { severus_reformat } + // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + + // + // MODULE: SEVERUS + // + + SEVERUS ( + severus_reformat, + [[:], params.bed_file, params.pon_file] + ) + + + + ch_versions = ch_versions.mix(SEVERUS.out.versions) + + SEVERUS.out.all_vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { sv_vep } + + if(!params.skip_vep) { + SV_VEP ( + sv_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SV_VEP.out.versions) + } + + // + // MODULE: CRAMINO + // + + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_POST ( ch_minimap_bam ) + + ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + } + + // + // Module: MOSDEPTH + // + + ch_mosdepth_global = Channel.empty() + ch_mosdepth_summary = Channel.empty() + + if (!params.skip_qc && !params.skip_mosdepth) { + + // prepare mosdepth input channel: we need to specify compulsory path to bed as well + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + .map { meta, bam, bai -> [meta, bam, bai, []] } + .set { ch_mosdepth_in } + + MOSDEPTH ( + ch_mosdepth_in, + ch_fasta + ) + + ch_mosdepth_global = MOSDEPTH.out.global_txt + ch_mosdepth_summary = MOSDEPTH.out.summary_txt + + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + } + + // + // SUBWORKFLOW: BAM_STATS_SAMTOOLS + // + ch_bam_stats = Channel.empty() + ch_bam_flagstat = Channel.empty() + ch_bam_idxstats = Channel.empty() + + if (!params.skip_qc && !params.skip_bamstats ) { + + BAM_STATS_SAMTOOLS ( + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_fasta + ) + + bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats + bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat + bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats + + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + } + + // + // MODULE: ASCAT + // + + if (!params.skip_ascat) { + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set { ascat_ch } + + ASCAT ( + ascat_ch, + params.genome_name, + allele_files, + loci_files, + [], + [], + [], + [] + ) + + ch_versions = ch_versions.mix(ASCAT.out.versions) + } + + // + // MODULE: WAKHAN + // + + if (!params.skip_wakhan) { + + // Prepare input channel for WAKHAN + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] + } + .join(SEVERUS.out.all_vcf) + .set { wakhan_input } + + WAKHAN ( + wakhan_input, + ch_fasta + ) + + ch_versions = ch_versions.mix(WAKHAN.out.versions) + } + + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', @@ -57,24 +604,24 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - ch_multiqc_config = channel.fromPath( + ch_multiqc_config = Channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - channel.fromPath(params.multiqc_config, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() ch_multiqc_logo = params.multiqc_logo ? - channel.fromPath(params.multiqc_logo, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = channel.value( + ch_methods_description = Channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) @@ -85,6 +632,15 @@ workflow LRSOMATIC { ) ) + // Collect MultiQC files + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it[1]}.ifEmpty([])) + + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it[1]}.ifEmpty([])) + + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), @@ -94,8 +650,11 @@ workflow LRSOMATIC { [] ) - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html - versions = ch_versions // channel: [ path(versions.yml) ] + emit: + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] + + } @@ -103,4 +662,4 @@ workflow LRSOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ +*/ \ No newline at end of file From cffc36f26e597da4867d1d91df5c07391810713e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 13:15:08 +0100 Subject: [PATCH 512/557] update snap --- tests/default.nf.test.snap | 345 ++++++++++++++++++++- workflows/lrsomatic.nf | 619 +++++++++++++++++++++++++++++++++++-- 2 files changed, 931 insertions(+), 33 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ab9930e7..f46ed4f1 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,6 +2,79 @@ "-profile test": { "content": [ { + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.1" + }, + "CLAIRSTO": { + "clairsto": "0.4.0" + }, + "CRAMINO_POST": { + "cramino": "1.0.0" + }, + "CRAMINO_PRE": { + "cramino": "1.0.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "1.7.3" + }, + "LONGPHASE_PHASE": { + "longphase": "1.7.3" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283", + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_FAIDX": { + "samtools": 1.21 + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.21 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.21 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.21 + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "vcfsplit": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, "Workflow": { "IntGenomicsLab/lrsomatic": "v1.0.0dev" } @@ -10,24 +83,290 @@ "multiqc", "multiqc/multiqc_data", "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", "multiqc/multiqc_data/multiqc.log", "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/lrsomatic_software_mqc_versions.yml" + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam", + "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam", + "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/sample1.vcf.gz", + "sample1/variants/clairs/sample1.vcf.gz.tbi", + "sample1/variants/clairs/snv.vcf.gz", + "sample1/variants/clairs/snv.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam", + "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam", + "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/sample2.vcf.gz", + "sample2/variants/clairs/sample2.vcf.gz.tbi", + "sample2/variants/clairs/snv.vcf.gz", + "sample2/variants/clairs/snv.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam", + "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - + "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", + "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", + "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", + "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", + "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", + "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", + "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", + "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", + "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", + "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", + "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", + "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", + "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", + "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", + "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", + "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", + "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", + "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", + "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", + "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", + "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", + "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", + "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", + "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-25T12:33:14.698235309" + "timestamp": "2025-11-25T13:09:28.07662315" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 9748f8a2..7b56a332 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -8,6 +8,40 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' +include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrsomatic_pipeline' + +// +// IMPORT MODULES +// +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +// +// IMPORT SUBWORKFLOWS +// +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' + + + + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -19,33 +53,546 @@ workflow LRSOMATIC { take: ch_samplesheet // channel: samplesheet read in from --input + // Channel format is [[meta], [bam]]. + // Where [meta] is [id, paired_data, method, specs, type] + main: - ch_versions = channel.empty() - ch_multiqc_files = channel.empty() + def clair3_modelMap = [ + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'r1041_e82_400bps_sup_v520', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'r1041_e82_400bps_sup_v500', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'r1041_e82_400bps_sup_v430', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', + 'hifi_revio' : 'hifi_revio' + ] + + def clairs_modelMap = [ + 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'ont_r10_dorado_sup_4khz', + 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'ont_r10_dorado_sup_5khz_ssrs', + 'hifi_revio' : 'hifi_revio_ss' + + ] + + // Load in igenomes + params.fasta = getGenomeAttribute('fasta') + params.genome_name = getGenomeAttribute('genome_name') + params.ascat_allele_files = getGenomeAttribute('ascat_alleles') + params.ascat_loci_files = getGenomeAttribute('ascat_loci') + params.centromere_bed = getGenomeAttribute('centromere_bed') + params.pon_file = getGenomeAttribute('pon_file') + params.bed_file = getGenomeAttribute('bed_file') + params.vep_genome = getGenomeAttribute('vep_genome') + params.vep_species = getGenomeAttribute('vep_species') + params.dbsnp = getGenomeAttribute('dbsnp') + params.colors = getGenomeAttribute('colors') + params.onekgenomes = getGenomeAttribute('onekgenomes') + params.gnomad = getGenomeAttribute('gnomad') + + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() // - // Collate and save software versions + // MODULE: METAEXTRACT + // + // extracts the base calling model from the bam files + + METAEXTRACT( ch_samplesheet ) + + ch_versions = ch_versions.mix(METAEXTRACT.out.versions) + basecall_meta = METAEXTRACT.out.meta_ext + // Adds the base calling model to meta.basecall_model + + ch_samplesheet + .join(basecall_meta) + .map { meta, bam, basecall_model_meta, kinetics_meta -> + def meta_new = meta + [ basecall_model: basecall_model_meta, kinetics: kinetics_meta] + return[ meta_new, bam ] + } + .groupTuple() + .map { meta, bam -> + [ meta, bam.flatten()] + } + .set{ch_samplesheet} + + + + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of unaligned bams + + ch_split = ch_samplesheet + .branch { meta, bam -> + single: bam.size() == 1 + multiple: bam.size() > 1 + } + + // + // MODULE: SAMTOOLS_CAT + // + // concatenates bam files from single sample + + SAMTOOLS_CAT ( ch_split.multiple ) + .bam + .mix ( ch_split.single ) + .set { ch_cat_ubams } + + + // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated unaligned bams + + ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) + + // + // MODULE: CRAMINO + // + // QC the unaligned bams + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_PRE ( ch_cat_ubams ) + + ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) + } + + + // + // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // + + PREPARE_REFERENCE_FILES ( + params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_files, + params.ascat_rt_files, + basecall_meta, + clair3_modelMap + ) + + vep_cache = Channel.empty() + + if (!params.skip_vep) { + + Channel + .of([ + vep_cache: params.vep_cache, + vep_cache_version: params.vep_cache_version, + vep_genome: params.vep_genome, + vep_args: params.vep_args, + vep_species: params.vep_species, + download_vep_cache: params.download_vep_cache + ]) + + PREPARE_ANNOTATION ( + params.vep_cache, + params.vep_cache_version, + params.vep_genome, + params.vep_args, + params.vep_species, + params.download_vep_cache + ) + ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) + vep_cache = PREPARE_ANNOTATION.out.vep_cache + + } + + ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) + ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta + ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + + downloaded_model_files = PREPARE_REFERENCE_FILES.out.downloaded_model_files + + // ASCAT files + allele_files = PREPARE_REFERENCE_FILES.out.allele_files + loci_files = PREPARE_REFERENCE_FILES.out.loci_files + gc_file = PREPARE_REFERENCE_FILES.out.gc_file + rt_file = PREPARE_REFERENCE_FILES.out.rt_file + + // + // MODULE: FIBERTOOLSRS_PREDICTM6A // - def topic_versions = Channel.topic("versions") - .distinct() - .branch { entry -> - versions_file: entry instanceof Path - versions_tuple: true + // predict m6a in unaligned bam + + if (!params.skip_fiber) { + if(!params.normal_fiber){ + ch_cat_ubams + .branch { meta, bams -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set { ch_cat_ubams_normal_branching } + + normal_bams = ch_cat_ubams_normal_branching.normal + ubams = ch_cat_ubams_normal_branching.tumor + } + else { + ubams = ch_cat_ubams + } + ubams + .branch{ meta, bams -> + pacBio: meta.platform == "pb" + ont: meta.platform == "ont" + } + .set{ch_cat_ubams_pacbio_ont_branching} + + pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + pacbio_bams + .branch{meta, bams -> + kinetics: meta.kinetics == "true" + noKinetics: meta.kinetics == "false" + } + .set{pacbio_bams} + + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} + + ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) + + ch_cat_ubams_pacbio_ont_branching.ont + .mix(predicted_bams) + .set{fiber_branch} + + fiber_branch + .branch{ meta, bams -> + fiber: meta.fiber == "y" + nonFiber: meta.fiber == "n" + } + .set{fiber_branch} + + // + // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // + + FIBERTOOLSRS_NUCLEOSOMES ( + fiber_branch.fiber + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) + + // + // MODULE: FIBERTOOLSRS_FIRE + // + + FIBERTOOLSRS_FIRE ( + FIBERTOOLSRS_NUCLEOSOMES.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) + + if(!params.normal_fiber){ + fiber_branch.nonFiber + .mix(normal_bams) + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} + } + else { + fiber_branch.nonFiber + .mix(FIBERTOOLSRS_FIRE.out.bam) + .set{ch_cat_ubams} - def topic_versions_string = topic_versions.versions_tuple - .map { process, tool, version -> - [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] } - .groupTuple(by:0) - .map { process, tool_versions -> - tool_versions.unique().sort() - "${process}:\n${tool_versions.join('\n')}" + + if(!params.skip_qc) { + // + // MODULE: FIBERTOOLSRS_QC + // + FIBERTOOLSRS_QC ( + FIBERTOOLSRS_FIRE.out.bam + ) + + ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) + } + + } + // + // MODULE: MINIMAP2_ALIGN + // + // Aligns ubams + + MINIMAP2_ALIGN ( + ch_cat_ubams, + ch_fasta, + true, + 'bai', + "", + "" + ) + MINIMAP2_ALIGN.out.bam + .set { ch_minimap_bam } + + + // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] + // bam: list of concatenated aligned bams + + ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) + + + // ch_minimap_bams into tumor and paired to phase the paired ones on normal + // and add index + + ch_minimap_bam + .join(MINIMAP2_ALIGN.out.index) + .branch { meta, bams, bais -> + paired: meta.paired_data + tumor_only: !meta.paired_data } + .set { branched_minimap } + + + // branched_minimap -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] + // bam: list of concatenated aligned bams + // bais: indexes for bam files - softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) - .mix(topic_versions_string) + // + // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE + // + // Phasing/haplotaging/small germline variant calling for tumor-normal samples + + TUMOR_NORMAL_HAPPHASE ( + branched_minimap.paired, + ch_fasta, + ch_fai, + clair3_modelMap, + clairs_modelMap, + downloaded_model_files + ) + + ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) + + // + // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE + // + // Phasing/haplotagging for tumor only samples + + dbsnp = file(params.dbsnp) + colors = file(params.colors) + onekgenomes = file(params.onekgenomes) + gnomad = file(params.gnomad) + + + TUMOR_ONLY_HAPPHASE ( + branched_minimap.tumor_only, + ch_fasta, + ch_fai, + clairs_modelMap, + dbsnp, + colors, + onekgenomes, + gnomad + ) + + germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) + somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + + if (!params.skip_vep) { + // + // MODULE: GERMLINE_VEP + // + if (params.vep_custom != null) { + vep_custom = file(params.vep_custom) + } else { + vep_custom = [] + } + if (params.vep_custom_tbi != null) { + vep_custom_tbi = file(params.vep_custom_tbi) + } else { + vep_custom_tbi = [] + } + GERMLINE_VEP ( + germline_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) + + // + // MODULE: SOMATIC_VEP + // + + SOMATIC_VEP ( + somatic_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) + } + + + ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) + + // Get Severus input channel + TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus + .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .set { severus_reformat } + // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + + // + // MODULE: SEVERUS + // + + SEVERUS ( + severus_reformat, + [[:], params.bed_file, params.pon_file] + ) + + + + ch_versions = ch_versions.mix(SEVERUS.out.versions) + + SEVERUS.out.all_vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { sv_vep } + + if(!params.skip_vep) { + SV_VEP ( + sv_vep, + params.vep_genome, + params.vep_species, + params.vep_cache_version, + vep_cache, + ch_fasta, + [], + vep_custom, + vep_custom_tbi + ) + + ch_versions = ch_versions.mix(SV_VEP.out.versions) + } + + // + // MODULE: CRAMINO + // + + if (!params.skip_qc && !params.skip_cramino) { + + CRAMINO_POST ( ch_minimap_bam ) + + ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) + } + + // + // Module: MOSDEPTH + // + + ch_mosdepth_global = Channel.empty() + ch_mosdepth_summary = Channel.empty() + + if (!params.skip_qc && !params.skip_mosdepth) { + + // prepare mosdepth input channel: we need to specify compulsory path to bed as well + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) + .map { meta, bam, bai -> [meta, bam, bai, []] } + .set { ch_mosdepth_in } + + MOSDEPTH ( + ch_mosdepth_in, + ch_fasta + ) + + ch_mosdepth_global = MOSDEPTH.out.global_txt + ch_mosdepth_summary = MOSDEPTH.out.summary_txt + + ch_versions = ch_versions.mix(MOSDEPTH.out.versions) + } + + // + // SUBWORKFLOW: BAM_STATS_SAMTOOLS + // + ch_bam_stats = Channel.empty() + ch_bam_flagstat = Channel.empty() + ch_bam_idxstats = Channel.empty() + + if (!params.skip_qc && !params.skip_bamstats ) { + + BAM_STATS_SAMTOOLS ( + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_fasta + ) + + bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats + bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat + bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats + + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) + } + + // + // MODULE: ASCAT + // + + if (!params.skip_ascat) { + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set { ascat_ch } + + ASCAT ( + ascat_ch, + params.genome_name, + allele_files, + loci_files, + [], + [], + [], + [] + ) + + ch_versions = ch_versions.mix(ASCAT.out.versions) + } + + // + // MODULE: WAKHAN + // + + if (!params.skip_wakhan) { + + // Prepare input channel for WAKHAN + severus_reformat + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] + } + .join(SEVERUS.out.all_vcf) + .set { wakhan_input } + + WAKHAN ( + wakhan_input, + ch_fasta + ) + + ch_versions = ch_versions.mix(WAKHAN.out.versions) + } + + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', @@ -57,24 +604,24 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - ch_multiqc_config = channel.fromPath( + ch_multiqc_config = Channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - channel.fromPath(params.multiqc_config, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() ch_multiqc_logo = params.multiqc_logo ? - channel.fromPath(params.multiqc_logo, checkIfExists: true) : - channel.empty() + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = channel.value( + ch_methods_description = Channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) @@ -85,6 +632,15 @@ workflow LRSOMATIC { ) ) + // Collect MultiQC files + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it[1]}.ifEmpty([])) + + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it[1]}.ifEmpty([])) + + MULTIQC ( ch_multiqc_files.collect(), ch_multiqc_config.toList(), @@ -94,8 +650,11 @@ workflow LRSOMATIC { [] ) - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html - versions = ch_versions // channel: [ path(versions.yml) ] + emit: + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + versions = ch_versions // channel: [ path(versions.yml) ] + + } @@ -103,4 +662,4 @@ workflow LRSOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ +*/ \ No newline at end of file From 29f81d0d25a9fced4ad026f42cd55fd6171dea0e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 14:22:15 +0100 Subject: [PATCH 513/557] improve file structures --- docs/output.md | 169 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 163 insertions(+), 6 deletions(-) diff --git a/docs/output.md b/docs/output.md index ba58d5e5..45498a93 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,27 +2,184 @@ ## Introduction -This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. - +### Output Example +``` +├── Sample 1 +│ ├── ascat +│ ├── bamfiles +│ ├── qc +│ │ ├── tumor +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ ├── variants +│ │ ├──clairS-TO +│ │ ├──severus +│ ├── vep +│ │ ├── germline +│ │ ├── somatic +│ │ ├── SVs +│ +├── Sample 2 +│ ├── ascat +│ ├── bamfiles +│ ├── qc +│ │ ├── tumor +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ │ ├── normal +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ ├── variants +│ │ ├── clair3 +│ │ ├── clairS +│ │ ├── severus +│ ├── vep +│ │ ├── germline +│ │ ├── somatic +│ │ ├── SVs +``` + + +### ASCAT +``` +├── ascat +│ ├── sample.before_correction.sample.tumour.germline.png +│ ├── sample.before_correction.sample.tumour.tumour.png +│ ├── sample.cnvs.txt +│ ├── sample.metric.txt +│ ├── sample.normal_alleleFrequencies_chr(1-22,X).txt +│ ├── sample.purityploidy.txt +│ ├── sample.segments.txt +│ ├── sample.tumour_alleleFrequencies_chr(1-22,X).txt +│ ├── sample.tumour_normalBAF_rawBAF.txt +│ ├── sample.tumour_normalBAF.txt +│ ├── sample.tumor_tumourLogR.txt +│ ├── sample.tumour.ASCATprofile.png +│ ├── sample.tumour.ASPCF.png +│ ├── sample.tumour.rawprofile.png +│ ├── sample.tumour.sunrise.png +``` + +### BAM Files +``` +├── bamfiles +│ ├── sample_normal.bam +│ ├── sample_normal.bam.bai +│ ├── sample_tumor.bam +│ ├── sample_tumor.bam.bai +``` + +### QC + +``` +├── qc +│ ├── tumor +│ │ ├── cramino_aln +│ │ │ ├── sample.cramino.txt +│ │ ├── cramino_ubam +│ │ │ ├── sample.cramino.txt +│ │ ├── fibertoolsrs +│ │ │ ├── sample_qc.txt +│ │ ├── mosdepth +│ │ │ ├── sample.mosdepth.global.dist.txt +│ │ │ ├── sample.mosdepth.summary.txt +│ │ ├── samtools +│ │ │ ├── sample.flagstat +│ │ │ ├── sample.idxstats +│ │ │ ├── sample.stats +``` + +### Variants + +#### Clair3 +``` +├── clair3 +│ ├── merge_output.vcf.gz +│ ├── merge_output.vcf.gz.tbi +``` + +#### ClairS +``` +├── clairS +│ ├── indel.vcf.gz +│ ├── indel.vcf.gz.tbi +│ ├── snv.vcf.gz +│ ├── snv.vcf.gz.tbi +``` + +#### ClairS-TO +``` +├── clairS +│ ├── germline.vcf.gz +│ ├── germline.vcf.gz.tbi +│ ├── indel.vcf.gz +│ ├── indel.vcf.gz.tbi +│ ├── snv.vcf.gz +│ ├── snv.vcf.gz.tbi +│ ├── somatic.vcf.gz +│ ├── somatic.vcf.gz.tbi +``` + +#### Severus +``` +├── severus +│ ├── all_SVs +│ │ ├── plots +│ │ │ ├── +│ │ ├── breakpoint_cluster_list.tsv +│ │ ├── breakpoint_clusters.tsv +│ │ ├── severus_all.vcf.gz +│ │ ├── severus_all.vcf.gz.tbi +│ ├── somatic_SVs +│ │ ├── plots +│ │ │ ├── +│ │ ├── breakpoint_cluster_list.tsv +│ │ ├── breakpoint_clusters.tsv +│ │ ├── severus_somatic.vcf.gz +│ │ ├── severus_somatic.vcf.gz.tbi +│ ├── breakpoints_double.csv +│ ├── read_ids.csv +│ ├── read_qual.txt +│ ├── severus.log +``` + ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - [samtools/cat](#samtools_cat) - Concatenate replicates from the same sample +- [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files +- [fibertools/predictm6a](#fibertools) - +- [fibertools/nucleosome](#fibertools)- +- [fibertools/fire](#fibertools) - +- [fibertools/qc](#fibertools) - - [minimap2/index](#minimap2) - Creating minimap2 index - [minimap2/align](#minimap2) - Aligning long-read samples to the reference genome -- [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files +- [clair3](#clair3) - +- [clairsto](#clairsto)- +- [clairs](#clairs) - +- [longphase/phase](#longphase) - +- [longphase/haplotag](#longphase) - +- [severus](#severus) - +- [wakhan](#wakhan) - - [Modkit](#modkit) - Tool to process methylation data - [Mosdepth](#mosdepth) - Tool to check the sequencing depth -- [ClairS-TO](#clairsto) - Small Variant Calling for Tumour only samples -- [Severus](#severus) - Tool to call somatic and germline structural variants - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -- [Longphase](#longphase) - Phase the variants into haplotype blocks ### samtools From 5a3b72b3f97c6e4f5c2f2d5cb8bb8e135693dc2e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 14:51:02 +0100 Subject: [PATCH 514/557] update file descriptions --- docs/output.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 45498a93..4d49a896 100644 --- a/docs/output.md +++ b/docs/output.md @@ -59,7 +59,7 @@ The directories listed below will be created in the results directory after the │ ├── sample.before_correction.sample.tumour.germline.png │ ├── sample.before_correction.sample.tumour.tumour.png │ ├── sample.cnvs.txt -│ ├── sample.metric.txt +│ ├── sample.metrics.txt │ ├── sample.normal_alleleFrequencies_chr(1-22,X).txt │ ├── sample.purityploidy.txt │ ├── sample.segments.txt @@ -72,6 +72,27 @@ The directories listed below will be created in the results directory after the │ ├── sample.tumour.rawprofile.png │ ├── sample.tumour.sunrise.png ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample | +| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample +| `sample.cnvs.txt` | a tsv file describing each chromosome segment with a copy number alteration and it's major and minor copy number +| `sample.metrics.txt` | a tsv file describing summary statistics for the sample +| `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths +| `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample +| `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number +| `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths +| `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample +| `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample +| `sample.tumour_normalLogR.txt` | a tsv file with the LogR values in the normal sample +| `sample.tumour_tumourBAF_rawBAF.txt` | a tsv file with the raw BAF values in the tumor sample +| `sample.tumour_tumourBAF.txt` | a tsv file with the BAF values in the tumor sample +| `sample.tumour_tumourLogR.txt` | a tsv file with the LogR values in the tumor sample +| `sample.tumour.ASCATprofile.png` | a png file with the corrected overall copy number profile with ploidy, purity, and goodness of fit metrics +| `sample.tumour.ASPCF.png` | a png file with the correct LogR and BAF plots of the tumor sample +| `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics +| `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit + ### BAM Files ``` @@ -82,6 +103,13 @@ The directories listed below will be created in the results directory after the │ ├── sample_tumor.bam.bai ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`sample_normal.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the normal sample +| `sample_normal.bam.bai` | index file for the normal bam file +| ` sample_tumor.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the tumor sample +| `sample_tumor.bam.bai` | index file for the tumor bam file + ### QC ``` @@ -102,6 +130,13 @@ The directories listed below will be created in the results directory after the │ │ │ ├── sample.stats ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`cramino_aln/sample.cramino.txt` | cramino QC summary statistics for the aligned bam file +| `cramino_ubam/sample.cramino.txt` | cramino QC summary statistics for the unaligned bam files +| `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file +| `mosdepth/sample.mosdepth.global.dist.txt` | index file for the tumor bam file + ### Variants #### Clair3 From 6ee071872a24c276ab8ac421e33656918d5da612 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 14:59:26 +0100 Subject: [PATCH 515/557] fix file descriptions --- docs/output.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 4d49a896..a7dbb724 100644 --- a/docs/output.md +++ b/docs/output.md @@ -135,7 +135,11 @@ The directories listed below will be created in the results directory after the |`cramino_aln/sample.cramino.txt` | cramino QC summary statistics for the aligned bam file | `cramino_ubam/sample.cramino.txt` | cramino QC summary statistics for the unaligned bam files | `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file -| `mosdepth/sample.mosdepth.global.dist.txt` | index file for the tumor bam file +| `mosdepth/sample.mosdepth.global.dist.txt` | a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value +| `mosdepth/sample.mosdepth.summary.txt` | overall summary file from mosdepth tool +|`samtools/sample.flagstat` | +|`samtools/sample.idxstats` | +|`samtools/sample.stats` | ### Variants From 8af8469eb53b23846a691576fca7e8b5001f4128 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 15:05:16 +0100 Subject: [PATCH 516/557] add view --- subworkflows/local/prepare_reference_files.nf | 3 ++- subworkflows/local/tumor_normal_happhase.nf | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 722b9f73..4b12c54c 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,6 +39,7 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } + basecall_meta.view() basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def id_new = basecall_model_meta ?: meta.clair3_model @@ -51,7 +52,7 @@ workflow PREPARE_REFERENCE_FILES { .unique() .set{ model_urls } - + model_urls.view() // // MODULE: Download model // diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c107413c..09160e9e 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -40,6 +40,8 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{downloaded_model_files} + downloaded_model_files.view() + mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = meta.basecall_model @@ -52,6 +54,8 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } + + normal_bams_model.view() normal_bams_model .combine(downloaded_model_files,by:0) @@ -92,6 +96,8 @@ workflow TUMOR_NORMAL_HAPPHASE { // // small germline variant calling + normal_bam.view() + tumor_bams.view() CLAIR3 ( normal_bams, fasta, From 9851c1f638055d0a84fdfeb300134cf75fdcb8f6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 15:23:57 +0100 Subject: [PATCH 517/557] more view --- workflows/lrsomatic.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 2b84c973..6214cf39 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -317,7 +317,8 @@ workflow LRSOMATIC { // MODULE: MINIMAP2_ALIGN // // Aligns ubams - + + ch_cat_ubams.view() MINIMAP2_ALIGN ( ch_cat_ubams, ch_fasta, From 160eb79c11584396e1ec671556dddad841f37c09 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 15:32:51 +0100 Subject: [PATCH 518/557] view spelling --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 09160e9e..bca1a1d8 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -96,7 +96,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // // small germline variant calling - normal_bam.view() + normal_bams.view() tumor_bams.view() CLAIR3 ( normal_bams, From 5859b29e077158f12d72993aba37bd57a5257c70 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 25 Nov 2025 16:32:11 +0100 Subject: [PATCH 519/557] updates to file descriptions --- docs/output.md | 68 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/docs/output.md b/docs/output.md index a7dbb724..3da5e0eb 100644 --- a/docs/output.md +++ b/docs/output.md @@ -50,10 +50,14 @@ The directories listed below will be created in the results directory after the │ │ ├── germline │ │ ├── somatic │ │ ├── SVs +├── pipeline_info ``` -### ASCAT +### `ascat` +
+Output files + ``` ├── ascat │ ├── sample.before_correction.sample.tumour.germline.png @@ -72,6 +76,7 @@ The directories listed below will be created in the results directory after the │ ├── sample.tumour.rawprofile.png │ ├── sample.tumour.sunrise.png ``` + | File | Description | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample | @@ -93,8 +98,12 @@ The directories listed below will be created in the results directory after the | `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics | `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit +
+ +### `bamfiles` +
+Output files -### BAM Files ``` ├── bamfiles │ ├── sample_normal.bam @@ -109,8 +118,11 @@ The directories listed below will be created in the results directory after the | `sample_normal.bam.bai` | index file for the normal bam file | ` sample_tumor.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the tumor sample | `sample_tumor.bam.bai` | index file for the tumor bam file +
-### QC +### `qc` +
+Output files ``` ├── qc @@ -140,17 +152,24 @@ The directories listed below will be created in the results directory after the |`samtools/sample.flagstat` | |`samtools/sample.idxstats` | |`samtools/sample.stats` | +
-### Variants +### `variants` +
+Output files -#### Clair3 +#### `clair3` ``` ├── clair3 │ ├── merge_output.vcf.gz │ ├── merge_output.vcf.gz.tbi ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`merge_output.vcf.gz` | Merged germline indel and snv calls in vcf format +|`merge_output.vcf.gz` | index for germline small variant calls -#### ClairS +#### `clairS` ``` ├── clairS │ ├── indel.vcf.gz @@ -158,8 +177,14 @@ The directories listed below will be created in the results directory after the │ ├── snv.vcf.gz │ ├── snv.vcf.gz.tbi ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`indel.vcf.gz` | Somatic indel calls in vcf format +|`indel.vcf.gz.tbi` | Index for somatic indel calls +|`snv.vcf.gz` | Somatic SNV calls in vcf format +|`snv.vcf.gz.tbi`| Index for somatic SNV calls -#### ClairS-TO +#### `clairS-TO` ``` ├── clairS │ ├── germline.vcf.gz @@ -172,7 +197,18 @@ The directories listed below will be created in the results directory after the │ ├── somatic.vcf.gz.tbi ``` -#### Severus +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`germline.vcf.gz` | SNV and indel calls marked as germline (will not include variants QC) +|`germline.vcf.gz.tbi` | Index file for germline small variant calls +|`indel.vcf.gz` | Raw indel calls in vcf format +|`indel.vcf.gz.tbi` | Index for somatic indel calls +|`snv.vcf.gz` | Raw SNV calls in vcf format +|`snv.vcf.gz.tbi`| Index for SNV calls +|`somatic.vcf.gz`| SNV and indel calls marked as PASS and without a germline tag +|`somatic.vcf.gz`| Index for osmatic small variatn calls + +#### `severus` ``` ├── severus │ ├── all_SVs @@ -194,8 +230,24 @@ The directories listed below will be created in the results directory after the │ ├── read_qual.txt │ ├── severus.log ``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`all_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in all clustered events +|`all_SVs/breakpoint_cluster.tsv` | a tsv containing all clustered events +|`all_SVs/severus_all.vcf.gz` | A vcf file containing all identified structural variants +|`all_SVs/severus_all.vcf.gz.tbi` | Index for all identified structural variants +|`somatic_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in somatic clustered events +|`somatic_SVs/breakpoint_cluster.tsv` | a tsv containing somatic clustered events +|`somatic_SVs/severus_somatic.vcf.gz` | A vcf file containing identified somatic structural variants +|`somatic_SVs/severus_somatic.vcf.gz.tbi` | Index for identified somatic structural variants + + + +
+### `vep` +### `pipeline_info` ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: From f746e65233d634ca87c3f9e109f80291fac35e1c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 26 Nov 2025 14:22:41 +0100 Subject: [PATCH 520/557] fix channel logic --- modules/local/clairs/main.nf | 1 + subworkflows/local/prepare_reference_files.nf | 2 -- subworkflows/local/tumor_normal_happhase.nf | 3 +-- tests/default.nf.test.snap | 4 +--- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index cef7bbe3..ce133f43 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -36,6 +36,7 @@ process CLAIRS { if [[ -f "snv.vcf.gz" ]]; then rm snv.vcf.gz + rm snv.vcf.gz.tbi fi cat <<-END_VERSIONS > versions.yml diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 4b12c54c..5df2b891 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -39,7 +39,6 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = [ [:], fasta ] } - basecall_meta.view() basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> def id_new = basecall_model_meta ?: meta.clair3_model @@ -52,7 +51,6 @@ workflow PREPARE_REFERENCE_FILES { .unique() .set{ model_urls } - model_urls.view() // // MODULE: Download model // diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index bca1a1d8..62e38822 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -44,7 +44,7 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams.normal .map{ meta, bam, bai -> - def basecall_model = meta.basecall_model + def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, @@ -61,7 +61,6 @@ workflow TUMOR_NORMAL_HAPPHASE { .combine(downloaded_model_files,by:0) .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" - def clair3_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(meta.basecall_model) : meta.clair3_model return [meta, bam, bai, model, platform] } .set{ normal_bams } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 3fc27b00..2ee0f8da 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -156,7 +156,6 @@ "sample1/variants/clairs", "sample1/variants/clairs/indel.vcf.gz", "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/snv.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/severus", @@ -225,7 +224,6 @@ "sample2/variants/clairs", "sample2/variants/clairs/indel.vcf.gz", "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/snv.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/severus", @@ -372,6 +370,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-24T16:33:33.367615182" + "timestamp": "2025-11-26T14:05:05.064407721" } } \ No newline at end of file From 5b38eee0d7c5ff2bbb00d1a8bc598d523e90917d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 26 Nov 2025 15:59:15 +0100 Subject: [PATCH 521/557] lint --- modules.json | 13 +- .../nf-core/bcftools/merge/environment.yml | 10 + modules/nf-core/bcftools/merge/main.nf | 74 ++ modules/nf-core/bcftools/merge/meta.yml | 105 +++ .../nf-core/bcftools/merge/tests/bcf.config | 3 + .../bcftools/merge/tests/bcf_gz.config | 3 + .../nf-core/bcftools/merge/tests/main.nf.test | 853 ++++++++++++++++++ .../bcftools/merge/tests/main.nf.test.snap | 607 +++++++++++++ .../bcftools/merge/tests/nextflow.config | 5 + .../bcftools/merge/tests/nextflow.gvcf.config | 5 + .../nf-core/bcftools/merge/tests/vcf.config | 3 + .../bcftools/merge/tests/vcf_gz.config | 3 + .../bcftools/merge/tests/vcf_gz_index.config | 3 + .../merge/tests/vcf_gz_index_csi.config | 3 + .../merge/tests/vcf_gz_index_tbi.config | 3 + .../nf-core/bcftools/sort/bcftools-sort.diff | 18 + modules/nf-core/bcftools/sort/main.nf | 6 +- 17 files changed, 1703 insertions(+), 14 deletions(-) create mode 100644 modules/nf-core/bcftools/merge/environment.yml create mode 100644 modules/nf-core/bcftools/merge/main.nf create mode 100644 modules/nf-core/bcftools/merge/meta.yml create mode 100644 modules/nf-core/bcftools/merge/tests/bcf.config create mode 100644 modules/nf-core/bcftools/merge/tests/bcf_gz.config create mode 100644 modules/nf-core/bcftools/merge/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/merge/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/merge/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config create mode 100644 modules/nf-core/bcftools/merge/tests/vcf.config create mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz.config create mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config create mode 100644 modules/nf-core/bcftools/sort/bcftools-sort.diff diff --git a/modules.json b/modules.json index 7f7e910d..58f3aae4 100644 --- a/modules.json +++ b/modules.json @@ -24,7 +24,8 @@ "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"] + "installed_by": ["vcf_gather_bcftools"], + "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", @@ -116,11 +117,6 @@ "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, - "tabix/tabix": { - "branch": "master", - "git_sha": "61846a0d757ff9c0682ba3e28ab0441afd95ad7e", - "installed_by": ["vcf_gather_bcftools"] - }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", @@ -159,11 +155,6 @@ "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", "installed_by": ["subworkflows"] - }, - "vcf_gather_bcftools": { - "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] } } } diff --git a/modules/nf-core/bcftools/merge/environment.yml b/modules/nf-core/bcftools/merge/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/merge/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf new file mode 100644 index 00000000..c560a902 --- /dev/null +++ b/modules/nf-core/bcftools/merge/main.nf @@ -0,0 +1,74 @@ +process BCFTOOLS_MERGE { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcfs), path(tbis) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(bed) + + output: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def input = (vcfs.collect().size() > 1) ? vcfs.sort{ it.name } : vcfs + def regions = bed ? "--regions-file $bed" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + + """ + bcftools merge \\ + $args \\ + $regions \\ + --threads $task.cpus \\ + --output ${prefix}.${extension} \\ + $input + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/merge/meta.yml b/modules/nf-core/bcftools/merge/meta.yml new file mode 100644 index 00000000..09af245a --- /dev/null +++ b/modules/nf-core/bcftools/merge/meta.yml @@ -0,0 +1,105 @@ +name: bcftools_merge +description: Merge VCF files +keywords: + - variant calling + - merge + - VCF +tools: + - merge: + description: | + Merge VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcfs: + type: file + description: | + List containing 2 or more vcf files + e.g. [ 'file1.vcf', 'file2.vcf' ] + ontologies: [] + - tbis: + type: file + description: | + List containing the tbi index files corresponding to the vcfs input files + e.g. [ 'file1.vcf.tbi', 'file2.vcf.tbi' ] + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: "(Optional) The fasta reference file (only necessary for the `--gvcf + FILE` parameter)" + pattern: "*.{fasta,fa}" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: "(Optional) The fasta reference file index (only necessary for + the `--gvcf FILE` parameter)" + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing bed information + e.g. [ id:'genome' ] + - bed: + type: file + description: "(Optional) The bed regions to merge on" + pattern: "*.bed" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{bcf,vcf}{,.gz}": + type: file + description: merged output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{csi,tbi}": + type: file + description: index of merged output + pattern: "*.{csi,tbi}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@joseespinosa" + - "@drpatelh" + - "@nvnieuwk" + - "@ramprasadn" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@nvnieuwk" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/merge/tests/bcf.config b/modules/nf-core/bcftools/merge/tests/bcf.config new file mode 100644 index 00000000..4467d07d --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/bcf.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type u --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/bcf_gz.config b/modules/nf-core/bcftools/merge/tests/bcf_gz.config new file mode 100644 index 00000000..280de8db --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/bcf_gz.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type b --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test b/modules/nf-core/bcftools/merge/tests/main.nf.test new file mode 100644 index 00000000..3995fc1a --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test @@ -0,0 +1,853 @@ +nextflow_process { + + name "Test Process BCFTOOLS_MERGE" + script "../main.nf" + process "BCFTOOLS_MERGE" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/merge" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf output") { + + config "./vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output") { + + config "./vcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf output") { + + config "./bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf") }, + { assert snapshot( + file(process.out.vcf.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output") { + + config "./bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf.gz") }, + { assert snapshot( + file(process.out.vcf.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index") { + + config "./vcf_gz_index_csi.config" + + when { + + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("tbi") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + file(process.out.index.get(0).get(1)).name, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], bed") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output") { + + config "./nextflow.gvcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ] + input[2] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + ] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - one sample") { + + config "./nextflow.config" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot( + path(process.out.vcf.get(0).get(1)).md5, + process.out.versions, + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub") { + + options "-stub" + config "./vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub") { + + options "-stub" + config "./vcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub") { + + options "-stub" + config "./bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub") { + + options "-stub" + config "./bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("bcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub") { + + options "-stub" + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub") { + + options "-stub" + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("csi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub") { + + options "-stub" + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("tbi") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], bed - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub") { + + options "-stub" + config "./nextflow.gvcf.config" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), + ] + ] + input[1] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] + ] + input[2] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] + ] + input[3] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - one sample - stub") { + + options "-stub" + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ] + ] + input[1] = [[],[]] + input[2] = [[],[]] + input[3] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, + { assert snapshot(process.out).match() } + ) + } + + } +} diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test.snap b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap new file mode 100644 index 00000000..d340b7b4 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap @@ -0,0 +1,607 @@ +{ + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.tbi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:16.859885" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:43.269991" + }, + "sarscov2 - [vcf, tbi], [], [], bed": { + "content": [ + "febdcfb851dcfc83d8248520830aef10", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:21.848388" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:03.763345" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf output": { + "content": [ + "57bb84274f336465d0a0946b532093b0", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:47.331149" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:59.170567" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:13.022634" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:48.592261" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.csi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:11.953139" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:51.935426" + }, + "sarscov2 - [vcf, tbi], [], [], bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:18.319666" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf output": { + "content": [ + "test.bcf", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:56.742352" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:53.962449" + }, + "sarscov2 - [vcf, tbi], [], [], [] - one sample - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:29.155018" + }, + "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:23.944931" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.csi", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:06.894016" + }, + "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output": { + "content": [ + "645b7f7f9131bfe350a9ec3cf82c17fe", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:28.149857" + }, + "sarscov2 - [vcf, tbi], [], [], [] - one sample": { + "content": [ + "2a374cf02f0c32cf607646167e7f153b", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:32.592911" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:37.830691" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ], + "index": [ + [ + { + "id": "test" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:21:08.5748" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:19:41.986954" + }, + "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output": { + "content": [ + "test.bcf.gz", + [ + "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:20:01.801297" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.config b/modules/nf-core/bcftools/merge/tests/nextflow.config new file mode 100644 index 00000000..c3f0b715 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: BCFTOOLS_MERGE { + ext.args = '--force-samples --force-single --no-version' + } +} diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config b/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config new file mode 100644 index 00000000..8c457b71 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config @@ -0,0 +1,5 @@ +process { + withName: BCFTOOLS_MERGE { + ext.args = { "--force-samples --no-version --output-type z --gvcf $fasta" } + } +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf.config b/modules/nf-core/bcftools/merge/tests/vcf.config new file mode 100644 index 00000000..759222e5 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type v --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz.config b/modules/nf-core/bcftools/merge/tests/vcf_gz.config new file mode 100644 index 00000000..8b6ad8b4 --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz.config @@ -0,0 +1,3 @@ +process { + ext.args = '--output-type z --no-version' +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config new file mode 100644 index 00000000..9f1e9b1d --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..8308ee1a --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..9be4075b --- /dev/null +++ b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bcftools/sort/bcftools-sort.diff b/modules/nf-core/bcftools/sort/bcftools-sort.diff new file mode 100644 index 00000000..b1696f25 --- /dev/null +++ b/modules/nf-core/bcftools/sort/bcftools-sort.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/bcftools/sort' +'modules/nf-core/bcftools/sort/meta.yml' is unchanged +Changes in 'bcftools/sort/main.nf': +--- modules/nf-core/bcftools/sort/main.nf ++++ modules/nf-core/bcftools/sort/main.nf +@@ -67,4 +67,4 @@ + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +-} ++} +'modules/nf-core/bcftools/sort/environment.yml' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index.config' is unchanged +'modules/nf-core/bcftools/sort/tests/main.nf.test' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index_csi.config' is unchanged +'modules/nf-core/bcftools/sort/tests/vcf_gz_index_tbi.config' is unchanged +'modules/nf-core/bcftools/sort/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 80a120b8..5040f0cb 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -11,7 +11,7 @@ process BCFTOOLS_SORT { tuple val(meta), path(vcf) output: - tuple val(meta), path("*_sorted.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf tuple val(meta), path("*.tbi") , emit: tbi, optional: true tuple val(meta), path("*.csi") , emit: csi, optional: true path "versions.yml" , emit: versions @@ -31,7 +31,7 @@ process BCFTOOLS_SORT { """ bcftools \\ sort \\ - --output ${prefix}_sorted.${extension} \\ + --output ${prefix}.${extension} \\ --temp-dir . \\ $args \\ $vcf @@ -67,4 +67,4 @@ process BCFTOOLS_SORT { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ -} +} \ No newline at end of file From dac7854c5f7dc32a9afa5b6394a486347249e568 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 26 Nov 2025 16:08:56 +0100 Subject: [PATCH 522/557] lint --- .github/workflows/linting.yml | 16 ++++++++-------- .github/workflows/linting_comment.yml | 2 +- .prettierignore | 3 +++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8b0f88c3..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - name: Set up Python 3.13 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index d43797d9..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.prettierignore b/.prettierignore index edd29f01..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,7 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ From 87bc1489608e398936bfee5a57602f297ddc55e4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 26 Nov 2025 16:11:46 +0100 Subject: [PATCH 523/557] prettier --- modules/local/clairs/main.nf | 2 +- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- workflows/lrsomatic.nf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index ce133f43..d4368bf6 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -33,7 +33,7 @@ process CLAIRS { --output_dir . \\ --output_prefix snvs \\ $args - + if [[ -f "snv.vcf.gz" ]]; then rm snv.vcf.gz rm snv.vcf.gz.tbi diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 62e38822..478188d4 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -54,7 +54,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } - + normal_bams_model.view() normal_bams_model @@ -278,7 +278,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIRS.out.vcfs .join(CLAIRS.out.tbi) .set{clairs_out} - + BCFTOOLS_CONCAT( clairs_out ) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 6214cf39..d76e3bfb 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -317,7 +317,7 @@ workflow LRSOMATIC { // MODULE: MINIMAP2_ALIGN // // Aligns ubams - + ch_cat_ubams.view() MINIMAP2_ALIGN ( ch_cat_ubams, From 7cd789825fdec494bece985aae4684def31c1faf Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 10:38:53 +0100 Subject: [PATCH 524/557] fix channel meta --- modules.json | 115 +++++++++++++++----- modules/nf-core/bcftools/sort/main.nf | 2 +- subworkflows/local/tumor_normal_happhase.nf | 18 ++- tests/default.nf.test.snap | 2 +- workflows/lrsomatic.nf | 1 - 5 files changed, 96 insertions(+), 42 deletions(-) diff --git a/modules.json b/modules.json index 58f3aae4..4afad53b 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,178 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "installed_by": [ + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +188,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 5040f0cb..302c7311 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -31,7 +31,7 @@ process BCFTOOLS_SORT { """ bcftools \\ sort \\ - --output ${prefix}.${extension} \\ + --output ${prefix}.sorted.${extension} \\ --temp-dir . \\ $args \\ $vcf diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 478188d4..5be12daa 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -40,7 +40,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{downloaded_model_files} - downloaded_model_files.view() mixed_bams.normal .map{ meta, bam, bai -> @@ -50,12 +49,12 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model] + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } - - normal_bams_model.view() + normal_bams_model .combine(downloaded_model_files,by:0) @@ -81,7 +80,8 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model] + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] return[new_meta, bam, bai] } .set{ tumor_bams } @@ -94,9 +94,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: CLAIR3 // // small germline variant calling - - normal_bams.view() - tumor_bams.view() CLAIR3 ( normal_bams, fasta, @@ -234,7 +231,8 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model] + basecall_model: meta.basecall_model, + clairS_model: meta.clairS_model] return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } .groupTuple(size: 2) @@ -278,7 +276,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIRS.out.vcfs .join(CLAIRS.out.tbi) .set{clairs_out} - + BCFTOOLS_CONCAT( clairs_out ) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 2ee0f8da..52651ce4 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -370,6 +370,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-26T14:05:05.064407721" + "timestamp": "2025-11-27T10:35:33.023032177" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index d76e3bfb..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -318,7 +318,6 @@ workflow LRSOMATIC { // // Aligns ubams - ch_cat_ubams.view() MINIMAP2_ALIGN ( ch_cat_ubams, ch_fasta, From 8fe259cc9d4dd2c1f935f9aabe7dbcb629ff68b5 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 12:50:08 +0100 Subject: [PATCH 525/557] igenomes clairsto pons --- conf/igenomes.config | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 089364cf..6e0a9349 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -21,10 +21,10 @@ params { bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" vep_genome = "GRCh38" vep_species = "homo_sapiens" - gnomad = "http://www.bio8.cs.hku.hk/clairs-to/databases/gnomad.r2.1.af-ge-0.001.sites.vcf.gz" - dbsnp = "http://www.bio8.cs.hku.hk/clairs-to/databases/dbsnp.b138.non-somatic.sites.vcf.gz" - onekgenomes = "http://www.bio8.cs.hku.hk/clairs-to/databases/1000g-pon.sites.vcf.gz" - colors = "http://www.bio8.cs.hku.hk/clairs-to/databases/CoLoRSdb.GRCh38.v1.1.0.deepvariant.glnexus.af-ge-0.001.vcf.gz" + gnomad = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/gnomad.r2.1.af-ge-0.001.sites.vcf.gz" + dbsnp = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/dbsnp.b138.non-somatic.sites.vcf.gz" + onekgenomes = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/1000g-pon.sites.vcf.gz" + colors = "${params.igenomes_base}/Homo_sapiens/ClairSTO/GRCh38/Annotation/CoLoRSdb.GRCh38.v1.1.0.deepvariant.glnexus.af-ge-0.001.vcf.gz" } 'CHM13' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" @@ -36,10 +36,10 @@ params { bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" vep_genome = "T2T-CHM13v2.0" vep_species = "homo_sapiens_gca009914755v4" - gnomad = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_gnomad.vcf.gz" - dbsnp = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_dbsnp.vcf.gz" - onekgenomes = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_1kgenomes.vcf.gz" - colors = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ClairSTO-pon/final_colors.vcf.gz" + gnomad = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_gnomad.vcf.gz" + dbsnp = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_dbsnp.vcf.gz" + onekgenomes = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_1kgenomes.vcf.gz" + colors = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_colors.vcf.gz" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" From e781f03b8b8613d9be0ae5f5fe0386f29724c268 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 12:52:10 +0100 Subject: [PATCH 526/557] extra touches --- README.md | 67 ++++++++++------ docs/output.md | 211 +++++++++++++------------------------------------ 2 files changed, 101 insertions(+), 177 deletions(-) diff --git a/README.md b/README.md index e832099e..914307bc 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,8 @@ nextflow run IntGenomicsLab/lrsomatic \ --outdir ``` +More detail is given in our [usage documentation](/docs/usage.md) + > [!WARNING] > Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files). @@ -105,31 +107,52 @@ Besides QC and the aligned and phased bam file, we have output from (structural) Example output directory structure: ``` -results -| -├── multiqc -│ -├── sample1 -│ ├── bamfiles -│ ├── qc -│ │ ├── tumour -│ │ └── normal -│ ├── variants -│ │ ├── severus -│ │ └── clairs -│ └── ascat +├── Sample 1 +│ ├── ascat +│ ├── bamfiles +│ ├── qc +│ │ ├── tumor +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ ├── variants +│ │ ├──clairS-TO +│ │ ├──severus +│ ├── vep +│ │ ├── germline +│ │ ├── somatic +│ │ ├── SVs │ -└── sample2 - ├── bamfiles - ├── qc - │ ├── tumour - │ └── normal - ├── variants - │ ├── severus - │ └── clairs - └── ascat +├── Sample 2 +│ ├── ascat +│ ├── bamfiles +│ ├── qc +│ │ ├── tumor +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ │ ├── normal +│ │ │ ├── cramino_aln +│ │ │ ├── cramino_ubam +│ │ │ ├── fibertoolsrs +│ │ │ ├── mosdepth +│ │ │ ├── samtools +│ ├── variants +│ │ ├── clair3 +│ │ ├── clairS +│ │ ├── severus +│ ├── vep +│ │ ├── germline +│ │ ├── somatic +│ │ ├── SVs +├── pipeline_info ``` +more detail is given in our [output documentation](/docs/output.md) ## Contributions and Support If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). diff --git a/docs/output.md b/docs/output.md index 3da5e0eb..c4799c3b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -79,8 +79,8 @@ The directories listed below will be created in the results directory after the | File | Description | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample | -| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample +| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample before correction | +| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample before correction | `sample.cnvs.txt` | a tsv file describing each chromosome segment with a copy number alteration and it's major and minor copy number | `sample.metrics.txt` | a tsv file describing summary statistics for the sample | `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths @@ -91,10 +91,10 @@ The directories listed below will be created in the results directory after the | `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample | `sample.tumour_normalLogR.txt` | a tsv file with the LogR values in the normal sample | `sample.tumour_tumourBAF_rawBAF.txt` | a tsv file with the raw BAF values in the tumor sample -| `sample.tumour_tumourBAF.txt` | a tsv file with the BAF values in the tumor sample -| `sample.tumour_tumourLogR.txt` | a tsv file with the LogR values in the tumor sample +| `sample.tumour_tumourBAF.txt` | a tsv file with the corrected BAF values in the tumor sample +| `sample.tumour_tumourLogR.txt` | a tsv file with the corrected LogR values in the tumor sample | `sample.tumour.ASCATprofile.png` | a png file with the corrected overall copy number profile with ploidy, purity, and goodness of fit metrics -| `sample.tumour.ASPCF.png` | a png file with the correct LogR and BAF plots of the tumor sample +| `sample.tumour.ASPCF.png` | a png file with the corrected LogR and BAF plots of the tumor sample | `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics | `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit @@ -213,14 +213,14 @@ The directories listed below will be created in the results directory after the ├── severus │ ├── all_SVs │ │ ├── plots -│ │ │ ├── +│ │ │ ├── severus_{*}.html │ │ ├── breakpoint_cluster_list.tsv │ │ ├── breakpoint_clusters.tsv │ │ ├── severus_all.vcf.gz │ │ ├── severus_all.vcf.gz.tbi │ ├── somatic_SVs │ │ ├── plots -│ │ │ ├── +│ │ │ ├── severus_{*}.html │ │ ├── breakpoint_cluster_list.tsv │ │ ├── breakpoint_clusters.tsv │ │ ├── severus_somatic.vcf.gz @@ -232,174 +232,75 @@ The directories listed below will be created in the results directory after the ``` | File | Description | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`all_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster |`all_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in all clustered events |`all_SVs/breakpoint_cluster.tsv` | a tsv containing all clustered events |`all_SVs/severus_all.vcf.gz` | A vcf file containing all identified structural variants -|`all_SVs/severus_all.vcf.gz.tbi` | Index for all identified structural variants +|`somatic_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster |`somatic_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in somatic clustered events |`somatic_SVs/breakpoint_cluster.tsv` | a tsv containing somatic clustered events |`somatic_SVs/severus_somatic.vcf.gz` | A vcf file containing identified somatic structural variants |`somatic_SVs/severus_somatic.vcf.gz.tbi` | Index for identified somatic structural variants - - +|`breakpoints_double.csv` | csv file containing detailed information about identified breakpoints in bam file +|`read_ids.csv`| a csv file containing read ids associated with each identified SV +|`read_qual.txt` | file containing quality statistics about identified segements +|`severus.log` | log file
### `vep` - -### `pipeline_info` -## Pipeline overview - -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - -- [samtools/cat](#samtools_cat) - Concatenate replicates from the same sample -- [Cramino](#cramino) - Quality check the aligned or unaligned lomg read bam files -- [fibertools/predictm6a](#fibertools) - -- [fibertools/nucleosome](#fibertools)- -- [fibertools/fire](#fibertools) - -- [fibertools/qc](#fibertools) - -- [minimap2/index](#minimap2) - Creating minimap2 index -- [minimap2/align](#minimap2) - Aligning long-read samples to the reference genome -- [clair3](#clair3) - -- [clairsto](#clairsto)- -- [clairs](#clairs) - -- [longphase/phase](#longphase) - -- [longphase/haplotag](#longphase) - -- [severus](#severus) - -- [wakhan](#wakhan) - -- [Modkit](#modkit) - Tool to process methylation data -- [Mosdepth](#mosdepth) - Tool to check the sequencing depth -- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution - -### samtools - -### Minimap2 - -[ClairS-TO](https://github.com/HKU-BAL/ClairS-TO) ool in the Clair series to support long-read somatic small variant calling with only tumor samples available. For more information, see . - -### Cramino - -
-Output files - -- `cramino/` - - `*_cramino.txt`: text file containing the quality check results from Cramino - -
- -[Cramino](https://github.com/wdecoster/cramino) is a tool for fast quality check of aligned or unaligned long read sequencing bam files. For more information, check . - -### Modkit - -
-Output files - -- `modkit/` - - `*.bed`: bed file with genomic positions with modified bases - - `*.bedgraph`: bedgraph file with genomic positions with modified bases - - `*log`: log file - -
- -[Modkit](https://github.com/nanoporetech/modkit) is a tool to work with methylated bases from bam files. It allows you to update the bam file modification information, filter the information, or to extract it to other file formarts such as bed file. For more information, see . - -### Mosdepth - -
-Output files - -- `mosdepth` - - `*.summary.txt'`: summary text file - - `*.global.dist.txt`: global information on sequencing depth file - - optionally outputs other files by regions. - -
- -[Mosdepth](https://github.com/brentp/mosdepth) is a tool to work with WGS/exome/targeted sequencing data to obtain sequecing depth information, For more information, see . - -### ClairS-TO - -
-Output files - -- `clairsto/` - - `germline.vcf.gz`: a VCF file containing germline SNP and indel calls - - `somatic.vcf.gz`: a VCF file containing somatic SNP and indel calls - - `logs`: directory containing log files for the ClairS-TO run - - `run_clairs_to.log`: a text file containing a summary of the ClairS-TO run - - `run_clairs_to.log.bak`: a text file containing the run command - -
- -### Severus - -
-Output files - -- `severus` -- `severus.log`: severus log file -- `read_qual.txt`: the read quality -- `breakpoints_double.csv`: the breakpoint file - -
- -[Severus](https://github.com/KolmogorovLab/Severus) is a tool to call not only somatic, but also germline structural variant calls. For mor information on the tool and its usage, check out . - -### Longphase -
Output files -TODO - add description ot output file - -- `longphase/` - -
- -[Longphase](https://github.com/twolinin/longphase) isa tool to phase your input variant calls and haplotag your bam. To see more, see . - -### MultiQC - -
-Output files - -- `multiqc/` - - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. - -
- -[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. - -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . - -
-Output files - -- `multiqc/` - - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. +``` +├── vep +│ ├── germline +│ │ ├── sample_GERMLINE_VEP.vcf.gz +│ │ ├── sample_GERMLINE_VEP_summary.html +│ │ ├── sample_GERMLINE_VEP.vcf.gz.tbi +│ ├── somatic +│ │ ├── sample_SOMATIC_VEP.vcf.gz +│ │ ├── sample_SOMATIC_VEP_summary.html +│ │ ├── sample_SOMATIC_VEP.vcf.gz.tbi +│ ├── SVs +│ │ ├── sample_SV_VEP.vcf.gz +│ │ ├── sample_SV_VEP_summary.html +│ │ ├── sample_SV_VEP.vcf.gz.tbi +``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`germline/sample_GERMLINE_VEP.vcf.gz` | Annotated germline indel and SNV vcf file | +|`germline/sample_GERMLINE_VEP_summary.html` | Visual summary of germline indel and SNV annotations in html format +|`germline/sample_GERMLINE_VEP.vcf.gz.tbi` | Annotated germline indel and SNV vcf index file | +|`somatic/sample_SOMATIC_VEP.vcf.gz` | Annotated somatic indel and SNV vcf file | +|`somatic/sample_SOMATIC_VEP_summary.html` | Visual summary of somatic indel and SNV annotations in html format +|`somatic/sample_SOMATIC_VEP.vcf.gz.tbi` | Annotated somatic indel and SNV vcf index file | +|`SVs/sample_SV_VEP.vcf.gz` | Annotated somatic structural variant vcf file | +|`SVs/sample_SV_VEP_summary.html` | Visual summary of somatic structural variant annotations in html format +|`SVs/sample_SV_VEP.vcf.gz.tbi` | Annotated somatic structural variant vcf index file |
-[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. - -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . - -### Pipeline information +### pipeline_info
Output files -- `pipeline_info/` - - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. - - Parameters used by the pipeline run: `params.json`. +``` +├── pipeline_info +│ ├── execution_report_{DATE}.html +│ ├── execution_timeline_{DATE}.html +│ ├── execution_trace_{DATE}.txt +│ ├── lrsomatic_softwar_mqc_versions.yml +│ ├── params_{DATE}.json +│ ├── pipeline_dag_{DATE}/html +``` +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|`execution_report_{DATE}.hmtl` | summary of pipeline resource and timing usage in a html report | +|`execution_timeline_{DATE}.hmtl` | a graphical summary of the timing of each module's task over the course of the pipeline run | +|`lrsomatic_softwar_mqc_versions.yml` | summary of the versions of each tool used by the pipeline| +|`params_{DATE}.json` | summary of the paramaters used in the pipeline| +|`pipeline_dag_{DATE}.html` | flow chart summarizing the pipeline run |
- -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. From 6955466736d9cd03a9375f8d9535ce2c95bae7b5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 12:56:06 +0100 Subject: [PATCH 527/557] add samtools info --- docs/output.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/output.md b/docs/output.md index c4799c3b..cb033ed9 100644 --- a/docs/output.md +++ b/docs/output.md @@ -149,9 +149,9 @@ The directories listed below will be created in the results directory after the | `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file | `mosdepth/sample.mosdepth.global.dist.txt` | a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value | `mosdepth/sample.mosdepth.summary.txt` | overall summary file from mosdepth tool -|`samtools/sample.flagstat` | -|`samtools/sample.idxstats` | -|`samtools/sample.stats` | +|`samtools/sample.flagstat` | a summary of the counts of different samtools flags +|`samtools/sample.idxstats` | a summary of the number of mapped and unmapped reads +|`samtools/sample.stats` | summary statistics from the bamfile
### `variants` From b638fabf821f85c917ecddfd255b6b56b36638de Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 13:30:07 +0100 Subject: [PATCH 528/557] remove getGenomeAttribute stuff from main.nf since we have it in lrsomatic.nf --- main.nf | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/main.nf b/main.nf index 3ae271c8..a6011fff 100644 --- a/main.nf +++ b/main.nf @@ -16,17 +16,6 @@ include { LRSOMATIC } from './workflows/lrsomatic' include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_lrsomatic_pipeline' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// TODO nf-core: Remove this line if you don't need a FASTA file -// This is an example of how to use getGenomeAttribute() to fetch parameters -// from igenomes.config using `--genome` /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 9e86276782b7bb6577e5ef3a96817d9cc403901f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 13:36:58 +0100 Subject: [PATCH 529/557] view --- subworkflows/local/tumor_normal_happhase.nf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 5be12daa..f5326742 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -30,6 +30,8 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ mixed_bams } + mixed_bams.view() + // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later @@ -55,6 +57,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { normal_bams_model } + normal_bams_model.view() normal_bams_model .combine(downloaded_model_files,by:0) @@ -64,6 +67,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ normal_bams } + normal_bams.view() // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -86,6 +90,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ tumor_bams } + tumor_bams.view() // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -113,6 +118,8 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, vcf, svs, mods] } .set{ normal_bams_germlinevcf } + + normal_bams_germlinevcf.view() // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -175,6 +182,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .mix(normal_bams) .set{ mixed_bams_vcf } + mixed_bams_vcf.view() // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -267,6 +275,8 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: CLAIRS // + clairs_input.view() + CLAIRS ( clairs_input, fasta, From 0d11cb92a2b88bd6c19c57d6d75c124072895f61 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 13:58:31 +0100 Subject: [PATCH 530/557] fix multichannel --- subworkflows/local/tumor_normal_happhase.nf | 2 +- tests/default.nf.test.snap | 366 +------------------- 2 files changed, 6 insertions(+), 362 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index f5326742..2b987254 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -30,7 +30,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ mixed_bams } - mixed_bams.view() // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later @@ -182,6 +181,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .mix(normal_bams) .set{ mixed_bams_vcf } + mixed_bams_vcf.view() // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 52651ce4..c422d2b8 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,375 +1,19 @@ { "-profile test": { "content": [ - 82, - { - "BCFTOOLS_CONCAT": { - "bcftools": 1.22 - }, - "BCFTOOLS_SORT": { - "bcftools": 1.22 - }, - "CLAIR3": { - "clair3": "1.2.0" - }, - "CLAIRS": { - "clairs": "0.4.1" - }, - "CLAIRSTO": { - "clairsto": "0.4.0" - }, - "CRAMINO_POST": { - "cramino": "1.0.0" - }, - "CRAMINO_PRE": { - "cramino": "1.0.0" - }, - "GERMLINE_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "LONGPHASE_HAPLOTAG": { - "longphase": "1.7.3" - }, - "LONGPHASE_PHASE": { - "longphase": "1.7.3" - }, - "METAEXTRACT": { - "samtools": 1.21 - }, - "MINIMAP2_ALIGN": { - "minimap2": "2.29-r1283", - "samtools": 1.21 - }, - "MOSDEPTH": { - "mosdepth": "0.3.10" - }, - "SAMTOOLS_FAIDX": { - "samtools": 1.21 - }, - "SAMTOOLS_FLAGSTAT": { - "samtools": 1.21 - }, - "SAMTOOLS_IDXSTATS": { - "samtools": 1.21 - }, - "SAMTOOLS_INDEX": { - "samtools": 1.21 - }, - "SAMTOOLS_STATS": { - "samtools": 1.21 - }, - "SEVERUS": { - "severus": 1.6 - }, - "SOMATIC_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "SV_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, - "UNTAR": { - "untar": 1.34 - }, - "UNZIP_FASTA": { - "pigz": 2.8 - }, - "VCFSPLIT": { - "vcfsplit": 1.2 - }, - "WGET": { - "wget": "1.21.4" - }, - "Workflow": { - "IntGenomicsLab/lrsomatic": "v1.0.0dev" - } - }, + 0, + null, [ - "multiqc", - "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", - "multiqc/multiqc_data/llms-full.txt", - "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", - "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", - "multiqc/multiqc_data/mosdepth_cov_dist.txt", - "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", - "multiqc/multiqc_data/mosdepth_perchrom.txt", - "multiqc/multiqc_data/multiqc.log", - "multiqc/multiqc_data/multiqc_citations.txt", - "multiqc/multiqc_data/multiqc_data.json", - "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_software_versions.txt", - "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_plots", - "multiqc/multiqc_plots/pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", - "multiqc/multiqc_plots/png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", - "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", - "multiqc/multiqc_plots/svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", - "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", - "multiqc/multiqc_report.html", - "pipeline_info", - "pipeline_info/lrsomatic_software_mqc_versions.yml", - "sample1", - "sample1/bamfiles", - "sample1/bamfiles/sample1_normal.bam", - "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", - "sample1/qc", - "sample1/qc/normal", - "sample1/qc/normal/cramino_aln", - "sample1/qc/normal/cramino_aln/sample1_cramino.txt", - "sample1/qc/normal/cramino_ubam", - "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", - "sample1/qc/normal/mosdepth", - "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/normal/samtools", - "sample1/qc/normal/samtools/sample1.flagstat", - "sample1/qc/normal/samtools/sample1.idxstats", - "sample1/qc/normal/samtools/sample1.stats", - "sample1/qc/tumor", - "sample1/qc/tumor/cramino_aln", - "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", - "sample1/qc/tumor/cramino_ubam", - "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", - "sample1/qc/tumor/mosdepth", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/tumor/samtools", - "sample1/qc/tumor/samtools/sample1.flagstat", - "sample1/qc/tumor/samtools/sample1.idxstats", - "sample1/qc/tumor/samtools/sample1.stats", - "sample1/variants", - "sample1/variants/clair3", - "sample1/variants/clair3/merge_output.vcf.gz", - "sample1/variants/clair3/merge_output.vcf.gz.tbi", - "sample1/variants/clairs", - "sample1/variants/clairs/indel.vcf.gz", - "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/snvs.vcf.gz", - "sample1/variants/clairs/snvs.vcf.gz.tbi", - "sample1/variants/severus", - "sample1/variants/severus/all_SVs", - "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample1/variants/severus/breakpoints_double.csv", - "sample1/variants/severus/read_ids.csv", - "sample1/variants/severus/read_qual.txt", - "sample1/variants/severus/severus.log", - "sample1/variants/severus/somatic_SVs", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample1/vep", - "sample1/vep/SVs", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", - "sample1/vep/germline", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/vep/somatic", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", - "sample2", - "sample2/bamfiles", - "sample2/bamfiles/sample2_normal.bam", - "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", - "sample2/qc", - "sample2/qc/normal", - "sample2/qc/normal/cramino_aln", - "sample2/qc/normal/cramino_aln/sample2_cramino.txt", - "sample2/qc/normal/cramino_ubam", - "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", - "sample2/qc/normal/mosdepth", - "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/normal/samtools", - "sample2/qc/normal/samtools/sample2.flagstat", - "sample2/qc/normal/samtools/sample2.idxstats", - "sample2/qc/normal/samtools/sample2.stats", - "sample2/qc/tumor", - "sample2/qc/tumor/cramino_aln", - "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", - "sample2/qc/tumor/cramino_ubam", - "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", - "sample2/qc/tumor/mosdepth", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/tumor/samtools", - "sample2/qc/tumor/samtools/sample2.flagstat", - "sample2/qc/tumor/samtools/sample2.idxstats", - "sample2/qc/tumor/samtools/sample2.stats", - "sample2/variants", - "sample2/variants/clair3", - "sample2/variants/clair3/merge_output.vcf.gz", - "sample2/variants/clair3/merge_output.vcf.gz.tbi", - "sample2/variants/clairs", - "sample2/variants/clairs/indel.vcf.gz", - "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/snvs.vcf.gz", - "sample2/variants/clairs/snvs.vcf.gz.tbi", - "sample2/variants/severus", - "sample2/variants/severus/all_SVs", - "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample2/variants/severus/breakpoints_double.csv", - "sample2/variants/severus/read_ids.csv", - "sample2/variants/severus/read_qual.txt", - "sample2/variants/severus/severus.log", - "sample2/variants/severus/somatic_SVs", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample2/vep", - "sample2/vep/SVs", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", - "sample2/vep/germline", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/vep/somatic", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", - "sample3", - "sample3/bamfiles", - "sample3/bamfiles/sample3_tumor.bam", - "sample3/bamfiles/sample3_tumor.bam.bai", - "sample3/qc", - "sample3/qc/tumor", - "sample3/qc/tumor/cramino_aln", - "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", - "sample3/qc/tumor/cramino_ubam", - "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", - "sample3/qc/tumor/mosdepth", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", - "sample3/qc/tumor/samtools", - "sample3/qc/tumor/samtools/sample3.flagstat", - "sample3/qc/tumor/samtools/sample3.idxstats", - "sample3/qc/tumor/samtools/sample3.stats", - "sample3/variants", - "sample3/variants/clairsto", - "sample3/variants/clairsto/germline.vcf.gz", - "sample3/variants/clairsto/germline.vcf.gz.tbi", - "sample3/variants/clairsto/indel.vcf.gz", - "sample3/variants/clairsto/indel.vcf.gz.tbi", - "sample3/variants/clairsto/snv.vcf.gz", - "sample3/variants/clairsto/snv.vcf.gz.tbi", - "sample3/variants/clairsto/somatic.vcf.gz", - "sample3/variants/clairsto/somatic.vcf.gz.tbi", - "sample3/variants/severus", - "sample3/variants/severus/all_SVs", - "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample3/variants/severus/breakpoints_double.csv", - "sample3/variants/severus/read_ids.csv", - "sample3/variants/severus/read_qual.txt", - "sample3/variants/severus/severus.log", - "sample3/variants/severus/somatic_SVs", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", - "sample3/vep", - "sample3/vep/SVs", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", - "sample3/vep/germline", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", - "sample3/vep/somatic", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + "pipeline_info" ], [ - "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", - "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", - "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", - "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", - "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", - "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", - "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", - "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", - "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", - "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", - "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", - "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", - "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", - "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", - "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", - "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", - "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", - "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", - "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", - "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", - "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", - "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", - "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", - "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-27T10:35:33.023032177" + "timestamp": "2025-11-27T13:57:32.181376744" } } \ No newline at end of file From 4fcf630420c18b2c7959154cd1d71756779de7e0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 14:05:30 +0100 Subject: [PATCH 531/557] edit view --- subworkflows/local/tumor_only_happhase.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 644f5aac..dd3d074b 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -22,7 +22,6 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_only_severus = Channel.empty() somatic_vep = Channel.empty() germline_vep = Channel.empty() - tumor_bams.view() tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model @@ -30,7 +29,6 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } - tumor_bams.view() // // MODULE: CLAIRSTO From 800064f54efc30bf29a59be2547dd81dcc87c591 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 14:25:12 +0100 Subject: [PATCH 532/557] change channel --- subworkflows/local/tumor_normal_happhase.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 2b987254..e99e81b2 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -104,6 +104,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) + CLAIR3.out.vcf.view() ch_versions = ch_versions.mix(CLAIR3.out.versions) // Add germline vcf to normal bams @@ -134,6 +135,8 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { germline_vep } + germline_vep.view() + // // MODULE: LONGPHASE_PHASE // From e10896083a532bd26227dd799e1c4bef6652e204 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 14:57:49 +0100 Subject: [PATCH 533/557] Checkpoint from VS Code for coding agent session --- docs/usage.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 52a0d92d..5addb033 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,10 +2,6 @@ > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ -## Introduction - - - ## Samplesheet input You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file of the following form: @@ -21,7 +17,7 @@ sample4,tumour.bam,normal.bam,pb,male,y lrsomatic extracts information from the bam header files to decide which models to use for Clair3, ClairS, or ClairS-TO. However, this can optionally be specified manually. You can do this for one or many samples, if the field is left blank, the pipeline will default to extracting this information. You can specify this by creating your csv in the following form: ```csv -ample,bam_tumor,bam_normal,platform,sex,fiber,clair3_model,clairSTO_model,clairS_model +sample,bam_tumor,bam_normal,platform,sex,fiber,clair3_model,clairSTO_model,clairS_model sample1,tumour.bam,normal.bam,ont,female,n sample2,tumour.bam,,ont,female,y sample3,tumour.bam,normal.bam,pb,male,n,r1041_e82_400bps_sup_v420,,ont_r10_dorado_sup_5khz_ssrs From c716e653c0d09ff9b6501844af279e034d21a1ad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 27 Nov 2025 14:01:43 +0000 Subject: [PATCH 534/557] Add bibliography of tools used in pipeline to CITATIONS.md Co-authored-by: ljwharbers <40829819+ljwharbers@users.noreply.github.com> --- CITATIONS.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++- README.md | 2 -- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 33c9f5f1..4a10a5dc 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,9 +10,61 @@ ## Pipeline tools +- [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) + + > Van Loo P, Nordgard SH, Lingjærde OC, Russnes HG, Rye IH, Sun W, Weigman VJ, Marynen P, Zetterberg A, Naume B, Perou CM, Børresen-Dale AL, Kristensen VN. Allele-specific copy number analysis of tumors. Proc Natl Acad Sci U S A. 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. + +- [Clair3](https://pubmed.ncbi.nlm.nih.gov/35017061/) + + > Zheng Z, Li S, Su J, Leung AW, Lam TW, Luo R. Symphonizing pileup and full-alignment for deep learning-based long-read variant calling. Nat Comput Sci. 2022 Dec;2(12):797-803. doi: 10.1038/s43588-022-00387-x. Epub 2022 Dec 22. PubMed PMID: 38177366. + +- [ClairS](https://pubmed.ncbi.nlm.nih.gov/39191961/) + + > Au CH, Ho DN, Kwong A, Chan TL, Ma ESK. ClairS: a deep-learning method for long-read somatic small variant calling. Brief Bioinform. 2024 Aug 23;25(5):bbae426. doi: 10.1093/bib/bbae426. PubMed PMID: 39191961. + +- [ClairS-TO](https://pubmed.ncbi.nlm.nih.gov/39251800/) + + > Au CH, Ho DN, Kwong A, Chan TL, Ma ESK. ClairS-TO: A deep-learning method for long-read tumour-only somatic small variant calling. Comput Struct Biotechnol J. 2024 Aug 10;23:3256-3263. doi: 10.1016/j.csbj.2024.08.007. eCollection 2024 Dec. PubMed PMID: 39251800; PubMed Central PMCID: PMC11382123. + +- [cramino](https://github.com/wdecoster/cramino) + + > De Coster W. cramino: A fast and simple tool for quality control of long read sequencing data [Software]. GitHub. https://github.com/wdecoster/cramino + +- [Ensembl VEP](https://pubmed.ncbi.nlm.nih.gov/27268795/) + + > McLaren W, Gil L, Hunt SE, Riat HS, Ritchie GR, Thormann A, Flicek P, Cunningham F. The Ensembl Variant Effect Predictor. Genome Biol. 2016 Jun 6;17(1):122. doi: 10.1186/s13059-016-0974-4. PubMed PMID: 27268795; PubMed Central PMCID: PMC4893825. + +- [fibertools-rs](https://pubmed.ncbi.nlm.nih.gov/37169966/) + + > Vollger MR, Stergachis AB. fibertools-rs: A tool for analyzing and manipulating Fiber-seq data. Nucleic Acids Res. 2023 Jul 5;51(W1):W274-W282. doi: 10.1093/nar/gkad372. PubMed PMID: 37169966; PubMed Central PMCID: PMC10320161. + +- [LongPhase](https://pubmed.ncbi.nlm.nih.gov/35253834/) + + > Lin JH, Chen LC, Yu SC, Huang YT. LongPhase: an ultra-fast chromosome-scale phasing algorithm for small and large variants. Bioinformatics. 2022 Apr 28;38(9):2452-2455. doi: 10.1093/bioinformatics/btac126. PubMed PMID: 35253834; PubMed Central PMCID: PMC9048675. + +- [minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) + + > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PubMed PMID: 29750242; PubMed Central PMCID: PMC6137996. + +- [modkit](https://github.com/nanoporetech/modkit) + + > Oxford Nanopore Technologies. modkit: A tool for analyzing and manipulating modified base calls [Software]. GitHub. https://github.com/nanoporetech/modkit + +- [mosdepth](https://pubmed.ncbi.nlm.nih.gov/29096012/) + + > Pedersen BS, Quinlan AR. mosdepth: quick coverage calculation for genomes and exomes. Bioinformatics. 2018 Mar 1;34(5):867-868. doi: 10.1093/bioinformatics/btx699. PubMed PMID: 29096012; PubMed Central PMCID: PMC6030888. + - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) -> Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +- [SAMtools](https://pubmed.ncbi.nlm.nih.gov/19505943/) + + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +- [Severus](https://pubmed.ncbi.nlm.nih.gov/39604742/) + + > Parikh H, Yanover C, Bzureski S, Smith J, Gerstein J, Grunberg I, Boaz M, Kanne O, Kolmogorov M. Severus: accurate detection and characterization of somatic structural variation in tumor genomes using long reads. Nat Biotechnol. 2024 Nov 27. doi: 10.1038/s41587-024-02484-y. Epub ahead of print. PubMed PMID: 39604742. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 914307bc..f1c262f2 100644 --- a/README.md +++ b/README.md @@ -162,8 +162,6 @@ If you would like to contribute to this pipeline, please see the [contributing g - - An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. This 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). From be9e0ea0a18e9cfbe235d7d6a4a5c2b539aac2a6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 15:08:38 +0100 Subject: [PATCH 535/557] remove view --- subworkflows/local/tumor_normal_happhase.nf | 8 -------- 1 file changed, 8 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index e99e81b2..678f1cd6 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -56,7 +56,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { normal_bams_model } - normal_bams_model.view() normal_bams_model .combine(downloaded_model_files,by:0) @@ -66,7 +65,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ normal_bams } - normal_bams.view() // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -89,7 +87,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ tumor_bams } - tumor_bams.view() // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -104,7 +101,6 @@ workflow TUMOR_NORMAL_HAPPHASE { fai ) - CLAIR3.out.vcf.view() ch_versions = ch_versions.mix(CLAIR3.out.versions) // Add germline vcf to normal bams @@ -119,7 +115,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ normal_bams_germlinevcf } - normal_bams_germlinevcf.view() // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -135,7 +130,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { germline_vep } - germline_vep.view() // // MODULE: LONGPHASE_PHASE @@ -185,7 +179,6 @@ workflow TUMOR_NORMAL_HAPPHASE { .mix(normal_bams) .set{ mixed_bams_vcf } - mixed_bams_vcf.view() // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -278,7 +271,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: CLAIRS // - clairs_input.view() CLAIRS ( clairs_input, From 0dcd704b5da558c95b9a1ad944d1e6bc88fcff3c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 15:19:34 +0100 Subject: [PATCH 536/557] fix citations --- CITATIONS.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 4a10a5dc..16b00160 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -14,17 +14,17 @@ > Van Loo P, Nordgard SH, Lingjærde OC, Russnes HG, Rye IH, Sun W, Weigman VJ, Marynen P, Zetterberg A, Naume B, Perou CM, Børresen-Dale AL, Kristensen VN. Allele-specific copy number analysis of tumors. Proc Natl Acad Sci U S A. 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. -- [Clair3](https://pubmed.ncbi.nlm.nih.gov/35017061/) +- [Clair3](https://www.nature.com/articles/s43588-022-00387-x) - > Zheng Z, Li S, Su J, Leung AW, Lam TW, Luo R. Symphonizing pileup and full-alignment for deep learning-based long-read variant calling. Nat Comput Sci. 2022 Dec;2(12):797-803. doi: 10.1038/s43588-022-00387-x. Epub 2022 Dec 22. PubMed PMID: 38177366. + > Zheng, Z., Li, S., Su, J. et al. Symphonizing pileup and full-alignment for deep learning-based long-read variant calling. Nat Comput Sci 2, 797–803 (2022). https://doi.org/10.1038/s43588-022-00387-x -- [ClairS](https://pubmed.ncbi.nlm.nih.gov/39191961/) +- [ClairS](https://www.biorxiv.org/content/10.1101/2023.08.17.553778v1) - > Au CH, Ho DN, Kwong A, Chan TL, Ma ESK. ClairS: a deep-learning method for long-read somatic small variant calling. Brief Bioinform. 2024 Aug 23;25(5):bbae426. doi: 10.1093/bib/bbae426. PubMed PMID: 39191961. + > Zhenxian Zheng, Junhao Su, Lei Chen, Yan-Lam Lee, Tak-Wah Lam, Ruibang Luo. ClairS: a deep-learning method for long-read somatic small variant calling. bioRxiv 2023.08.17.553778; doi: https://doi.org/10.1101/2023.08.17.553778 -- [ClairS-TO](https://pubmed.ncbi.nlm.nih.gov/39251800/) +- [ClairS-TO](https://pubmed.ncbi.nlm.nih.gov/41173866/) - > Au CH, Ho DN, Kwong A, Chan TL, Ma ESK. ClairS-TO: A deep-learning method for long-read tumour-only somatic small variant calling. Comput Struct Biotechnol J. 2024 Aug 10;23:3256-3263. doi: 10.1016/j.csbj.2024.08.007. eCollection 2024 Dec. PubMed PMID: 39251800; PubMed Central PMCID: PMC11382123. + > Chen L, Zheng Z, Su J, Yu X, Wong AOK, Zhang J, Lee YL, Luo R. ClairS-TO: a deep-learning method for long-read tumor-only somatic small variant calling. Nat Commun. 2025 Oct 31;16(1):9630. doi: 10.1038/s41467-025-64547-z. PMID: 41173866; PMCID: PMC12579226. - [cramino](https://github.com/wdecoster/cramino) @@ -34,11 +34,11 @@ > McLaren W, Gil L, Hunt SE, Riat HS, Ritchie GR, Thormann A, Flicek P, Cunningham F. The Ensembl Variant Effect Predictor. Genome Biol. 2016 Jun 6;17(1):122. doi: 10.1186/s13059-016-0974-4. PubMed PMID: 27268795; PubMed Central PMCID: PMC4893825. -- [fibertools-rs](https://pubmed.ncbi.nlm.nih.gov/37169966/) +- [fibertools-rs](https://doi.org/10.1101/gr.279095.124) - > Vollger MR, Stergachis AB. fibertools-rs: A tool for analyzing and manipulating Fiber-seq data. Nucleic Acids Res. 2023 Jul 5;51(W1):W274-W282. doi: 10.1093/nar/gkad372. PubMed PMID: 37169966; PubMed Central PMCID: PMC10320161. + > Jha, A., Bohaczuk, S. C., Mao, Y., Ranchalis, J., Mallory, B. J., Min, A. T., Hamm, M. O., Swanson, E., Dubocanin, D., Finkbeiner, C., Li, T., Whittington, D., Noble, W. S., Stergachis, A. B., & Vollger, M. R. (2024). DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools. Genome Research. -- [LongPhase](https://pubmed.ncbi.nlm.nih.gov/35253834/) +- [LongPhase](https://pubmed.ncbi.nlm.nih.gov/35104333/) > Lin JH, Chen LC, Yu SC, Huang YT. LongPhase: an ultra-fast chromosome-scale phasing algorithm for small and large variants. Bioinformatics. 2022 Apr 28;38(9):2452-2455. doi: 10.1093/bioinformatics/btac126. PubMed PMID: 35253834; PubMed Central PMCID: PMC9048675. @@ -62,9 +62,9 @@ > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. -- [Severus](https://pubmed.ncbi.nlm.nih.gov/39604742/) +- [Severus](https://www.nature.com/articles/s41587-025-02618-8) - > Parikh H, Yanover C, Bzureski S, Smith J, Gerstein J, Grunberg I, Boaz M, Kanne O, Kolmogorov M. Severus: accurate detection and characterization of somatic structural variation in tumor genomes using long reads. Nat Biotechnol. 2024 Nov 27. doi: 10.1038/s41587-024-02484-y. Epub ahead of print. PubMed PMID: 39604742. + > Keskus, A.G., Bryant, A., Ahmad, T. et al. Severus detects somatic structural variation and complex rearrangements in cancer genomes using long-read sequencing. Nat Biotechnol (2025). https://doi.org/10.1038/s41587-025-02618-8 ## Software packaging/containerisation tools From 67f4be663a45d8119eaf14e46a9972bfe9ff6179 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 15:35:02 +0100 Subject: [PATCH 537/557] lint and snapshot --- modules.json | 115 +++--------- tests/default.nf.test.snap | 366 ++++++++++++++++++++++++++++++++++++- 2 files changed, 390 insertions(+), 91 deletions(-) diff --git a/modules.json b/modules.json index 4afad53b..58f3aae4 100644 --- a/modules.json +++ b/modules.json @@ -8,178 +8,129 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "vcf_gather_bcftools" - ], + "installed_by": ["vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "a4488d3d09244f29fb4606ba4eef85d59dcc6ad8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -188,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index c422d2b8..dde7be33 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,19 +1,375 @@ { "-profile test": { "content": [ - 0, - null, + 82, + { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.1" + }, + "CLAIRSTO": { + "clairsto": "0.4.0" + }, + "CRAMINO_POST": { + "cramino": "1.0.0" + }, + "CRAMINO_PRE": { + "cramino": "1.0.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "LONGPHASE_HAPLOTAG": { + "longphase": "1.7.3" + }, + "LONGPHASE_PHASE": { + "longphase": "1.7.3" + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283", + "samtools": 1.21 + }, + "MOSDEPTH": { + "mosdepth": "0.3.10" + }, + "SAMTOOLS_FAIDX": { + "samtools": 1.21 + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": 1.21 + }, + "SAMTOOLS_IDXSTATS": { + "samtools": 1.21 + }, + "SAMTOOLS_INDEX": { + "samtools": 1.21 + }, + "SAMTOOLS_STATS": { + "samtools": 1.21 + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "vcfsplit": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.0.0dev" + } + }, [ - "pipeline_info" + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam", + "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam", + "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam", + "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam", + "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam", + "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - + "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", + "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", + "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", + "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", + "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", + "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", + "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", + "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", + "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", + "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", + "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", + "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", + "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", + "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", + "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", + "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", + "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", + "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", + "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", + "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", + "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", + "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", + "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", + "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-27T13:57:32.181376744" + "timestamp": "2025-11-27T15:31:19.623058622" } } \ No newline at end of file From 5a991a6159b65a4c5dfa3a356bb59efe7a33628c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 15:42:23 +0100 Subject: [PATCH 538/557] remove todo --- nextflow.config | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nextflow.config b/nextflow.config index a3eb8548..867eab84 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,7 +9,6 @@ // Global default params, used in configs params { - // TODO nf-core: Specify your pipeline's command line flags // Input options input = null @@ -61,9 +60,7 @@ params { // Wakhan options wakhan_chroms = null - //TODO: - // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version - // and allele/loci(/gc/rt) files. For now they need to be specified for anything else but GRCh38 and CHM13 + // Custom ASCAT files ascat_gc_files = null ascat_rt_files = null @@ -227,7 +224,6 @@ includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !pa // Load IntGenomicsLab/lrsomatic custom profiles from different institutions. -// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs // includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile From 4b47c2f124ec9af142b60131c22d15493fd5af1f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 15:59:16 +0100 Subject: [PATCH 539/557] fix lint and snap --- lint_log.txt | 3596 +++++++++++++++++++ subworkflows/local/tumor_normal_happhase.nf | 6 +- 2 files changed, 3599 insertions(+), 3 deletions(-) create mode 100644 lint_log.txt diff --git a/lint_log.txt b/lint_log.txt new file mode 100644 index 00000000..5e087cd0 --- /dev/null +++ b/lint_log.txt @@ -0,0 +1,3596 @@ +[2025-11-27 15:47:39,242] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:39,244] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/lustre1/project/stg_00096/home/rforsyth/LRSomatic/lrsomatic, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:47:39,250] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:39,251] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:39,252] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:39,254] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:39,258] git.cmd [DEBUG ] Popen(['git', 'version'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:39,260] git.cmd [DEBUG ] Popen(['git', 'fetch', '-v', '--progress', '--', 'origin'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=True) +[2025-11-27 15:47:40,027] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:40,360] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:40,375] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:47:40,376] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:47:40,376] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:47:40,378] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:41,648] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: + +modules.json + + +[2025-11-27 15:47:41,651] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:41,651] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:41,652] nf_core.components.lint [DEBUG ] Registry set to quay.io +[2025-11-27 15:47:41,652] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:41,653] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:41,705] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:47:41,724] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:47:41,724] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:47:41,725] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:47:41,727] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:41,727] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:41,728] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,155] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: + +modules.json + + +[2025-11-27 15:47:42,157] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,157] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,158] nf_core.components.lint [DEBUG ] Registry set to quay.io +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,160] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,162] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,162] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,163] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,163] nf_core.pipelines.lint [INFO ] Testing pipeline: [magenta]. +[2025-11-27 15:47:42,165] nf_core.pipelines.lint [DEBUG ] Running lint test: files_exist +[2025-11-27 15:47:42,167] nf_core.pipelines.lint [DEBUG ] Running lint test: nextflow_config +[2025-11-27 15:47:42,169] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,169] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,170] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,171] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,171] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,171] nf_core.pipelines.schema [DEBUG ] Ignoring parameters from config: ['genomes'] +[2025-11-27 15:47:42,171] nf_core.pipelines.schema [DEBUG ] Ignoring parameters: ['help', 'help_full', 'show_hidden', 'trace_report_suffix', 'genomes'] +[2025-11-27 15:47:42,172] nf_core.pipelines.schema [DEBUG ] JSON file loaded: nextflow_schema.json +[2025-11-27 15:47:42,172] nf_core.pipelines.lint [DEBUG ] Running lint test: nf_test_content +[2025-11-27 15:47:42,173] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:47:42,174] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:47:42,174] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:47:42,175] nf_core.pipelines.lint [DEBUG ] Running lint test: files_unchanged +[2025-11-27 15:47:42,197] nf_core.utils [DEBUG ] Could not find a config file in the directory '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' +[2025-11-27 15:47:42,378] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Could not find git hash for pipeline: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic. /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,378] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,379] nf_core.utils [DEBUG ] No conda `environment.yml` file found. +[2025-11-27 15:47:42,382] urllib3.connectionpool [DEBUG ] Starting new HTTPS connection (1): nf-co.re:443 +[2025-11-27 15:47:42,674] urllib3.connectionpool [DEBUG ] https://nf-co.re:443 "GET /pipelines.json HTTP/1.1" 200 None +[2025-11-27 15:47:42,909] nf_core.pipelines.rocrate [DEBUG ] Adding topics: ['nf-core', 'nextflow'] +[2025-11-27 15:47:42,909] nf_core.pipelines.rocrate [DEBUG ] No git repository found. No git contributors will be added as authors. +[2025-11-27 15:47:42,910] nf_core.pipelines.rocrate [INFO ] Saving metadata file to '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,911] nf_core.utils [DEBUG ] Using config file: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic/.nf-core.yml +[2025-11-27 15:47:42,914] nf_core.utils [DEBUG ] Got '/tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic' as path +[2025-11-27 15:47:42,914] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-2540e072f807b83f582a63138.json +[2025-11-27 15:47:42,915] nf_core.utils [DEBUG ] Using config file: /tmp/tmpu9m_99l5/IntGenomicsLab-lrsomatic/.nf-core.yml +[2025-11-27 15:47:43,547] nf_core.pipelines.lint_utils [DEBUG ] prettier.................................................................Passed + +[2025-11-27 15:47:43,550] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_nf_test +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_awstest +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_awsfulltest +[2025-11-27 15:47:43,556] nf_core.pipelines.lint [DEBUG ] Running lint test: readme +[2025-11-27 15:47:43,557] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_todos +[2025-11-27 15:47:43,708] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_if_empty_null +[2025-11-27 15:50:35,955] nf_core.pipelines.lint [DEBUG ] Running lint test: plugin_includes +[2025-11-27 15:50:35,958] nf_core.pipelines.lint [DEBUG ] Running lint test: pipeline_name_conventions +[2025-11-27 15:50:35,959] nf_core.pipelines.lint [DEBUG ] Running lint test: template_strings +[2025-11-27 15:50:36,008] nf_core.pipelines.lint [DEBUG ] Running lint test: schema_lint +[2025-11-27 15:50:36,008] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,009] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,042] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,042] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,043] nf_core.pipelines.lint [DEBUG ] Skipping lint test 'schema_params' +[2025-11-27 15:50:36,043] nf_core.pipelines.lint [DEBUG ] Running lint test: system_exit +[2025-11-27 15:50:36,093] nf_core.pipelines.lint [DEBUG ] Running lint test: schema_description +[2025-11-27 15:50:36,093] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,093] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,094] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,094] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,125] nf_core.pipelines.lint [DEBUG ] Running lint test: actions_schema_validation +[2025-11-27 15:50:36,126] urllib3.connectionpool [DEBUG ] Starting new HTTPS connection (1): www.schemastore.org:443 +[2025-11-27 15:50:36,292] urllib3.connectionpool [DEBUG ] https://www.schemastore.org:443 "GET /github-workflow HTTP/1.1" 200 14042 +[2025-11-27 15:50:36,454] nf_core.pipelines.lint [DEBUG ] Running lint test: merge_markers +[2025-11-27 15:50:36,514] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_json +[2025-11-27 15:50:36,514] nf_core.pipelines.lint [DEBUG ] Running lint test: multiqc_config +[2025-11-27 15:50:36,516] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,516] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,517] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,517] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_structure +[2025-11-27 15:50:36,520] nf_core.pipelines.lint [DEBUG ] Running lint test: local_component_structure +[2025-11-27 15:50:36,520] nf_core.pipelines.lint [DEBUG ] Running lint test: base_config +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,522] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,522] nf_core.pipelines.lint.configs [DEBUG ] found sections: [] +[2025-11-27 15:50:36,539] nf_core.pipelines.lint.configs [DEBUG ] found nf_files: ['main.nf', 'workflows/lrsomatic.nf', 'subworkflows/local/tumor_normal_happhase.nf', 'subworkflows/local/tumor_only_happhase.nf', 'subworkflows/local/prepare_annotation.nf', 'subworkflows/local/prepare_reference_files.nf', 'subworkflows/nf-core/utils_nfschema_plugin/main.nf', 'subworkflows/nf-core/bam_stats_samtools/main.nf', 'subworkflows/nf-core/utils_nextflow_pipeline/main.nf', 'subworkflows/nf-core/utils_nfcore_pipeline/main.nf', 'subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf', 'modules/nf-core/ascat/main.nf', 'modules/nf-core/mosdepth/main.nf', 'modules/nf-core/multiqc/main.nf', 'modules/nf-core/wget/main.nf', 'modules/nf-core/unzip/main.nf', 'modules/nf-core/untar/main.nf', 'modules/nf-core/severus/main.nf', 'modules/nf-core/minimap2/align/main.nf', 'modules/nf-core/minimap2/index/main.nf', 'modules/nf-core/bcftools/merge/main.nf', 'modules/nf-core/bcftools/sort/main.nf', 'modules/nf-core/bcftools/concat/main.nf', 'modules/nf-core/modkit/pileup/main.nf', 'modules/nf-core/samtools/idxstats/main.nf', 'modules/nf-core/samtools/faidx/main.nf', 'modules/nf-core/samtools/cat/main.nf', 'modules/nf-core/samtools/index/main.nf', 'modules/nf-core/samtools/stats/main.nf', 'modules/nf-core/samtools/flagstat/main.nf', 'modules/nf-core/longphase/haplotag/main.nf', 'modules/nf-core/longphase/phase/main.nf', 'modules/nf-core/ensemblvep/vep/main.nf', 'modules/nf-core/ensemblvep/download/main.nf', 'modules/nf-core/pigz/uncompress/main.nf', 'modules/local/wakhan/main.nf', 'modules/local/clairs/main.nf', 'modules/local/cramino/main.nf', 'modules/local/metaextract/main.nf', 'modules/local/clairsto/main.nf', 'modules/local/vcfsplit/main.nf', 'modules/local/clair3/main.nf', 'modules/local/fibertoolsrs/fire/main.nf', 'modules/local/fibertoolsrs/predictm6a/main.nf', 'modules/local/fibertoolsrs/qc/main.nf', 'modules/local/fibertoolsrs/nucleosomes/main.nf'] +[2025-11-27 15:50:36,539] nf_core.pipelines.lint [DEBUG ] Running lint test: modules_config +[2025-11-27 15:50:36,541] nf_core.utils [DEBUG ] Got '.' as path +[2025-11-27 15:50:36,541] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json +[2025-11-27 15:50:36,542] nf_core.utils [DEBUG ] Using config file: .nf-core.yml +[2025-11-27 15:50:36,542] nf_core.pipelines.lint.configs [DEBUG ] found sections: ['ENSEMBLVEP_DOWNLOAD'] +[2025-11-27 15:50:36,558] nf_core.pipelines.lint.configs [DEBUG ] found nf_files: ['main.nf', 'workflows/lrsomatic.nf', 'subworkflows/local/tumor_normal_happhase.nf', 'subworkflows/local/tumor_only_happhase.nf', 'subworkflows/local/prepare_annotation.nf', 'subworkflows/local/prepare_reference_files.nf', 'subworkflows/nf-core/utils_nfschema_plugin/main.nf', 'subworkflows/nf-core/bam_stats_samtools/main.nf', 'subworkflows/nf-core/utils_nextflow_pipeline/main.nf', 'subworkflows/nf-core/utils_nfcore_pipeline/main.nf', 'subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf', 'modules/nf-core/ascat/main.nf', 'modules/nf-core/mosdepth/main.nf', 'modules/nf-core/multiqc/main.nf', 'modules/nf-core/wget/main.nf', 'modules/nf-core/unzip/main.nf', 'modules/nf-core/untar/main.nf', 'modules/nf-core/severus/main.nf', 'modules/nf-core/minimap2/align/main.nf', 'modules/nf-core/minimap2/index/main.nf', 'modules/nf-core/bcftools/merge/main.nf', 'modules/nf-core/bcftools/sort/main.nf', 'modules/nf-core/bcftools/concat/main.nf', 'modules/nf-core/modkit/pileup/main.nf', 'modules/nf-core/samtools/idxstats/main.nf', 'modules/nf-core/samtools/faidx/main.nf', 'modules/nf-core/samtools/cat/main.nf', 'modules/nf-core/samtools/index/main.nf', 'modules/nf-core/samtools/stats/main.nf', 'modules/nf-core/samtools/flagstat/main.nf', 'modules/nf-core/longphase/haplotag/main.nf', 'modules/nf-core/longphase/phase/main.nf', 'modules/nf-core/ensemblvep/vep/main.nf', 'modules/nf-core/ensemblvep/download/main.nf', 'modules/nf-core/pigz/uncompress/main.nf', 'modules/local/wakhan/main.nf', 'modules/local/clairs/main.nf', 'modules/local/cramino/main.nf', 'modules/local/metaextract/main.nf', 'modules/local/clairsto/main.nf', 'modules/local/vcfsplit/main.nf', 'modules/local/clair3/main.nf', 'modules/local/fibertoolsrs/fire/main.nf', 'modules/local/fibertoolsrs/predictm6a/main.nf', 'modules/local/fibertoolsrs/qc/main.nf', 'modules/local/fibertoolsrs/nucleosomes/main.nf'] +[2025-11-27 15:50:36,559] nf_core.pipelines.lint [DEBUG ] Running lint test: nfcore_yml +[2025-11-27 15:50:36,563] nf_core.pipelines.lint [DEBUG ] Running lint test: rocrate_readme_sync +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_input': {}}, {'tumor_index': {}}, {'normal_input': {}}, {'normal_index': {}}, {'vcf': {}}, {'breakpoints': {}}], [{'meta2': {}}, {'reference': {}}]] +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 24 outputs in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'genes_genome_html': [[{'meta': {}}, {'*/*_genes_genome.html': {}}]], 'genes_genome_pdf': [[{'meta': {}}, {'*/*_genes_genome.pdf': {}}]], 'breakpoints_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.html': {}}]], 'breakpoints_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.pdf': {}}]], 'breakpoints_subclonal_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.html': {}}]], 'breakpoints_subclonal_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.pdf': {}}]], 'copynumbers_details_html': [[{'meta': {}}, {'*/*_genome_copynumbers_details.html': {}}]], 'copynumbers_details_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_details.pdf': {}}]], 'bed_files': [[{'meta': {}}, {'*/bed_output/*.bed': {}}]], 'variation_plots': [[{'meta': {}}, {'*/variation_plots/*.html': {}}]], 'vcf_files': [[{'meta': {}}, {'*/vcf_output/*_wakhan_cna_*.vcf': {}}]], 'heatmap_html': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html': {}}]], 'heatmap_pdf': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html.pdf': {}}]], 'optimized_peak_html': [[{'meta': {}}, {'*_optimized_peak.html': {}}]], 'coverage_csv': [[{'meta': {}}, {'coverage_data/*.csv': {}}]], 'coverage_plots_html': [[{'meta': {}}, {'coverage_plots/*.html': {}}]], 'coverage_plots_pdf': [[{'meta': {}}, {'coverage_plots/*.pdf': {}}]], 'phasing_html': [[{'meta': {}}, {'phasing_output/*.html': {}}]], 'phasing_pdf': [[{'meta': {}}, {'phasing_output/*.pdf': {}}]], 'rephased_vcf': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz': {}}]], 'rephased_vcf_index': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz.csi': {}}]], 'snps_loh_plot': [[{'meta': {}}, {'snps_loh_plots/*_genome_snps_ratio_loh.html': {}}]], 'solutions_ranks': [[{'meta': {}}, {'solutions_ranks.tsv': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html + tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints.pdf") , emit: breakpoints_pdf + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.html") , emit: breakpoints_subclonal_html + tuple val(meta), path("*/*_genome_copynumbers_breakpoints_subclonal.pdf") , emit: breakpoints_subclonal_pdf + tuple val(meta), path("*/*_genome_copynumbers_details.html") , emit: copynumbers_details_html + tuple val(meta), path("*/*_genome_copynumbers_details.pdf") , emit: copynumbers_details_pdf + tuple val(meta), path("*/bed_output/*.bed") , emit: bed_files + tuple val(meta), path("*/variation_plots/*.html") , emit: variation_plots + tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files + tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html + tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf + tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html + tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf + tuple val(meta), path("phasing_output/*.html") , emit: phasing_html + tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true + tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/wakhan/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'normal_bam': {}}, {'normal_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcfs': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairs/main.nf +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.txt"), emit: txt + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/cramino/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'meta_ext': [[{'meta': {}}, {'basecall_model': {}}, {'kinetics': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/metaextract/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 7 inputs in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}], {'dbSNP': {}}, {'colors': {}}, {'onekgenomes': {}}, {'gnomad': {}}] +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'indel_vcf': [[{'meta': {}}, {'indel.vcf.gz': {}}]], 'indel_tbi': [[{'meta': {}}, {'indel.vcf.gz.tbi': {}}]], 'snv_vcf': [[{'meta': {}}, {'snv.vcf.gz': {}}]], 'snv_tbi': [[{'meta': {}}, {'snv.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairsto/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/fire/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/predictm6a/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.txt"), emit: qc_txt + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'qc_txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.txt"), emit: qc_txt + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/qc/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + // TODO nf-core: Named file extensions MUST be emitted for ALL output channels + tuple val(meta), path("*.bam"), emit: bam + // TODO nf-core: List additional required output channels/values here + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/nucleosomes/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'snv_vcf': {}}, {'indel_vcf': {}}]] +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi + + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'somatic_vcf': [[{'meta': {}}, {'*somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'*somatic.vcf.gz.tbi': {}}]], 'germline_vcf': [[{'meta': {}}, {'*germline.vcf.gz': {}}]], 'germline_tbi': [[{'meta': {}}, {'*germline.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf + tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi + tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf + tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi + + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/vcfsplit/main.nf +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'model': {}}, {'platform': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*merge_output.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*merge_output.vcf.gz.tbi': {}}]], 'phased_vcf': [[{'meta': {}}, {'*phased_merge_output.vcf.gz': {}}]], 'phased_tbi': [[{'meta': {}}, {'*phased_merge_output.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clair3/main.nf +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 8 inputs in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_normal': {}}, {'index_normal': {}}, {'input_tumor': {}}, {'index_tumor': {}}], {'genomeVersion': {}}, {'allele_files': {}}, {'loci_files': {}}, {'bed_file': {}}, {'fasta': {}}, {'gc_file': {}}, {'rt_file': {}}] +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 11 outputs in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'allelefreqs': [[{'meta': {}}, {'*alleleFrequencies_chr*.txt': {}}]], 'bafs': [[{'meta': {}}, {'*BAF.txt': {}}]], 'cnvs': [[{'meta': {}}, {'*cnvs.txt': {}}]], 'logrs': [[{'meta': {}}, {'*LogR.txt': {}}]], 'metrics': [[{'meta': {}}, {'*metrics.txt': {}}]], 'png': [[{'meta': {}}, {'*png': {}}]], 'pdf': [[{'meta': {}}, {'*pdf': {}}]], 'purityploidy': [[{'meta': {}}, {'*purityploidy.txt': {}}]], 'segments': [[{'meta': {}}, {'*segments.txt': {}}]], 'segments_raw': [[{'meta': {}}, {'*segments_raw.txt': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ascat/main.nf +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:36,574] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:36,575] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,839] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,851] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:36,851] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:36,852] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:36,852] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,884] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,887] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ascat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,888] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ascat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:36,986] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,056] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ascat/main.nf +[2025-11-27 15:50:37,056] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbi': {}}]] +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'${prefix}.${extension}': {}}]], 'tbi': [[{'meta': {}}, {'${prefix}.${extension}.tbi': {}}]], 'csi': [[{'meta': {}}, {'${prefix}.${extension}.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/concat/main.nf +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:37,057] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:37,058] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,092] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:37,103] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:37,104] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,135] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,138] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/concat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,139] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/concat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,225] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,309] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:37,310] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,343] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:37,353] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:37,354] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:37,354] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:37,354] git.cmd [DEBUG ] Popen(['git', 'checkout', 'e753770db613ce014b3c4bc94f6cba443427b726'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,018] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 4 inputs in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbis': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}], [{'meta4': {}}, {'bed': {}}]] +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{bcf,vcf}{,.gz}': {}}]], 'index': [[{'meta': {}}, {'*.{csi,tbi}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/merge/main.nf +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:38,213] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:38,213] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,275] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,286] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:38,287] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:38,287] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:38,288] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,346] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,350] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/merge'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,351] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/merge'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,436] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,518] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:38,518] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,566] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:38,578] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:38,579] git.cmd [DEBUG ] Popen(['git', 'checkout', 'f17049e03697726ace7499d2fe342f892594f6f3'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:42,382] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}]] +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{vcf,vcf.gz,bcf,bcf.gz}': {}}]], 'tbi': [[{'meta': {}}, {'*.tbi': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:45,573] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:45,574] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,713] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:45,727] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:45,728] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,865] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,868] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/bcftools/sort'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,869] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/bcftools/sort'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:45,959] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,043] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/bcftools/sort/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'assembly': {}}, {'species': {}}, {'cache_version': {}}]] +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Outputs: {'cache': [[{'meta': {}}, {'prefix': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path(prefix), emit: cache + path "versions.yml", emit: versions + + +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/download/main.nf +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:46,044] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:46,045] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,151] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:46,164] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:46,165] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,208] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,212] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ensemblvep/download'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,213] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ensemblvep/download'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,324] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,402] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:46,402] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,455] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:46,467] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:46,468] git.cmd [DEBUG ] Popen(['git', 'checkout', '2fcc53751152a999bfc9c24f75f494b9e5bb338f'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:49,974] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 9 inputs in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}, {'custom_extra_files': {}}], {'genome': {}}, {'species': {}}, {'cache_version': {}}, {'cache': {}}, [{'meta2': {}}, {'fasta': {}}], {'extra_files': {}}, {'custom_vep': {}}, {'custom_vep_tbi': {}}] +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 6 outputs in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'tab': [[{'meta': {}}, {'*.tab.gz': {}}]], 'json': [[{'meta': {}}, {'*.json.gz': {}}]], 'report': [{'*.html': {}}], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.tab.gz"), emit: tab, optional: true + tuple val(meta), path("*.json.gz"), emit: json, optional: true + path "*.html", emit: report, optional: true + path "versions.yml", emit: versions + + +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:53,302] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:53,303] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,408] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:53,420] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:53,421] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,518] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,522] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/ensemblvep/vep'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,523] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/ensemblvep/vep'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,631] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,709] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ensemblvep/vep/main.nf +[2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.{bam,cram}': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/haplotag/main.nf +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:50:53,710] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:53,711] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,792] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,804] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:53,805] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:53,806] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:53,806] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,874] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,878] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/longphase/haplotag'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,879] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/longphase/haplotag'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:53,991] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,094] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:50:54,095] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,185] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:54,199] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:50:54,199] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:50:54,200] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:50:54,200] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:50:58,312] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:02,039] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:02,040] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,408] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,419] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:02,419] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:02,420] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:02,421] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,475] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,478] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/longphase/phase'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,479] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/longphase/phase'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,590] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,695] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/longphase/phase/main.nf +[2025-11-27 15:51:02,695] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:02,696] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,749] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:02,761] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:02,762] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:05,703] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'reads': {}}], [{'meta2': {}}, {'reference': {}}], {'bam_format': {}}, {'bam_index_extension': {}}, {'cigar_paf_format': {}}, {'cigar_bam': {}}] +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Outputs: {'paf': [[{'meta': {}}, {'*.paf': {}}]], 'bam': [[{'meta': {}}, {'*.bam': {}}]], 'index': [[{'meta': {}}, {'*.bam.${bam_index_extension}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.paf") , optional: true, emit: paf + tuple val(meta), path("*.bam") , optional: true, emit: bam + tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:09,496] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:09,497] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,655] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:09,667] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:09,668] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,808] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,812] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/minimap2/align'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,813] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/minimap2/align'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:09,901] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,040] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/minimap2/align/main.nf +[2025-11-27 15:51:10,041] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:10,041] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,141] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:10,153] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:10,153] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:10,154] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:10,154] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:13,177] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}]] +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Outputs: {'index': [[{'meta': {}}, {'*.mmi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.mmi"), emit: index + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/index/main.nf +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:16,904] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:16,905] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,209] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,221] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:17,221] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:17,222] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:17,222] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,280] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,284] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/minimap2/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,285] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/minimap2/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,372] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,510] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:17,510] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,570] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:17,582] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:17,583] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:17,583] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:17,583] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:20,761] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,622] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}], [{'meta2': {}}, {'fasta': {}}, {'fai': {}}], [{'meta3': {}}, {'bed': {}}]] +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bed': [[{'meta': {}}, {'*.bed': {}}]], 'bedgraph': [[{'meta': {}}, {'*.bedgraph': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.bed") , emit: bed , optional: true + tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.log") , emit: log , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/modkit/pileup/main.nf +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:24,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:24,624] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,815] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,826] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:24,827] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:24,827] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:24,828] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:24,997] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,000] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/modkit/pileup'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,002] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/modkit/pileup'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,119] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,234] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:25,235] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,374] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:25,386] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:25,387] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:28,381] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'bed': {}}], [{'meta2': {}}, {'fasta': {}}]] +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 13 outputs in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Outputs: {'global_txt': [[{'meta': {}}, {'*.global.dist.txt': {}}]], 'summary_txt': [[{'meta': {}}, {'*.summary.txt': {}}]], 'regions_txt': [[{'meta': {}}, {'*.region.dist.txt': {}}]], 'per_base_d4': [[{'meta': {}}, {'*.per-base.d4': {}}]], 'per_base_bed': [[{'meta': {}}, {'*.per-base.bed.gz': {}}]], 'per_base_csi': [[{'meta': {}}, {'*.per-base.bed.gz.csi': {}}]], 'regions_bed': [[{'meta': {}}, {'*.regions.bed.gz': {}}]], 'regions_csi': [[{'meta': {}}, {'*.regions.bed.gz.csi': {}}]], 'quantized_bed': [[{'meta': {}}, {'*.quantized.bed.gz': {}}]], 'quantized_csi': [[{'meta': {}}, {'*.quantized.bed.gz.csi': {}}]], 'thresholds_bed': [[{'meta': {}}, {'*.thresholds.bed.gz': {}}]], 'thresholds_csi': [[{'meta': {}}, {'*.thresholds.bed.gz.csi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path('*.global.dist.txt') , emit: global_txt + tuple val(meta), path('*.summary.txt') , emit: summary_txt + tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt + tuple val(meta), path('*.per-base.d4') , optional:true, emit: per_base_d4 + tuple val(meta), path('*.per-base.bed.gz') , optional:true, emit: per_base_bed + tuple val(meta), path('*.per-base.bed.gz.csi') , optional:true, emit: per_base_csi + tuple val(meta), path('*.regions.bed.gz') , optional:true, emit: regions_bed + tuple val(meta), path('*.regions.bed.gz.csi') , optional:true, emit: regions_csi + tuple val(meta), path('*.quantized.bed.gz') , optional:true, emit: quantized_bed + tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi + tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed + tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/mosdepth/main.nf +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:32,190] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:32,191] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,284] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,295] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:32,296] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:32,297] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:32,298] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,363] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,367] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/mosdepth'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,368] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/mosdepth'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,456] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,599] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:32,600] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,663] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:32,674] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:32,675] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:32,675] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:32,675] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:35,682] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Inputs: [{'multiqc_files': {}}, {'multiqc_config': {}}, {'extra_multiqc_config': {}}, {'multiqc_logo': {}}, {'replace_names': {}}, {'sample_names': {}}] +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found output_data: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Outputs: {'report': [{'*multiqc_report.html': {}}], 'data': [{'*_data': {}}], 'plots': [{'*_plots': {}}], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Output data: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/multiqc/main.nf +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:39,445] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:39,446] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,663] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,675] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:39,675] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:39,676] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:39,677] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,806] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,810] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/multiqc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,811] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/multiqc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:39,903] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,049] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:40,050] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,147] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:40,160] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:40,160] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:40,161] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:40,161] git.cmd [DEBUG ] Popen(['git', 'checkout', 'a4488d3d09244f29fb4606ba4eef85d59dcc6ad8'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:43,079] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,118] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'zip': {}}]] +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Outputs: {'file': [[{'meta': {}}, {'${uncompressed_filename}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${uncompressed_filename}") , emit: file + path "versions.yml" , emit: versions + + +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/pigz/uncompress/main.nf +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:46,119] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:46,120] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,170] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,183] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:46,184] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:46,184] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:46,185] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,235] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,239] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/pigz/uncompress'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,240] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/pigz/uncompress'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,362] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,485] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:46,486] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,557] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:46,569] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:46,570] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:49,638] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_files': {}}]] +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'${prefix}.bam': {}}]], 'cram': [[{'meta': {}}, {'${prefix}.cram': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram + path "versions.yml" , emit: versions + + + +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/cat/main.nf +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:51:53,446] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:53,447] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,665] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,676] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:53,676] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:53,677] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:53,678] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,816] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,820] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/cat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,821] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/cat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:53,937] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,075] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:51:54,076] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,183] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:54,194] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:51:54,195] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:51:54,195] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:51:54,195] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:51:57,097] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}], [{'meta2': {}}, {'fai': {}}], {'get_sizes': {}}] +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Outputs: {'fa': [[{'meta': {}}, {'*.{fa,fasta}': {}}]], 'sizes': [[{'meta': {}}, {'*.sizes': {}}]], 'fai': [[{'meta': {}}, {'*.fai': {}}]], 'gzi': [[{'meta': {}}, {'*.gzi': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true + tuple val(meta), path ("*.sizes") , emit: sizes, optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/faidx/main.nf +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:00,645] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:00,646] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,838] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:00,851] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:00,852] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,041] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,045] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/faidx'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,046] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/faidx'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,137] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,305] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:01,306] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,372] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:01,385] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:01,385] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:01,386] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:01,386] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:04,805] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Outputs: {'flagstat': [[{'meta': {}}, {'*.flagstat': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/flagstat/main.nf +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:08,779] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:08,780] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,027] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,038] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:09,038] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:09,039] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:09,040] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,096] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,100] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/flagstat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,101] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/flagstat'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,188] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,355] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:09,356] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,413] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:09,426] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:09,426] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:12,547] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'idxstats': [[{'meta': {}}, {'*.idxstats': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/idxstats/main.nf +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:16,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:16,623] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,766] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,778] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:16,778] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:16,779] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:16,779] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,892] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,896] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/idxstats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,897] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/idxstats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:16,985] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,153] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:17,154] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,256] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:17,268] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:17,268] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:17,269] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:17,269] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:20,320] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}]] +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bai': [[{'meta': {}}, {'*.bai': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'crai': [[{'meta': {}}, {'*.crai': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/index/main.nf +[2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:23,974] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:23,974] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,244] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,256] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:24,256] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:24,257] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:24,257] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,308] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,312] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,313] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/index'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,401] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,568] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:24,569] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,620] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:24,631] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:24,632] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:24,632] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:24,632] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:27,563] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}, {'input_index': {}}], [{'meta2': {}}, {'fasta': {}}]] +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Outputs: {'stats': [[{'meta': {}}, {'*.stats': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:31,361] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:31,362] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,494] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,506] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:31,507] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:31,507] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:31,508] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,610] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,614] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/samtools/stats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,615] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/samtools/stats'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,702] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,878] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/samtools/stats/main.nf +[2025-11-27 15:52:31,878] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:31,879] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,963] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:31,975] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:31,976] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:31,976] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:31,976] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:34,930] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'target_input': {}}, {'target_index': {}}, {'control_input': {}}, {'control_index': {}}, {'vcf': {}}, {'tbi': {}}], [{'meta2': {}}, {'bed': {}}, {'pon_path': {}}]] +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 18 outputs in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Outputs: {'log': [[{'meta': {}}, {'severus.log': {}}]], 'read_qual': [[{'meta': {}}, {'read_qual.txt': {}}]], 'breakpoints_double': [[{'meta': {}}, {'breakpoints_double.csv': {}}]], 'read_alignments': [[{'meta': {}}, {'read_alignments': {}}]], 'read_ids': [[{'meta': {}}, {'read_ids.csv': {}}]], 'collapsed_dup': [[{'meta': {}}, {'severus_collaped_dup.bed': {}}]], 'loh': [[{'meta': {}}, {'severus_LOH.bed': {}}]], 'all_vcf': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz': {}}]], 'all_tbi': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz.tbi': {}}]], 'all_breakpoints_clusters_list': [[{'meta': {}}, {'all_SVs/breakpoint_clusters_list.tsv': {}}]], 'all_breakpoints_clusters': [[{'meta': {}}, {'all_SVs/breakpoint_clusters.tsv': {}}]], 'all_plots': [[{'meta': {}}, {'all_SVs/plots/severus_*.html': {}}]], 'somatic_vcf': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz.tbi': {}}]], 'somatic_breakpoints_clusters_list': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters_list.tsv': {}}]], 'somatic_breakpoints_clusters': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters.tsv': {}}]], 'somatic_plots': [[{'meta': {}}, {'somatic_SVs/plots/severus_*.html': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions + + +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/severus/main.nf +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:38,674] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:38,674] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,880] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:38,892] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:38,892] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:38,893] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:38,893] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,092] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,096] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/severus'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,097] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/severus'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,214] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,367] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/severus/main.nf +[2025-11-27 15:52:39,367] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:39,368] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,435] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:39,448] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:39,448] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:39,449] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:39,449] git.cmd [DEBUG ] Popen(['git', 'checkout', '81880787133db07d9b4c1febd152c090eb8325dc'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:49,232] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Outputs: {'untar': [[{'meta': {}}, {'${prefix}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}"), emit: untar + path "versions.yml", emit: versions + + +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/untar/main.nf +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:52:57,845] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:57,845] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,185] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,197] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:58,198] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:58,198] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:58,199] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,243] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,246] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/untar'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,247] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/untar'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,344] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,548] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:52:58,549] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,620] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:52:58,633] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:52:58,633] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:52:58,634] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:52:58,634] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:01,667] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Outputs: {'unzipped_archive': [[{'meta': {}}, {'${prefix}/': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/unzip/main.nf +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:53:05,410] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:05,411] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,637] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:05,649] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:05,650] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,794] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,798] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/unzip'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,799] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/unzip'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:05,893] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,081] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:06,082] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,193] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:06,205] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:06,205] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:06,206] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:06,206] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:09,447] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'url': {}}]] +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found output_data: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Outputs: {'outfile': [[{'meta': {}}, {'${prefix}.${suffix}': {}}]], 'versions': [{'versions.yml': {}}]} +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Output data: + tuple val(meta), path("${prefix}.${suffix}"), emit: outfile + path "versions.yml" , emit: versions + + +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/wget/main.nf +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Topics: {} +[2025-11-27 15:53:13,328] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:13,328] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,447] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,458] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:13,459] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:13,459] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:13,460] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,563] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,567] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/nf-core/wget'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,568] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'modules/wget'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,684] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,841] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:13,842] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,932] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:13,943] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:13,944] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:13,944] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:13,944] git.cmd [DEBUG ] Popen(['git', 'checkout', '41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:16,975] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,106] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:21,107] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,393] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:21,417] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:21,418] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:21,418] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:21,420] git.cmd [DEBUG ] Popen(['git', 'checkout', '05954dab2ff481bcb999f24455da29a5828af08d'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:27,600] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,141] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:38,142] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,286] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:38,298] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:38,299] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,354] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,358] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/bam_stats_samtools'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,372] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,458] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:53:38,459] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,517] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:38,528] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:53:38,529] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:53:38,529] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:53:38,530] git.cmd [DEBUG ] Popen(['git', 'checkout', 'c2b22d85f30a706a3073387f30380704fcae013b'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:53:51,273] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:04,283] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:04,285] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,104] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,146] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:05,149] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:05,150] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:05,154] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,466] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,484] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nextflow_pipeline'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,611] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,766] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:05,768] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:05,968] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:06,009] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:06,011] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:06,012] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:06,013] git.cmd [DEBUG ] Popen(['git', 'checkout', '51ae5406a030d4da1e49e4dab49756844fdd6c7a'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:43,965] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,578] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:57,578] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,881] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:57,895] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:57,895] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:57,896] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:57,897] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,070] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,074] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nfcore_pipeline'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,084] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,172] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:54:58,173] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,226] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:54:58,240] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:54:58,241] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:54:58,241] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:54:58,241] git.cmd [DEBUG ] Popen(['git', 'checkout', '2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:06,742] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,344] git.util [DEBUG ] sys.platform='linux', git_executable='git' +[2025-11-27 15:55:16,344] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,558] git.cmd [DEBUG ] Popen(['git', 'merge', 'origin/master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,572] nf_core.utils [DEBUG ] Got '/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules' as path +[2025-11-27 15:55:16,573] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-9f4bce35ba6f9f759cbf54fa7.json +[2025-11-27 15:55:16,573] nf_core.utils [DEBUG ] Using config file: /user/leuven/351/vsc35115/.config/nfcore/nf-core/modules/.nf-core.yml +[2025-11-27 15:55:16,574] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,711] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch-check'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,716] git.cmd [DEBUG ] Popen(['git', 'rev-list', '0d75d9a1f328368e06ccc5474cd5553a51672979', '--', 'subworkflows/nf-core/utils_nfschema_plugin'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,727] git.cmd [DEBUG ] Popen(['git', 'cat-file', '--batch'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=, shell=False, universal_newlines=False) +[2025-11-27 15:55:16,820] nf_core.pipelines.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,821] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,821] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,822] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,823] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,824] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,825] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,826] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,827] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,828] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,829] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,830] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,831] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,832] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,833] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,834] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,835] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,836] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,839] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,840] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,841] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,842] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,843] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,844] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,845] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,846] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,847] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,848] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,849] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,850] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,851] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,852] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,853] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,854] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,855] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,856] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,857] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,858] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,859] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,860] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,861] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,862] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,863] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,864] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,865] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,866] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,867] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,868] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,869] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,870] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,871] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,872] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,873] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,874] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,875] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,876] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,877] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,878] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,879] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,880] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,881] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,882] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,883] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,884] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,885] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,886] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,887] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,888] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,889] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,890] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,891] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,892] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,893] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,894] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,895] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,896] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,897] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,898] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,899] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,900] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,901] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,902] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,903] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,904] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,905] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,906] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,907] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,908] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,909] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,910] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,911] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,912] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,913] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,914] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,915] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,916] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,917] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,918] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,919] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,920] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,921] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,922] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,923] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,924] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,925] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,926] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,927] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,947] nf_core.components.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,948] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,948] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,949] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,950] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,951] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,952] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,953] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,954] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,955] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,956] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,957] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,958] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,959] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,960] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,968] nf_core.components.lint [DEBUG ] Printing final results +[2025-11-27 15:55:16,969] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,969] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,970] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,971] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,972] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,973] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,974] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,975] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,976] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,977] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,978] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,979] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,980] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,981] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,982] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,983] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,984] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,985] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,986] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,987] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,988] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,989] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,990] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,991] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,992] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.code [DEBUG ] entering code: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.fence [DEBUG ] entering fence: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.blockquote [DEBUG ] entering blockquote: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.hr [DEBUG ] entering hr: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.list [DEBUG ] entering list: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.reference [DEBUG ] entering reference: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.html_block [DEBUG ] entering html_block: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.heading [DEBUG ] entering heading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.lheading [DEBUG ] entering lheading: StateBlock(line=0,level=0,tokens=0), 0, 1, False +[2025-11-27 15:55:16,993] markdown_it.rules_block.paragraph [DEBUG ] entering paragraph: StateBlock(line=0,level=0,tokens=0), 0, 1, False diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 678f1cd6..923c22a5 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -55,7 +55,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } - + normal_bams_model .combine(downloaded_model_files,by:0) @@ -114,7 +114,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, vcf, svs, mods] } .set{ normal_bams_germlinevcf } - + // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -281,7 +281,7 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIRS.out.vcfs .join(CLAIRS.out.tbi) .set{clairs_out} - + BCFTOOLS_CONCAT( clairs_out ) From ca04e17373a001f30a6758f18c18acf73f93f191 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 16:01:26 +0100 Subject: [PATCH 540/557] fix log --- lint_log.txt | 284 +++++++++++++++++++++++++-------------------------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/lint_log.txt b/lint_log.txt index 5e087cd0..366aea19 100644 --- a/lint_log.txt +++ b/lint_log.txt @@ -17,7 +17,7 @@ [2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json [2025-11-27 15:47:40,379] nf_core.utils [DEBUG ] Using config file: .nf-core.yml [2025-11-27 15:47:41,648] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: - + modules.json @@ -34,7 +34,7 @@ modules.json [2025-11-27 15:47:41,727] nf_core.utils [DEBUG ] Found a config cache, loading: /user/leuven/351/vsc35115/.nextflow/nf-core/wf-config-cache-1e87c6c5537e627bca015c3d8.json [2025-11-27 15:47:41,728] nf_core.utils [DEBUG ] Using config file: .nf-core.yml [2025-11-27 15:47:42,155] nf_core.pipelines.lint_utils [DEBUG ] The following files were modified by prettier: - + modules.json @@ -130,7 +130,7 @@ modules.json [2025-11-27 15:50:36,563] nf_core.pipelines.lint [DEBUG ] Running lint test: rocrate_readme_sync [2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/local/wakhan/main.nf [2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_input': {}}, {'tumor_index': {}}, {'normal_input': {}}, {'normal_index': {}}, {'vcf': {}}, {'breakpoints': {}}], [{'meta2': {}}, {'reference': {}}]] -[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,566] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html @@ -156,10 +156,10 @@ modules.json tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 24 outputs in modules/local/wakhan/main.nf [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'genes_genome_html': [[{'meta': {}}, {'*/*_genes_genome.html': {}}]], 'genes_genome_pdf': [[{'meta': {}}, {'*/*_genes_genome.pdf': {}}]], 'breakpoints_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.html': {}}]], 'breakpoints_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints.pdf': {}}]], 'breakpoints_subclonal_html': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.html': {}}]], 'breakpoints_subclonal_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_breakpoints_subclonal.pdf': {}}]], 'copynumbers_details_html': [[{'meta': {}}, {'*/*_genome_copynumbers_details.html': {}}]], 'copynumbers_details_pdf': [[{'meta': {}}, {'*/*_genome_copynumbers_details.pdf': {}}]], 'bed_files': [[{'meta': {}}, {'*/bed_output/*.bed': {}}]], 'variation_plots': [[{'meta': {}}, {'*/variation_plots/*.html': {}}]], 'vcf_files': [[{'meta': {}}, {'*/vcf_output/*_wakhan_cna_*.vcf': {}}]], 'heatmap_html': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html': {}}]], 'heatmap_pdf': [[{'meta': {}}, {'*_heatmap_ploidy_purity.html.pdf': {}}]], 'optimized_peak_html': [[{'meta': {}}, {'*_optimized_peak.html': {}}]], 'coverage_csv': [[{'meta': {}}, {'coverage_data/*.csv': {}}]], 'coverage_plots_html': [[{'meta': {}}, {'coverage_plots/*.html': {}}]], 'coverage_plots_pdf': [[{'meta': {}}, {'coverage_plots/*.pdf': {}}]], 'phasing_html': [[{'meta': {}}, {'phasing_output/*.html': {}}]], 'phasing_pdf': [[{'meta': {}}, {'phasing_output/*.pdf': {}}]], 'rephased_vcf': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz': {}}]], 'rephased_vcf_index': [[{'meta': {}}, {'phasing_output/*.rephased.vcf.gz.csi': {}}]], 'snps_loh_plot': [[{'meta': {}}, {'snps_loh_plots/*_genome_snps_ratio_loh.html': {}}]], 'solutions_ranks': [[{'meta': {}}, {'solutions_ranks.tsv': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html tuple val(meta), path("*/*_genes_genome.pdf") , emit: genes_genome_pdf tuple val(meta), path("*/*_genome_copynumbers_breakpoints.html") , emit: breakpoints_html @@ -185,164 +185,164 @@ modules.json tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/wakhan/main.nf [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clairs/main.nf [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'normal_bam': {}}, {'normal_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] -[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.vcf.gz"), emit: vcfs tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi path "versions.yml", emit: versions - + [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/local/clairs/main.nf [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcfs': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.vcf.gz"), emit: vcfs tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi path "versions.yml", emit: versions - + [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairs/main.nf [2025-11-27 15:50:36,567] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/cramino/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.txt"), emit: txt path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/cramino/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.txt"), emit: txt path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/cramino/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/metaextract/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/metaextract/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'meta_ext': [[{'meta': {}}, {'basecall_model': {}}, {'kinetics': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/metaextract/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 7 inputs in modules/local/clairsto/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'tumor_bam': {}}, {'tumor_bai': {}}, {'model': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}], {'dbSNP': {}}, {'colors': {}}, {'onekgenomes': {}}, {'gnomad': {}}] -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi path "versions.yml", emit: versions - + [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clairsto/main.nf [2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Outputs: {'indel_vcf': [[{'meta': {}}, {'indel.vcf.gz': {}}]], 'indel_tbi': [[{'meta': {}}, {'indel.vcf.gz.tbi': {}}]], 'snv_vcf': [[{'meta': {}}, {'snv.vcf.gz': {}}]], 'snv_tbi': [[{'meta': {}}, {'snv.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,568] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi path "versions.yml", emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clairsto/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/fire/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/fire/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/fire/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/predictm6a/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/predictm6a/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Output data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/predictm6a/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/qc/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found output_data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.txt"), emit: qc_txt // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/qc/main.nf [2025-11-27 15:50:36,569] nf_core.components.nfcore_component [DEBUG ] Outputs: {'qc_txt': [[{'meta': {}}, {'*.txt': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.txt"), emit: qc_txt // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/qc/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/fibertoolsrs/nucleosomes/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}]] -[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/local/fibertoolsrs/nucleosomes/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.bam': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam // TODO nf-core: List additional required output channels/values here path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/fibertoolsrs/nucleosomes/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/local/vcfsplit/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'snv_vcf': {}}, {'indel_vcf': {}}]] -[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf @@ -350,10 +350,10 @@ modules.json path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/vcfsplit/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Outputs: {'somatic_vcf': [[{'meta': {}}, {'*somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'*somatic.vcf.gz.tbi': {}}]], 'germline_vcf': [[{'meta': {}}, {'*germline.vcf.gz': {}}]], 'germline_tbi': [[{'meta': {}}, {'*germline.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*somatic.vcf.gz") , emit: somatic_vcf tuple val(meta), path("*somatic.vcf.gz.tbi") , emit: somatic_tbi tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf @@ -361,34 +361,34 @@ modules.json path "versions.yml" , emit: versions - + [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/vcfsplit/main.nf [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,570] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/local/clair3/main.nf [2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'model': {}}, {'platform': {}}], [{'meta2': {}}, {'reference': {}}], [{'meta3': {}}, {'index': {}}]] -[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/local/clair3/main.nf [2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*merge_output.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*merge_output.vcf.gz.tbi': {}}]], 'phased_vcf': [[{'meta': {}}, {'*phased_merge_output.vcf.gz': {}}]], 'phased_tbi': [[{'meta': {}}, {'*phased_merge_output.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/local/clair3/main.nf [2025-11-27 15:50:36,571] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 8 inputs in modules/nf-core/ascat/main.nf [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_normal': {}}, {'index_normal': {}}, {'input_tumor': {}}, {'index_tumor': {}}], {'genomeVersion': {}}, {'allele_files': {}}, {'loci_files': {}}, {'bed_file': {}}, {'fasta': {}}, {'gc_file': {}}, {'rt_file': {}}] -[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs tuple val(meta), path("*BAF.txt"), emit: bafs tuple val(meta), path("*cnvs.txt"), emit: cnvs @@ -401,10 +401,10 @@ modules.json tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 11 outputs in modules/nf-core/ascat/main.nf [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'allelefreqs': [[{'meta': {}}, {'*alleleFrequencies_chr*.txt': {}}]], 'bafs': [[{'meta': {}}, {'*BAF.txt': {}}]], 'cnvs': [[{'meta': {}}, {'*cnvs.txt': {}}]], 'logrs': [[{'meta': {}}, {'*LogR.txt': {}}]], 'metrics': [[{'meta': {}}, {'*metrics.txt': {}}]], 'png': [[{'meta': {}}, {'*png': {}}]], 'pdf': [[{'meta': {}}, {'*pdf': {}}]], 'purityploidy': [[{'meta': {}}, {'*purityploidy.txt': {}}]], 'segments': [[{'meta': {}}, {'*segments.txt': {}}]], 'segments_raw': [[{'meta': {}}, {'*segments_raw.txt': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs tuple val(meta), path("*BAF.txt"), emit: bafs tuple val(meta), path("*cnvs.txt"), emit: cnvs @@ -417,7 +417,7 @@ modules.json tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ascat/main.nf [2025-11-27 15:50:36,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:36,574] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -434,22 +434,22 @@ modules.json [2025-11-27 15:50:37,056] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ascat/main.nf [2025-11-27 15:50:37,056] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/concat/main.nf [2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbi': {}}]] -[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${prefix}.${extension}") , emit: vcf tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/concat/main.nf [2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'${prefix}.${extension}': {}}]], 'tbi': [[{'meta': {}}, {'${prefix}.${extension}.tbi': {}}]], 'csi': [[{'meta': {}}, {'${prefix}.${extension}.csi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${prefix}.${extension}") , emit: vcf tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/concat/main.nf [2025-11-27 15:50:37,057] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:37,057] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -473,20 +473,20 @@ modules.json [2025-11-27 15:50:38,018] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 4 inputs in modules/nf-core/bcftools/merge/main.nf [2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcfs': {}}, {'tbis': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}], [{'meta4': {}}, {'bed': {}}]] -[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:38,212] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/bcftools/merge/main.nf [2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{bcf,vcf}{,.gz}': {}}]], 'index': [[{'meta': {}}, {'*.{csi,tbi}': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/merge/main.nf [2025-11-27 15:50:38,213] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:38,213] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -510,22 +510,22 @@ modules.json [2025-11-27 15:50:42,382] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/bcftools/sort/main.nf [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}]] -[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf tuple val(meta), path("*.tbi") , emit: tbi, optional: true tuple val(meta), path("*.csi") , emit: csi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/bcftools/sort/main.nf [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.{vcf,vcf.gz,bcf,bcf.gz}': {}}]], 'tbi': [[{'meta': {}}, {'*.tbi': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf tuple val(meta), path("*.tbi") , emit: tbi, optional: true tuple val(meta), path("*.csi") , emit: csi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/bcftools/sort/main.nf [2025-11-27 15:50:45,573] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:45,573] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -542,18 +542,18 @@ modules.json [2025-11-27 15:50:46,043] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/bcftools/sort/main.nf [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/ensemblvep/download/main.nf [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'assembly': {}}, {'species': {}}, {'cache_version': {}}]] -[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path(prefix), emit: cache path "versions.yml", emit: versions - + [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/ensemblvep/download/main.nf [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Outputs: {'cache': [[{'meta': {}}, {'prefix': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path(prefix), emit: cache path "versions.yml", emit: versions - + [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/download/main.nf [2025-11-27 15:50:46,044] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:46,044] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -577,7 +577,7 @@ modules.json [2025-11-27 15:50:49,974] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 9 inputs in modules/nf-core/ensemblvep/vep/main.nf [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'vcf': {}}, {'custom_extra_files': {}}], {'genome': {}}, {'species': {}}, {'cache_version': {}}, {'cache': {}}, [{'meta2': {}}, {'fasta': {}}], {'extra_files': {}}, {'custom_vep': {}}, {'custom_vep_tbi': {}}] -[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true tuple val(meta), path("*.tab.gz"), emit: tab, optional: true @@ -585,10 +585,10 @@ modules.json path "*.html", emit: report, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 6 outputs in modules/nf-core/ensemblvep/vep/main.nf [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'tab': [[{'meta': {}}, {'*.tab.gz': {}}]], 'json': [[{'meta': {}}, {'*.json.gz': {}}]], 'report': [{'*.html': {}}], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true tuple val(meta), path("*.tab.gz"), emit: tab, optional: true @@ -596,7 +596,7 @@ modules.json path "*.html", emit: report, optional: true path "versions.yml", emit: versions - + [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/ensemblvep/vep/main.nf [2025-11-27 15:50:53,302] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:53,302] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -613,20 +613,20 @@ modules.json [2025-11-27 15:50:53,709] nf_core.components.components_differ [DEBUG ] Applying patch to modules/nf-core/ensemblvep/vep/main.nf [2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/haplotag/main.nf [2025-11-27 15:50:53,709] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] -[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/haplotag/main.nf [2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'*.{bam,cram}': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/haplotag/main.nf [2025-11-27 15:50:53,710] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:50:53,710] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -650,20 +650,20 @@ modules.json [2025-11-27 15:50:58,312] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/longphase/phase/main.nf [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'snps': {}}, {'svs': {}}, {'mods': {}}], [{'meta2': {}}, {'fasta': {}}], [{'meta3': {}}, {'fai': {}}]] -[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.vcf.gz") , emit: vcf tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi path "versions.yml" , emit: versions - + [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/longphase/phase/main.nf [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Outputs: {'vcf': [[{'meta': {}}, {'*.vcf.gz': {}}]], 'tbi': [[{'meta': {}}, {'*.vcf.gz.tbi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.vcf.gz") , emit: vcf tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi path "versions.yml" , emit: versions - + [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/longphase/phase/main.nf [2025-11-27 15:51:02,039] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:02,039] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -688,22 +688,22 @@ modules.json [2025-11-27 15:51:05,703] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/minimap2/align/main.nf [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'reads': {}}], [{'meta2': {}}, {'reference': {}}], {'bam_format': {}}, {'bam_index_extension': {}}, {'cigar_paf_format': {}}, {'cigar_bam': {}}] -[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.paf") , optional: true, emit: paf tuple val(meta), path("*.bam") , optional: true, emit: bam tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index path "versions.yml" , emit: versions - + [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/minimap2/align/main.nf [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Outputs: {'paf': [[{'meta': {}}, {'*.paf': {}}]], 'bam': [[{'meta': {}}, {'*.bam': {}}]], 'index': [[{'meta': {}}, {'*.bam.${bam_index_extension}': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.paf") , optional: true, emit: paf tuple val(meta), path("*.bam") , optional: true, emit: bam tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index path "versions.yml" , emit: versions - + [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/align/main.nf [2025-11-27 15:51:09,496] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:09,496] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -728,18 +728,18 @@ modules.json [2025-11-27 15:51:13,177] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/minimap2/index/main.nf [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}]] -[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.mmi"), emit: index path "versions.yml" , emit: versions - + [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/minimap2/index/main.nf [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Outputs: {'index': [[{'meta': {}}, {'*.mmi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.mmi"), emit: index path "versions.yml" , emit: versions - + [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/minimap2/index/main.nf [2025-11-27 15:51:16,904] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:16,904] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -763,22 +763,22 @@ modules.json [2025-11-27 15:51:20,761] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:24,622] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/modkit/pileup/main.nf [2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}], [{'meta2': {}}, {'fasta': {}}, {'fai': {}}], [{'meta3': {}}, {'bed': {}}]] -[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.bed") , emit: bed , optional: true tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true tuple val(meta), path("*.log") , emit: log , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/modkit/pileup/main.nf [2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bed': [[{'meta': {}}, {'*.bed': {}}]], 'bedgraph': [[{'meta': {}}, {'*.bedgraph': {}}]], 'log': [[{'meta': {}}, {'*.log': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.bed") , emit: bed , optional: true tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true tuple val(meta), path("*.log") , emit: log , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/modkit/pileup/main.nf [2025-11-27 15:51:24,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:24,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -802,7 +802,7 @@ modules.json [2025-11-27 15:51:28,381] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/mosdepth/main.nf [2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}, {'bed': {}}], [{'meta2': {}}, {'fasta': {}}]] -[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:32,189] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path('*.global.dist.txt') , emit: global_txt tuple val(meta), path('*.summary.txt') , emit: summary_txt tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt @@ -817,10 +817,10 @@ modules.json tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi path "versions.yml" , emit: versions - + [2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 13 outputs in modules/nf-core/mosdepth/main.nf [2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Outputs: {'global_txt': [[{'meta': {}}, {'*.global.dist.txt': {}}]], 'summary_txt': [[{'meta': {}}, {'*.summary.txt': {}}]], 'regions_txt': [[{'meta': {}}, {'*.region.dist.txt': {}}]], 'per_base_d4': [[{'meta': {}}, {'*.per-base.d4': {}}]], 'per_base_bed': [[{'meta': {}}, {'*.per-base.bed.gz': {}}]], 'per_base_csi': [[{'meta': {}}, {'*.per-base.bed.gz.csi': {}}]], 'regions_bed': [[{'meta': {}}, {'*.regions.bed.gz': {}}]], 'regions_csi': [[{'meta': {}}, {'*.regions.bed.gz.csi': {}}]], 'quantized_bed': [[{'meta': {}}, {'*.quantized.bed.gz': {}}]], 'quantized_csi': [[{'meta': {}}, {'*.quantized.bed.gz.csi': {}}]], 'thresholds_bed': [[{'meta': {}}, {'*.thresholds.bed.gz': {}}]], 'thresholds_csi': [[{'meta': {}}, {'*.thresholds.bed.gz.csi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path('*.global.dist.txt') , emit: global_txt tuple val(meta), path('*.summary.txt') , emit: summary_txt tuple val(meta), path('*.region.dist.txt') , optional:true, emit: regions_txt @@ -835,7 +835,7 @@ modules.json tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi path "versions.yml" , emit: versions - + [2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/mosdepth/main.nf [2025-11-27 15:51:32,190] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:32,190] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -859,22 +859,22 @@ modules.json [2025-11-27 15:51:35,682] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 6 inputs in modules/nf-core/multiqc/main.nf [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Inputs: [{'multiqc_files': {}}, {'multiqc_config': {}}, {'extra_multiqc_config': {}}, {'multiqc_logo': {}}, {'replace_names': {}}, {'sample_names': {}}] -[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found output_data: path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions - + [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/multiqc/main.nf [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Outputs: {'report': [{'*multiqc_report.html': {}}], 'data': [{'*_data': {}}], 'plots': [{'*_plots': {}}], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Output data: path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions - + [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/multiqc/main.nf [2025-11-27 15:51:39,445] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:39,445] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -898,18 +898,18 @@ modules.json [2025-11-27 15:51:43,079] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:46,118] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/pigz/uncompress/main.nf [2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'zip': {}}]] -[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${uncompressed_filename}") , emit: file path "versions.yml" , emit: versions - + [2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/pigz/uncompress/main.nf [2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Outputs: {'file': [[{'meta': {}}, {'${uncompressed_filename}': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${uncompressed_filename}") , emit: file path "versions.yml" , emit: versions - + [2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/pigz/uncompress/main.nf [2025-11-27 15:51:46,119] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:46,119] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -933,22 +933,22 @@ modules.json [2025-11-27 15:51:49,638] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/cat/main.nf [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input_files': {}}]] -[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram path "versions.yml" , emit: versions - + [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 3 outputs in modules/nf-core/samtools/cat/main.nf [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bam': [[{'meta': {}}, {'${prefix}.bam': {}}]], 'cram': [[{'meta': {}}, {'${prefix}.cram': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram path "versions.yml" , emit: versions - + [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/cat/main.nf [2025-11-27 15:51:53,446] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:51:53,446] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -972,24 +972,24 @@ modules.json [2025-11-27 15:51:57,097] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 3 inputs in modules/nf-core/samtools/faidx/main.nf [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'fasta': {}}], [{'meta2': {}}, {'fai': {}}], {'get_sizes': {}}] -[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 5 outputs in modules/nf-core/samtools/faidx/main.nf [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Outputs: {'fa': [[{'meta': {}}, {'*.{fa,fasta}': {}}]], 'sizes': [[{'meta': {}}, {'*.sizes': {}}]], 'fai': [[{'meta': {}}, {'*.fai': {}}]], 'gzi': [[{'meta': {}}, {'*.gzi': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/faidx/main.nf [2025-11-27 15:52:00,645] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:00,645] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1013,18 +1013,18 @@ modules.json [2025-11-27 15:52:04,805] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/flagstat/main.nf [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] -[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.flagstat"), emit: flagstat path "versions.yml" , emit: versions - + [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/flagstat/main.nf [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Outputs: {'flagstat': [[{'meta': {}}, {'*.flagstat': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.flagstat"), emit: flagstat path "versions.yml" , emit: versions - + [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/flagstat/main.nf [2025-11-27 15:52:08,779] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:08,779] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1048,18 +1048,18 @@ modules.json [2025-11-27 15:52:12,547] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/idxstats/main.nf [2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'bam': {}}, {'bai': {}}]] -[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:16,622] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.idxstats"), emit: idxstats path "versions.yml" , emit: versions - + [2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/idxstats/main.nf [2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Outputs: {'idxstats': [[{'meta': {}}, {'*.idxstats': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.idxstats"), emit: idxstats path "versions.yml" , emit: versions - + [2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/idxstats/main.nf [2025-11-27 15:52:16,623] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:16,623] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1083,22 +1083,22 @@ modules.json [2025-11-27 15:52:20,320] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/samtools/index/main.nf [2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}]] -[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.csi") , optional:true, emit: csi tuple val(meta), path("*.crai"), optional:true, emit: crai path "versions.yml" , emit: versions - + [2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Found 4 outputs in modules/nf-core/samtools/index/main.nf [2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Outputs: {'bai': [[{'meta': {}}, {'*.bai': {}}]], 'csi': [[{'meta': {}}, {'*.csi': {}}]], 'crai': [[{'meta': {}}, {'*.crai': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:23,973] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.csi") , optional:true, emit: csi tuple val(meta), path("*.crai"), optional:true, emit: crai path "versions.yml" , emit: versions - + [2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/index/main.nf [2025-11-27 15:52:23,974] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:23,974] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1122,18 +1122,18 @@ modules.json [2025-11-27 15:52:27,563] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/samtools/stats/main.nf [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'input': {}}, {'input_index': {}}], [{'meta2': {}}, {'fasta': {}}]] -[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions - + [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/samtools/stats/main.nf [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Outputs: {'stats': [[{'meta': {}}, {'*.stats': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions - + [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/samtools/stats/main.nf [2025-11-27 15:52:31,361] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:31,361] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1158,7 +1158,7 @@ modules.json [2025-11-27 15:52:34,930] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 2 inputs in modules/nf-core/severus/main.nf [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'target_input': {}}, {'target_index': {}}, {'control_input': {}}, {'control_index': {}}, {'vcf': {}}, {'tbi': {}}], [{'meta2': {}}, {'bed': {}}, {'pon_path': {}}]] -[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("severus.log") , emit: log tuple val(meta), path("read_qual.txt") , emit: read_qual tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double @@ -1178,10 +1178,10 @@ modules.json tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 18 outputs in modules/nf-core/severus/main.nf [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Outputs: {'log': [[{'meta': {}}, {'severus.log': {}}]], 'read_qual': [[{'meta': {}}, {'read_qual.txt': {}}]], 'breakpoints_double': [[{'meta': {}}, {'breakpoints_double.csv': {}}]], 'read_alignments': [[{'meta': {}}, {'read_alignments': {}}]], 'read_ids': [[{'meta': {}}, {'read_ids.csv': {}}]], 'collapsed_dup': [[{'meta': {}}, {'severus_collaped_dup.bed': {}}]], 'loh': [[{'meta': {}}, {'severus_LOH.bed': {}}]], 'all_vcf': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz': {}}]], 'all_tbi': [[{'meta': {}}, {'all_SVs/severus_all.vcf.gz.tbi': {}}]], 'all_breakpoints_clusters_list': [[{'meta': {}}, {'all_SVs/breakpoint_clusters_list.tsv': {}}]], 'all_breakpoints_clusters': [[{'meta': {}}, {'all_SVs/breakpoint_clusters.tsv': {}}]], 'all_plots': [[{'meta': {}}, {'all_SVs/plots/severus_*.html': {}}]], 'somatic_vcf': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz': {}}]], 'somatic_tbi': [[{'meta': {}}, {'somatic_SVs/severus_somatic.vcf.gz.tbi': {}}]], 'somatic_breakpoints_clusters_list': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters_list.tsv': {}}]], 'somatic_breakpoints_clusters': [[{'meta': {}}, {'somatic_SVs/breakpoint_clusters.tsv': {}}]], 'somatic_plots': [[{'meta': {}}, {'somatic_SVs/plots/severus_*.html': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("severus.log") , emit: log tuple val(meta), path("read_qual.txt") , emit: read_qual tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double @@ -1201,7 +1201,7 @@ modules.json tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions - + [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/severus/main.nf [2025-11-27 15:52:38,673] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:38,674] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1226,18 +1226,18 @@ modules.json [2025-11-27 15:52:49,232] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/untar/main.nf [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] -[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${prefix}"), emit: untar path "versions.yml", emit: versions - + [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/untar/main.nf [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Outputs: {'untar': [[{'meta': {}}, {'${prefix}': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${prefix}"), emit: untar path "versions.yml", emit: versions - + [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/untar/main.nf [2025-11-27 15:52:57,844] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:52:57,845] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1261,18 +1261,18 @@ modules.json [2025-11-27 15:53:01,667] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/unzip/main.nf [2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'archive': {}}]] -[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${prefix}/"), emit: unzipped_archive path "versions.yml" , emit: versions - + [2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/unzip/main.nf [2025-11-27 15:53:05,409] nf_core.components.nfcore_component [DEBUG ] Outputs: {'unzipped_archive': [[{'meta': {}}, {'${prefix}/': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${prefix}/"), emit: unzipped_archive path "versions.yml" , emit: versions - + [2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/unzip/main.nf [2025-11-27 15:53:05,410] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:53:05,410] git.util [DEBUG ] sys.platform='linux', git_executable='git' @@ -1296,18 +1296,18 @@ modules.json [2025-11-27 15:53:09,447] git.cmd [DEBUG ] Popen(['git', 'checkout', 'master'], cwd=/user/leuven/351/vsc35115/.config/nfcore/nf-core/modules, stdin=None, shell=False, universal_newlines=False) [2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 1 inputs in modules/nf-core/wget/main.nf [2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Inputs: [[{'meta': {}}, {'url': {}}]] -[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found output_data: +[2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found output_data: tuple val(meta), path("${prefix}.${suffix}"), emit: outfile path "versions.yml" , emit: versions - + [2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Found 2 outputs in modules/nf-core/wget/main.nf [2025-11-27 15:53:13,327] nf_core.components.nfcore_component [DEBUG ] Outputs: {'outfile': [[{'meta': {}}, {'${prefix}.${suffix}': {}}]], 'versions': [{'versions.yml': {}}]} -[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Output data: +[2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Output data: tuple val(meta), path("${prefix}.${suffix}"), emit: outfile path "versions.yml" , emit: versions - + [2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Found 0 topics in modules/nf-core/wget/main.nf [2025-11-27 15:53:13,328] nf_core.components.nfcore_component [DEBUG ] Topics: {} [2025-11-27 15:53:13,328] git.util [DEBUG ] sys.platform='linux', git_executable='git' From 14f6b90f21fb5fb7849a21d9efaddd6df19f5c6f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:15:32 +0100 Subject: [PATCH 541/557] removed TODOs and added citations --- CITATIONS.md | 8 ++++++++ .../utils_nfcore_lrsomatic_pipeline/main.nf | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 16b00160..221ad2ef 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -13,6 +13,10 @@ - [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) > Van Loo P, Nordgard SH, Lingjærde OC, Russnes HG, Rye IH, Sun W, Weigman VJ, Marynen P, Zetterberg A, Naume B, Perou CM, Børresen-Dale AL, Kristensen VN. Allele-specific copy number analysis of tumors. Proc Natl Acad Sci U S A. 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. + +- [bcftools](https://pubmed.ncbi.nlm.nih.gov/33590861/) + + > Danecek P, Bonfield JK, Liddle J, Marshall J, Ohan V, Pollard MO, Whitwham A, Keane T, McCarthy SA, Davies RM, Li H. Twelve years of SAMtools and BCFtools. Gigascience. 2021 Feb 16;10(2):giab008. doi: 10.1093/gigascience/giab008. PMID: 33590861; PMCID: PMC7931819. - [Clair3](https://www.nature.com/articles/s43588-022-00387-x) @@ -66,6 +70,10 @@ > Keskus, A.G., Bryant, A., Ahmad, T. et al. Severus detects somatic structural variation and complex rearrangements in cancer genomes using long-read sequencing. Nat Biotechnol (2025). https://doi.org/10.1038/s41587-025-02618-8 +- [Wakhan](https://github.com/KolmogorovLab/Wakhan) + + > A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads (Oxford Nanopore, PacBio). https://github.com/KolmogorovLab/Wakhan + ## Software packaging/containerisation tools - [Anaconda](https://anaconda.com) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index b0ef5f22..62910c2b 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -224,24 +224,25 @@ def genomeExistsError() { // Generate methods description for MultiQC // def toolCitationText() { - // TODO nf-core: Optionally add in-text citation tools to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", - "MultiQC (Ewels et al. 2016)", - "." + "MultiQC (Ewels et al. 2016),", + "Samtools (Li et al. 2009),", + "Mosdepth (Pedersen and Quinlan 2018)." ].join(' ').trim() return citation_text } def toolBibliographyText() { - // TODO nf-core: Optionally add bibliographic entries to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • ", + "
  • Li, H., Handsaker, B., Wysoker, A., Fennell, T., Ruan, J., Homer, N., ... & Durbin, R. (2009). The Sequence Alignment/Map format and SAMtools. Bioinformatics, 25(16), 2078-2079. doi: 10.1093/bioinformatics/btp352
  • ", + "
  • Pedersen, B. S., & Quinlan, A. R. (2018). Mosdepth: quick coverage calculation for genomes and exomes. Bioinformatics, 34(5), 867-868. doi: 10.1093/bioinformatics/btx699
  • " ].join(' ').trim() return reference_text @@ -271,9 +272,8 @@ def methodsDescriptionText(mqc_methods_yaml) { meta["tool_citations"] = "" meta["tool_bibliography"] = "" - // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - // meta["tool_bibliography"] = toolBibliographyText() + meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + meta["tool_bibliography"] = toolBibliographyText() def methods_text = mqc_methods_yaml.text From 8881a18ca06648e3c183b891f61e2ca7bffeddd6 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:16:33 +0100 Subject: [PATCH 542/557] whitespace --- subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 787e9f29..a58dc77d 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -100,8 +100,6 @@ workflow PIPELINE_INITIALISATION { } .set { ch_samplesheet } - - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] // bam: unaligned bams From 2e2f4f33c506b8f80f08357afa97a87ebb6a2937 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:19:15 +0100 Subject: [PATCH 543/557] formatting --- subworkflows/local/tumor_normal_happhase.nf | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 923c22a5..91c7014c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -30,7 +30,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ mixed_bams } - // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later @@ -41,7 +40,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{downloaded_model_files} - mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model @@ -56,7 +54,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { normal_bams_model } - normal_bams_model .combine(downloaded_model_files,by:0) .map{ basecall_model, meta, bam, bai, meta2, model -> @@ -115,7 +112,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ normal_bams_germlinevcf } - // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -130,7 +126,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { germline_vep } - // // MODULE: LONGPHASE_PHASE // @@ -271,7 +266,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: CLAIRS // - CLAIRS ( clairs_input, fasta, @@ -282,12 +276,20 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(CLAIRS.out.tbi) .set{clairs_out} + // + // MODULE: BCFTOOLS_CONCAT + // + BCFTOOLS_CONCAT( clairs_out ) ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) + // + // MODULE: BCFTOOLS_SORT + // + BCFTOOLS_SORT( BCFTOOLS_CONCAT.out.vcf ) From d841fd15bb1728781d53b2a273ca0ef9b83d1df8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:19:36 +0100 Subject: [PATCH 544/557] formatting --- subworkflows/local/tumor_only_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index dd3d074b..220a8710 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -22,6 +22,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_only_severus = Channel.empty() somatic_vep = Channel.empty() germline_vep = Channel.empty() + tumor_bams .map{ meta, bam, bai -> def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model @@ -29,7 +30,6 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } - // // MODULE: CLAIRSTO // From 29ec483f49a667862b4780de0a6dcd1b38551326 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:21:29 +0100 Subject: [PATCH 545/557] add def back in --- modules/local/clairs/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index d4368bf6..74d812f3 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -21,7 +21,7 @@ process CLAIRS { script: def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ /opt/bin/run_clairs \ From e1d6fc76c192b198e93e8cbe94953598fb1abeb0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 27 Nov 2025 16:34:30 +0100 Subject: [PATCH 546/557] pre-commit --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 7b56a332..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -662,4 +662,4 @@ workflow LRSOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ \ No newline at end of file +*/ From d11787e29bfd7cdb5f18a99f59bf9a950a4c29db Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 16:40:33 +0100 Subject: [PATCH 547/557] Contributions --- README.md | 2 +- nextflow.config | 62 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f1c262f2..8b990db5 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ More detail is given in our [usage documentation](/docs/usage.md) ## Credits -IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester. +IntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pančíková, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester. ## Pipeline output diff --git a/nextflow.config b/nextflow.config index 867eab84..d720894c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,6 +9,7 @@ // Global default params, used in configs params { + // TODO nf-core: Specify your pipeline's command line flags // Input options input = null @@ -60,7 +61,9 @@ params { // Wakhan options wakhan_chroms = null - // Custom ASCAT files + //TODO: + // Once iGenomes is udpated we can update our iGenomes.config to automatically assign genome version + // and allele/loci(/gc/rt) files. For now they need to be specified for anything else but GRCh38 and CHM13 ascat_gc_files = null ascat_rt_files = null @@ -224,6 +227,7 @@ includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !pa // Load IntGenomicsLab/lrsomatic custom profiles from different institutions. +// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs // includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile @@ -283,13 +287,61 @@ manifest { name = 'IntGenomicsLab/lrsomatic' contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 + [ + name: 'Luuk Harbers', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium', + email: 'luuk.harbers@kuleuven.be', + github: 'https://github.com/ljwharbers', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0003-3910-6497' + ] + [ + name: 'Robert Forsyth', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'robertalexander.forsyth@kuleuven.be', + github: 'https://github.com/robert-a-forsyth', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-6202-8477' + ] + [ + name: 'Alexandra Pančíková', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory for Computational Biology, Department of Human Genetics, KU Leuven, Leuven, Belgium; VIB-KU Leuven Center for Brain & Disease Research, Leuven, Belgium', + email: 'alexandra.pancikova@kuleuven.be', + github: 'https://github.com/AlexanRNA', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-0693-132X' + ] + [ + name: 'Ruben Cools', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'ruben.cools@kuleuven.be', + github: 'https://github.com/rcools', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0009-0004-7484-5564' + ] + [ + name: 'Marios Eftychiou', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', + email: 'marios.eftychiou@kuleuven.be', + github: 'https://github.com/MariosEft97', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-5929-6956' + ] + [ + name: 'Laurens Lambrechts', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', + email: 'laurens.lambrechts@kuleuven.be', + github: 'https://github.com/MariosEft97', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: 'https://orcid.org/0000-0002-1415-4591' + ] [ name: 'Jonas Demeulemeester', - affiliation: '', - email: '', - github: '', + affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', + email: 'jonas.demeulemeester@kuleuven.be', + github: 'https://github.com/jdemeul', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '' + orcid: 'https://orcid.org/0000-0002-2660-2478' ], ] homePage = 'https://github.com/IntGenomicsLab/lrsomatic' From 22c616be902a6beb9e6cf00b4bce00e83214c1a8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 27 Nov 2025 17:17:35 +0100 Subject: [PATCH 548/557] add wakhan --- docs/output.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/output.md b/docs/output.md index cb033ed9..656b2212 100644 --- a/docs/output.md +++ b/docs/output.md @@ -50,7 +50,10 @@ The directories listed below will be created in the results directory after the │ │ ├── germline │ │ ├── somatic │ │ ├── SVs +│ ├── wakhan ├── pipeline_info +├── multiqc + ``` @@ -281,6 +284,37 @@ The directories listed below will be created in the results directory after the
    +### wakhan +
    +Output files + +``` +├── wakhan +│ ├── {ploidy}_{purity}_{confidence} +│ │ ├── bed_output +│ │ │ ├── genes_copynumber_states.bed +│ │ │ ├── loh_regions.bed +│ │ │ ├── sample_{ploidy}_{purity}_{confidence}_HP_1.bed +│ │ │ ├── sample_{ploidy}_{purity}_{confidence}_HP_2.bed +│ │ ├── variation_plots +│ │ │ ├── chr{1-22,X,Y}_cn.html +│ │ │ ├── chr{1-22,X,Y}_cn.pdf +│ │ │ ├── CN_VARIATION_INDEX.html +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genes_genome.html +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genes_genome.pdf +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_breakpoints.html +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_breakpoints.pdf +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.html +│ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.pdf + + + +│ ├── solutions_ranks.tsv +``` + +| File | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + ### pipeline_info
    From 129acab07589522245fe9a1302e47b6b18afff65 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 09:19:33 +0100 Subject: [PATCH 549/557] snap update --- ro-crate-metadata.json | 2 +- tests/default.nf.test.snap | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 2d439fec..f772e522 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-11-20T09:56: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.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.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 bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\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\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\nresults\n|\n\u251c\u2500\u2500 multiqc\n\u2502\n\u251c\u2500\u2500 sample1\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumour\n\u2502 \u2502 \u2514\u2500\u2500 normal\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u2502 \u2514\u2500\u2500 clairs\n\u2502 \u2514\u2500\u2500 ascat\n\u2502\n\u2514\u2500\u2500 sample2\n \u251c\u2500\u2500 bamfiles\n \u251c\u2500\u2500 qc\n \u2502 \u251c\u2500\u2500 tumour\n \u2502 \u2514\u2500\u2500 normal\n \u251c\u2500\u2500 variants\n \u2502 \u251c\u2500\u2500 severus\n \u2502 \u2514\u2500\u2500 clairs\n \u2514\u2500\u2500 ascat\n```\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 94489ba0..ccd6e7a6 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,7 +1,6 @@ { "-profile test": { "content": [ - 78, { "BCFTOOLS_CONCAT": { "bcftools": 1.22 @@ -370,6 +369,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-10-30T17:00:44.230935974" + "timestamp": "2025-11-27T17:37:23.810503056" } } \ No newline at end of file From 5e73c3c3949114dd3f863e31e9483be3980a1307 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 11:17:25 +0100 Subject: [PATCH 550/557] multi-qc + wakhan --- README.md | 6 +- docs/output.md | 336 +++++++++++++++++++++++++++++------------ nextflow.config | 12 +- ro-crate-metadata.json | 2 +- 4 files changed, 250 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index 8b990db5..f5afd2ed 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) [![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) @@ -62,7 +62,6 @@ b. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep - ## Usage > [!NOTE] @@ -153,6 +152,7 @@ Example output directory structure: ``` more detail is given in our [output documentation](/docs/output.md) + ## Contributions and Support If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). @@ -170,4 +170,4 @@ This pipeline uses code and infrastructure developed and maintained by the [nf-c > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). \ No newline at end of file +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). diff --git a/docs/output.md b/docs/output.md index 656b2212..29d1c7a3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,11 +2,12 @@ ## Introduction -This document describes the output produced by the pipeline. +This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. ### Output Example + ``` ├── Sample 1 │ ├── ascat @@ -56,8 +57,8 @@ The directories listed below will be created in the results directory after the ``` - ### `ascat` +
    Output files @@ -80,30 +81,31 @@ The directories listed below will be created in the results directory after the │ ├── sample.tumour.sunrise.png ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample before correction | -| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample before correction -| `sample.cnvs.txt` | a tsv file describing each chromosome segment with a copy number alteration and it's major and minor copy number -| `sample.metrics.txt` | a tsv file describing summary statistics for the sample -| `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths -| `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample -| `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number -| `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths -| `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample -| `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample -| `sample.tumour_normalLogR.txt` | a tsv file with the LogR values in the normal sample -| `sample.tumour_tumourBAF_rawBAF.txt` | a tsv file with the raw BAF values in the tumor sample -| `sample.tumour_tumourBAF.txt` | a tsv file with the corrected BAF values in the tumor sample -| `sample.tumour_tumourLogR.txt` | a tsv file with the corrected LogR values in the tumor sample -| `sample.tumour.ASCATprofile.png` | a png file with the corrected overall copy number profile with ploidy, purity, and goodness of fit metrics -| `sample.tumour.ASPCF.png` | a png file with the corrected LogR and BAF plots of the tumor sample -| `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics -| `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit +| File | Description | +| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `sample.before_correction.sample.tumour.germline.png` | LogR and BAF plots from the normal sample before correction | +| `sample.before_correction.sample.tumour.tumour.png` | LogR and BAF plots from the tumor sample before correction | +| `sample.cnvs.txt` | a tsv file describing each chromosome segment with a copy number alteration and it's major and minor copy number | +| `sample.metrics.txt` | a tsv file describing summary statistics for the sample | +| `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths | +| `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample | +| `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number | +| `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths | +| `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample | +| `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample | +| `sample.tumour_normalLogR.txt` | a tsv file with the LogR values in the normal sample | +| `sample.tumour_tumourBAF_rawBAF.txt` | a tsv file with the raw BAF values in the tumor sample | +| `sample.tumour_tumourBAF.txt` | a tsv file with the corrected BAF values in the tumor sample | +| `sample.tumour_tumourLogR.txt` | a tsv file with the corrected LogR values in the tumor sample | +| `sample.tumour.ASCATprofile.png` | a png file with the corrected overall copy number profile with ploidy, purity, and goodness of fit metrics | +| `sample.tumour.ASPCF.png` | a png file with the corrected LogR and BAF plots of the tumor sample | +| `sample.tumour.rawprofile.png` | a png file with the raw overall copy number profile with ploidy, purity, and goodness of fit metrics | +| `sample.tumour.sunrise.png` | a png file with a purity and ploidy fit |
    ### `bamfiles` +
    Output files @@ -115,15 +117,17 @@ The directories listed below will be created in the results directory after the │ ├── sample_tumor.bam.bai ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`sample_normal.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the normal sample -| `sample_normal.bam.bai` | index file for the normal bam file -| ` sample_tumor.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the tumor sample -| `sample_tumor.bam.bai` | index file for the tumor bam file +| File | Description | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | +| `sample_normal.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the normal sample | +| `sample_normal.bam.bai` | index file for the normal bam file | +| ` sample_tumor.bam` | Aligned and haplotagged bam file (with methylation and nucleosome predictions) for the tumor sample | +| `sample_tumor.bam.bai` | index file for the tumor bam file | +
    ### `qc` +
    Output files @@ -145,34 +149,39 @@ The directories listed below will be created in the results directory after the │ │ │ ├── sample.stats ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`cramino_aln/sample.cramino.txt` | cramino QC summary statistics for the aligned bam file -| `cramino_ubam/sample.cramino.txt` | cramino QC summary statistics for the unaligned bam files -| `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file -| `mosdepth/sample.mosdepth.global.dist.txt` | a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value -| `mosdepth/sample.mosdepth.summary.txt` | overall summary file from mosdepth tool -|`samtools/sample.flagstat` | a summary of the counts of different samtools flags -|`samtools/sample.idxstats` | a summary of the number of mapped and unmapped reads -|`samtools/sample.stats` | summary statistics from the bamfile +| File | Description | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| `cramino_aln/sample.cramino.txt` | cramino QC summary statistics for the aligned bam file | +| `cramino_ubam/sample.cramino.txt` | cramino QC summary statistics for the unaligned bam files | +| `fibertoolsrs/sample_qc.txt` | fibertools QC summary for the bam file | +| `mosdepth/sample.mosdepth.global.dist.txt` | a cumulative distribution indicating the proportion of total bases that were covered for at least a given coverage value | +| `mosdepth/sample.mosdepth.summary.txt` | overall summary file from mosdepth tool | +| `samtools/sample.flagstat` | a summary of the counts of different samtools flags | +| `samtools/sample.idxstats` | a summary of the number of mapped and unmapped reads | +| `samtools/sample.stats` | summary statistics from the bamfile | +
    ### `variants` +
    Output files #### `clair3` + ``` ├── clair3 │ ├── merge_output.vcf.gz │ ├── merge_output.vcf.gz.tbi ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`merge_output.vcf.gz` | Merged germline indel and snv calls in vcf format -|`merge_output.vcf.gz` | index for germline small variant calls + +| File | Description | +| --------------------- | ------------------------------------------------- | +| `merge_output.vcf.gz` | Merged germline indel and snv calls in vcf format | +| `merge_output.vcf.gz` | index for germline small variant calls | #### `clairS` + ``` ├── clairS │ ├── indel.vcf.gz @@ -180,14 +189,16 @@ The directories listed below will be created in the results directory after the │ ├── snv.vcf.gz │ ├── snv.vcf.gz.tbi ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`indel.vcf.gz` | Somatic indel calls in vcf format -|`indel.vcf.gz.tbi` | Index for somatic indel calls -|`snv.vcf.gz` | Somatic SNV calls in vcf format -|`snv.vcf.gz.tbi`| Index for somatic SNV calls + +| File | Description | +| ------------------ | --------------------------------- | +| `indel.vcf.gz` | Somatic indel calls in vcf format | +| `indel.vcf.gz.tbi` | Index for somatic indel calls | +| `snv.vcf.gz` | Somatic SNV calls in vcf format | +| `snv.vcf.gz.tbi` | Index for somatic SNV calls | #### `clairS-TO` + ``` ├── clairS │ ├── germline.vcf.gz @@ -200,18 +211,19 @@ The directories listed below will be created in the results directory after the │ ├── somatic.vcf.gz.tbi ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`germline.vcf.gz` | SNV and indel calls marked as germline (will not include variants QC) -|`germline.vcf.gz.tbi` | Index file for germline small variant calls -|`indel.vcf.gz` | Raw indel calls in vcf format -|`indel.vcf.gz.tbi` | Index for somatic indel calls -|`snv.vcf.gz` | Raw SNV calls in vcf format -|`snv.vcf.gz.tbi`| Index for SNV calls -|`somatic.vcf.gz`| SNV and indel calls marked as PASS and without a germline tag -|`somatic.vcf.gz`| Index for osmatic small variatn calls +| File | Description | +| --------------------- | --------------------------------------------------------------------- | +| `germline.vcf.gz` | SNV and indel calls marked as germline (will not include variants QC) | +| `germline.vcf.gz.tbi` | Index file for germline small variant calls | +| `indel.vcf.gz` | Raw indel calls in vcf format | +| `indel.vcf.gz.tbi` | Index for somatic indel calls | +| `snv.vcf.gz` | Raw SNV calls in vcf format | +| `snv.vcf.gz.tbi` | Index for SNV calls | +| `somatic.vcf.gz` | SNV and indel calls marked as PASS and without a germline tag | +| `somatic.vcf.gz` | Index for osmatic small variatn calls | #### `severus` + ``` ├── severus │ ├── all_SVs @@ -233,25 +245,27 @@ The directories listed below will be created in the results directory after the │ ├── read_qual.txt │ ├── severus.log ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`all_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster -|`all_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in all clustered events -|`all_SVs/breakpoint_cluster.tsv` | a tsv containing all clustered events -|`all_SVs/severus_all.vcf.gz` | A vcf file containing all identified structural variants -|`somatic_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster -|`somatic_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in somatic clustered events -|`somatic_SVs/breakpoint_cluster.tsv` | a tsv containing somatic clustered events -|`somatic_SVs/severus_somatic.vcf.gz` | A vcf file containing identified somatic structural variants -|`somatic_SVs/severus_somatic.vcf.gz.tbi` | Index for identified somatic structural variants -|`breakpoints_double.csv` | csv file containing detailed information about identified breakpoints in bam file -|`read_ids.csv`| a csv file containing read ids associated with each identified SV -|`read_qual.txt` | file containing quality statistics about identified segements -|`severus.log` | log file + +| File | Description | +| ----------------------------------------- | --------------------------------------------------------------------------------- | +| `all_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster | +| `all_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in all clustered events | +| `all_SVs/breakpoint_cluster.tsv` | a tsv containing all clustered events | +| `all_SVs/severus_all.vcf.gz` | A vcf file containing all identified structural variants | +| `somatic_SVs/plots/severus_{*}.html` | html file containing a plot of connected breakpoints in a cluster | +| `somatic_SVs/breakpoint_cluster_list.tsv` | tsv containing the breakpoints in somatic clustered events | +| `somatic_SVs/breakpoint_cluster.tsv` | a tsv containing somatic clustered events | +| `somatic_SVs/severus_somatic.vcf.gz` | A vcf file containing identified somatic structural variants | +| `somatic_SVs/severus_somatic.vcf.gz.tbi` | Index for identified somatic structural variants | +| `breakpoints_double.csv` | csv file containing detailed information about identified breakpoints in bam file | +| `read_ids.csv` | a csv file containing read ids associated with each identified SV | +| `read_qual.txt` | file containing quality statistics about identified segements | +| `severus.log` | log file |
    ### `vep` +
    Output files @@ -270,21 +284,23 @@ The directories listed below will be created in the results directory after the │ │ ├── sample_SV_VEP_summary.html │ │ ├── sample_SV_VEP.vcf.gz.tbi ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`germline/sample_GERMLINE_VEP.vcf.gz` | Annotated germline indel and SNV vcf file | -|`germline/sample_GERMLINE_VEP_summary.html` | Visual summary of germline indel and SNV annotations in html format -|`germline/sample_GERMLINE_VEP.vcf.gz.tbi` | Annotated germline indel and SNV vcf index file | -|`somatic/sample_SOMATIC_VEP.vcf.gz` | Annotated somatic indel and SNV vcf file | -|`somatic/sample_SOMATIC_VEP_summary.html` | Visual summary of somatic indel and SNV annotations in html format -|`somatic/sample_SOMATIC_VEP.vcf.gz.tbi` | Annotated somatic indel and SNV vcf index file | -|`SVs/sample_SV_VEP.vcf.gz` | Annotated somatic structural variant vcf file | -|`SVs/sample_SV_VEP_summary.html` | Visual summary of somatic structural variant annotations in html format -|`SVs/sample_SV_VEP.vcf.gz.tbi` | Annotated somatic structural variant vcf index file | + +| File | Description | +| ------------------------------------------- | ----------------------------------------------------------------------- | +| `germline/sample_GERMLINE_VEP.vcf.gz` | Annotated germline indel and SNV vcf file | +| `germline/sample_GERMLINE_VEP_summary.html` | Visual summary of germline indel and SNV annotations in html format | +| `germline/sample_GERMLINE_VEP.vcf.gz.tbi` | Annotated germline indel and SNV vcf index file | +| `somatic/sample_SOMATIC_VEP.vcf.gz` | Annotated somatic indel and SNV vcf file | +| `somatic/sample_SOMATIC_VEP_summary.html` | Visual summary of somatic indel and SNV annotations in html format | +| `somatic/sample_SOMATIC_VEP.vcf.gz.tbi` | Annotated somatic indel and SNV vcf index file | +| `SVs/sample_SV_VEP.vcf.gz` | Annotated somatic structural variant vcf file | +| `SVs/sample_SV_VEP_summary.html` | Visual summary of somatic structural variant annotations in html format | +| `SVs/sample_SV_VEP.vcf.gz.tbi` | Annotated somatic structural variant vcf index file |
    -### wakhan +### `wakhan` +
    Output files @@ -306,16 +322,143 @@ The directories listed below will be created in the results directory after the │ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_breakpoints.pdf │ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.html │ │ ├── sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.pdf +│ ├── coverage_data +│ │ ├── {0-23}_SNPS.csv +│ │ ├── coverage_ps.csv +│ │ ├── phase_corrected_coverage.csv +│ │ ├── pileup_SNPs.csv +│ ├── coverage_plots +│ │ ├── chr{1-22,X,Y}_cov.html +│ │ ├── chr{1-22,X,Y}.pdf +│ │ ├── COVERAGE_INDEX.html +│ ├── phasing output +│ │ ├── chr{1-22,X,Y}_phase_correction_0.html +│ │ ├── chr{1-22,X,Y}_phase_correction_1.html +│ │ ├── chr{1-22,X,Y}_without_phase_correction.html +│ │ ├── chr{1-22,X,Y}.pdf +│ │ ├── sample.rephased.vcf.gz +│ │ ├── sample.rephased.vcf.gz.tbi +│ ├── sample_heatmap_ploidy_purity.html +│ ├── sample_heatmap_ploidy_purity.html.pdf +│ ├── sample_optimized_peak.html +│ ├── solutions_ranks.tsv +``` +| File | Description | +| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `{ploidy}_{purity}_{confidence}/bed_output/genes_copynumber_states.bed` | bed file containing allele specific copy number values with coverage information | +| `{ploidy}_{purity}_{confidence}/bed_output/loh_regions.bed` | bed file containing positions of loss of heterozygosity regions | +| `{ploidy}_{purity}_{confidence}/bed_output/sample_{ploidy}_{purity}_{confidence}_HP_1.bed` | bed file containing copy number states, coverage, and SV breakpoints for haplotype 1 | +| `{ploidy}_{purity}_{confidence}/bed_output/sample_{ploidy}_{purity}_{confidence}_HP_2.bed` | bed file containing copy number states, coverage, and SV breakpoints for haplotype 2 | +| `{ploidy}_{purity}_{confidence}/variation_plots/chr{1-22,X,Y}_cn.html` | html based plotly plot of copy number and coverage for individual chromosomes | +| `{ploidy}_{purity}_{confidence}/variation_plots/chr{1-22,X,Y}_cn.pdf` | pdf based plotly plot of copy number and coverage for individual chromosomes | +| `{ploidy}_{purity}_{confidence}/variation_plots/CN_VARIATION_INDEX.html` | unclear html plot | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genes_genome.html` | html plots of copy number variations in highlighted genes | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genes_genome.pdf` | pdf plots of copy number variations in highlighted genes | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.html` | genome-wide html copy number plots with coverage information on same axis | +| `{ploidy}_{purity}_{confidence}/sample_{purity}_{ploidy}_{confidence}_genome_copynumbers_details.pdf` | genome-wide pdf copy number plots with coverage information on same axis | +| `coverage_data/{0-23}_SNP.csv` | CSV of coverage data per chromosome | +| `coverage_data/coverage_ps.csv` | CSV of overall haplotype specific coverage data | +| `coverage_data/coverage.csv` | CSV of overall coverage data | +| `coverage_data/phase_corrected_coverage.csv` | CSV of overall phase-corrected coverage data | +| `coverage_data/pileup_SNPs.csv` | CSV of SNP pileup data | +| `coverage_plots/chr{1-22,X,Y}_cov.html` | chromosome specific html coverage plots | +| `coverage_plots/chr{1-22,X,Y}_cov.pdf` | chromosome specific pdf coverage plots | +| `coverage_plots/COVERAGE_INDEX.html` | unclear html plot | +| `phasing_output/chr{1-23,X,Y}_phase_correction_0.html` | Phase-switch error correction plot per chromosome | +| `phasing_output/chr{1-23,X,Y}_phase_correction_1.html` | Phase-switch error correction plot per chromosome | +| `phasing_output/chr{1-22,X,Y}_without_phase_correction.html` | Phase-switch error without phase correction plot per chromosome | +| `phasing_output/chr{1-22,X,Y}.pdf` | Phase-switch error correction plot | +| `phasing_output/PHASE_CORRECTION_INDEX` | unclear html plot | +| `phasing_output/sample_rephased.vcf.gz` | phase corrected SNP vcf file | +| `phasing_output/sample_rephased.vcf.gz.tbi` | phase corrected SNP vcf index file | +| `sample_heatmap_ploidy_purity.html` | heatmap html plot of purity ploidy fit | +| `sample_heatmap_ploidy_purity.html.pdf` | heatmap html plot of purity ploidy fit | +| `sample_optimized_peak.html` | optimization peak plot | +| `solutions_ranks.tsv` | rank of potential purity ploidy solutions | + +
    + +### `multiqc` + +
    +Output files -│ ├── solutions_ranks.tsv ``` +├── multiqc +│ ├── multiqc_data +│ │ ├── BETA-multiqc.parquet +│ │ ├── llms-full.txt +│ │ ├── mosdepth_cov_dist.txt +│ │ ├── mosdepth_cumcov_dist.txt +│ │ ├── mosdepth_perchrom.txt +│ │ ├── mosdepth-coverage-per-contig-multi.txt +│ │ ├── mosdepth-cumcoverage-dist-id.txt +│ │ ├── mosdepth-xy-coverage-plot.txt +│ │ ├── multiqc_citations +│ │ ├── multiqc_data.json +│ │ ├── multiqc_general_stats.txt +│ │ ├── multiqc_software_versions.txt +│ │ ├── multiqc_sources.txt +│ │ ├── multiqc.log +│ ├── multiqc_plots +│ │ ├── pdf +│ │ │ ├── mosdepth-coverage-per-contig-multi-cnt.pdf +│ │ │ ├── mosdepth-coverage-per-contig-multi-log.pdf +│ │ │ ├── mosdepth-cumcoverage-dist-id.pdf +│ │ │ ├── mosdepth-xy-coverage-plot-cnt.pdf +│ │ │ ├── mosdepth-xy-coverage-plot-pct.pdf +│ │ ├── png +│ │ │ ├── mosdepth-coverage-per-contig-multi-cnt.png +│ │ │ ├── mosdepth-coverage-per-contig-multi-log.png +│ │ │ ├── mosdepth-cumcoverage-dist-id.png +│ │ │ ├── mosdepth-xy-coverage-plot-cnt.png +│ │ │ ├── mosdepth-xy-coverage-plot-pct.png +│ │ ├── svg +│ │ │ ├── mosdepth-coverage-per-contig-multi-cnt.svg +│ │ │ ├── mosdepth-coverage-per-contig-multi-log.svg +│ │ │ ├── mosdepth-cumcoverage-dist-id.svg +│ │ │ ├── mosdepth-xy-coverage-plot-cnt.svg +│ │ │ ├── mosdepth-xy-coverage-plot-pct.svg +│ ├── multiqc_report.html -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +``` -### pipeline_info +| File | Description | +| -------------------------------------------------------------- | ------------------------------------------------------------ | +| `multiqc_data/BETA-multiqc.parquet` | Multiqc data in Apache Parquet format (BETA) | +| `multiqc_data/llms-full.txt` | Prompt for large-language-model summary | +| `multiqc_data/mosdepth_cov_dist.txt` | text file of coverage distribution | +| `multiqc_data/mosdepth_cumcov_dist.txt` | text file of cummulative coverage distribution | +| `multiqc_data/mosdepth_perchrom.txt` | text file of coverage per chromosome | +| `multiqc_data/mosdepth-coverage-per-contig-multi.txt` | text file of coverage per contig | +| `multiqc_data/mosdepth-cumcoverage-dist-id.txt` | unclear text file | +| `multiqc_data/mosdepth-xy-coverage-plot.txt` | summary of chr X, chr Y coverage | +| `multiqc_data/multiqc_citations` | citations for multiqc | +| `multiqc_data/multiqc_data.json` | json file containing multiqc data output | +| `multiqc_data/multiqc_general_stats.txt` | summary statistics for the samples | +| `multiqc_data/multiqc_software_versions.txt` | software versions for tools used in multiqc | +| `multiqc_data/multiqc_sources.txt` | software sources for tools used in multiqc | +| `multiqc_data/multiqc.log` | log file for multiqc | +| `multiqc_plots/pdf/mosdepth-coverage-per-contig-multi-cnt.pdf` | pdf format plot of coverage per contig | +| `multiqc_plots/pdf/mosdepth-coverage-per-contig-multi-log.pdf` | pdf format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf` | pdf format plot of distribution of cumulative coverage | +| `multiqc_plots/pdf/mosdepth-xy-coverage-plot-cnt.pdf` | pdf format plot of chr X and chr Y coverage by count | +| `multiqc_plots/pdf/mosdepth-xy-coverage-plot-pct.pdf` | pdf format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/png/mosdepth-coverage-per-contig-multi-cnt.png` | png format plot of coverage per contig | +| `multiqc_plots/png/mosdepth-coverage-per-contig-multi-log.png` | png format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/png/mosdepth-cumcoverage-dist-id.png` | png format plot of distribution of cumulative coverage | +| `multiqc_plots/png/mosdepth-xy-coverage-plot-cnt.png` | png format plot of chr X and chr Y coverage by count | +| `multiqc_plots/png/mosdepth-xy-coverage-plot-pct.png` | png format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/svg/mosdepth-coverage-per-contig-multi-cnt.svg` | svg format plot of coverage per contig | +| `multiqc_plots/svg/mosdepth-coverage-per-contig-multi-log.svg` | svg format plot of coverage per contig on a logarithmic plot | +| `multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg` | svg format plot of distribution of cumulative coverage | +| `multiqc_plots/svg/mosdepth-xy-coverage-plot-cnt.svg` | svg format plot of chr X and chr Y coverage by count | +| `multiqc_plots/svg/mosdepth-xy-coverage-plot-pct.svg` | svg format plot of chr X and chr Y coverage by percentage | +| `multiqc_plots/multiqc_report.html` | svg format plot of chr X and chr Y coverage by percentage | + +### `pipeline_info`
    Output files @@ -329,12 +472,13 @@ The directories listed below will be created in the results directory after the │ ├── params_{DATE}.json │ ├── pipeline_dag_{DATE}/html ``` -| File | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`execution_report_{DATE}.hmtl` | summary of pipeline resource and timing usage in a html report | -|`execution_timeline_{DATE}.hmtl` | a graphical summary of the timing of each module's task over the course of the pipeline run | -|`lrsomatic_softwar_mqc_versions.yml` | summary of the versions of each tool used by the pipeline| -|`params_{DATE}.json` | summary of the paramaters used in the pipeline| -|`pipeline_dag_{DATE}.html` | flow chart summarizing the pipeline run | + +| File | Description | +| ------------------------------------ | ------------------------------------------------------------------------------------------- | +| `execution_report_{DATE}.hmtl` | summary of pipeline resource and timing usage in a html report | +| `execution_timeline_{DATE}.hmtl` | a graphical summary of the timing of each module's task over the course of the pipeline run | +| `lrsomatic_softwar_mqc_versions.yml` | summary of the versions of each tool used by the pipeline | +| `params_{DATE}.json` | summary of the paramaters used in the pipeline | +| `pipeline_dag_{DATE}.html` | flow chart summarizing the pipeline run |
    diff --git a/nextflow.config b/nextflow.config index d720894c..76ce3eaa 100644 --- a/nextflow.config +++ b/nextflow.config @@ -294,7 +294,7 @@ manifest { github: 'https://github.com/ljwharbers', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0000-0003-3910-6497' - ] + ], [ name: 'Robert Forsyth', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', @@ -302,7 +302,7 @@ manifest { github: 'https://github.com/robert-a-forsyth', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0000-0002-6202-8477' - ] + ], [ name: 'Alexandra Pančíková', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory for Computational Biology, Department of Human Genetics, KU Leuven, Leuven, Belgium; VIB-KU Leuven Center for Brain & Disease Research, Leuven, Belgium', @@ -310,7 +310,7 @@ manifest { github: 'https://github.com/AlexanRNA', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0000-0002-0693-132X' - ] + ], [ name: 'Ruben Cools', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', @@ -318,7 +318,7 @@ manifest { github: 'https://github.com/rcools', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0009-0004-7484-5564' - ] + ], [ name: 'Marios Eftychiou', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', @@ -326,7 +326,7 @@ manifest { github: 'https://github.com/MariosEft97', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0000-0002-5929-6956' - ] + ], [ name: 'Laurens Lambrechts', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium; Laboratory of Multi-omic Integrative Bioinformatics, Department of Human Genetics, KU Leuven, Leuven, Belgium', @@ -334,7 +334,7 @@ manifest { github: 'https://github.com/MariosEft97', contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: 'https://orcid.org/0000-0002-1415-4591' - ] + ], [ name: 'Jonas Demeulemeester', affiliation: 'VIB Center for Cancer Biology, VIB, Leuven, Belgium; Laboratory of Integrative Cancer Genomics, Department of Oncology, KU Leuven, Leuven, Belgium; VIB Center for AI and Computational Biology, VIB, Leuven, Belgium', diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 2d439fec..329f23a2 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-11-20T09:56: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.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.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/3.5.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 bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`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\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\n\n```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).", "hasPart": [ { "@id": "main.nf" From 0fb11dab0a03253f273959b7aa9e1a1e5f0e3e14 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 11:37:42 +0100 Subject: [PATCH 551/557] update lint --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 329f23a2..4022ff15 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-11-20T09:56:35+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`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\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\n\n```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\n\n```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From 2da489786cdf87db9c3595abbfe1f1d1a99965f1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 11:39:22 +0100 Subject: [PATCH 552/557] prettier --- CITATIONS.md | 4 +- docs/README.md | 1 - docs/usage.md | 110 +++++++++++++++++++++-------------------- workflows/lrsomatic.nf | 2 +- 4 files changed, 59 insertions(+), 58 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 221ad2ef..19daeb37 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -13,7 +13,7 @@ - [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) > Van Loo P, Nordgard SH, Lingjærde OC, Russnes HG, Rye IH, Sun W, Weigman VJ, Marynen P, Zetterberg A, Naume B, Perou CM, Børresen-Dale AL, Kristensen VN. Allele-specific copy number analysis of tumors. Proc Natl Acad Sci U S A. 2010 Sep 28;107(39):16910-5. doi: 10.1073/pnas.1009843107. Epub 2010 Sep 13. PubMed PMID: 20837533; PubMed Central PMCID: PMC2947907. - + - [bcftools](https://pubmed.ncbi.nlm.nih.gov/33590861/) > Danecek P, Bonfield JK, Liddle J, Marshall J, Ohan V, Pollard MO, Whitwham A, Keane T, McCarthy SA, Davies RM, Li H. Twelve years of SAMtools and BCFtools. Gigascience. 2021 Feb 16;10(2):giab008. doi: 10.1093/gigascience/giab008. PMID: 33590861; PMCID: PMC7931819. @@ -24,7 +24,7 @@ - [ClairS](https://www.biorxiv.org/content/10.1101/2023.08.17.553778v1) - > Zhenxian Zheng, Junhao Su, Lei Chen, Yan-Lam Lee, Tak-Wah Lam, Ruibang Luo. ClairS: a deep-learning method for long-read somatic small variant calling. bioRxiv 2023.08.17.553778; doi: https://doi.org/10.1101/2023.08.17.553778 + > Zhenxian Zheng, Junhao Su, Lei Chen, Yan-Lam Lee, Tak-Wah Lam, Ruibang Luo. ClairS: a deep-learning method for long-read somatic small variant calling. bioRxiv 2023.08.17.553778; doi: https://doi.org/10.1101/2023.08.17.553778 - [ClairS-TO](https://pubmed.ncbi.nlm.nih.gov/41173866/) diff --git a/docs/README.md b/docs/README.md index 34a069c5..14889bd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,5 @@ The IntGenomicsLab/lrsomatic documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. - - [Output](output.md) - An overview of the different results produced by the pipeline and how to interpret them. diff --git a/docs/usage.md b/docs/usage.md index 5addb033..30fa00af 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,7 +14,7 @@ sample3,tumour.bam,,pb,male,n sample4,tumour.bam,normal.bam,pb,male,y ``` -lrsomatic extracts information from the bam header files to decide which models to use for Clair3, ClairS, or ClairS-TO. However, this can optionally be specified manually. You can do this for one or many samples, if the field is left blank, the pipeline will default to extracting this information. You can specify this by creating your csv in the following form: +lrsomatic extracts information from the bam header files to decide which models to use for Clair3, ClairS, or ClairS-TO. However, this can optionally be specified manually. You can do this for one or many samples, if the field is left blank, the pipeline will default to extracting this information. You can specify this by creating your csv in the following form: ```csv sample,bam_tumor,bam_normal,platform,sex,fiber,clair3_model,clairSTO_model,clairS_model @@ -43,19 +43,17 @@ sample1,tumour3.bam,,pb,male,n ### Full Description of Samplesheet Columns - - -| Column | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `bam_tumor` | Full path to BAM file for the tumor. File must end in `.bam`. | -| `bam_normal` | Full path to BAM file for the tumor. File must end in `.bam`. | -|`platform`| A string specifying the platform used for sequencing, can be either `pb` for PacBio sequencing data or `ont` for Oxford Nanopore sequencing data -| `sex` | A string specifying the biological sex of the sample, can either be `m` or `f` -|`fiber`| A string specifying if the sample has been subjected to Fiber-seq. Can either be `y` or `n` -|`clair3_model` | A string describing which model is to be used for Clair3's small variant calling (*optional*) -|`clairSTO_model` | A string describing which model is to be used for ClairS-TO's small variant calling (*optional*) -|`clairS_model` | A string describing which model is to be used for ClairS's small variant calling (*optional*) +| Column | Description | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `bam_tumor` | Full path to BAM file for the tumor. File must end in `.bam`. | +| `bam_normal` | Full path to BAM file for the tumor. File must end in `.bam`. | +| `platform` | A string specifying the platform used for sequencing, can be either `pb` for PacBio sequencing data or `ont` for Oxford Nanopore sequencing data | +| `sex` | A string specifying the biological sex of the sample, can either be `m` or `f` | +| `fiber` | A string specifying if the sample has been subjected to Fiber-seq. Can either be `y` or `n` | +| `clair3_model` | A string describing which model is to be used for Clair3's small variant calling (_optional_) | +| `clairSTO_model` | A string describing which model is to be used for ClairS-TO's small variant calling (_optional_) | +| `clairS_model` | A string describing which model is to be used for ClairS's small variant calling (_optional_) | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -64,7 +62,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh38 -profile docker +nextflow run IntGenomicsLab/lrsomatic --input ./samplesheet.csv --outdir ./results --genome GRCh38 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -78,6 +76,7 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` + > [!WARNING] > Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). @@ -99,54 +98,57 @@ genome: 'GRCh37' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). ### Pipeline options -| Parameter | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`-input` | Full file path to input samplesheet, must be in `.csv` format and conform to specifications noted above -|`--genome`| Specified genome assembly, support is given for `GRCh38` and `CHM13`| -|`--normal_fiber`| A boolean which skips fiber-seq processing on normal files (on those which have fiber-seq for the tumor). Default = `true` (*does not skip fiber-seq processing for normal*) + +| Parameter | Description | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-input` | Full file path to input samplesheet, must be in `.csv` format and conform to specifications noted above | +| `--genome` | Specified genome assembly, support is given for `GRCh38` and `CHM13` | +| `--normal_fiber` | A boolean which skips fiber-seq processing on normal files (on those which have fiber-seq for the tumor). Default = `true` (_does not skip fiber-seq processing for normal_) | #### Skipping options: -| Parameter | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` -|`--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` -|`--skip_cramino` | A boolean to skip `cramino`. Default = `false` -|`--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` -|`--skip_ascat` | A boolean to skip `ascat`. Default = `false` -|`--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` -|`--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` -|`--skip_vep` | A boolean to skip `vep`. Default = `false` + +| Parameter | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------- | +| `--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` | +| `--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` | +| `--skip_cramino` | A boolean to skip `cramino`. Default = `false` | +| `--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` | +| `--skip_ascat` | A boolean to skip `ascat`. Default = `false` | +| `--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` | +| `--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` | +| `--skip_vep` | A boolean to skip `vep`. Default = `false` | #### VEP options: -| Parameter | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -|`--vep_cache` | Full path to a vep cache. If left blank, this will default to pulling from this [Annotation Cache Storage](https://annotation-cache.github.io/). -|`--vep_cache_version`| Integer specifying version of vep cache. Default = `113` -|`--vep_args`| A string specifying arguments to vep. Default = `"--everything --filter_common --per_gene --total_length --offline --format vcf"` -|`--vep_custom`| A full path to a vcf file containing custom variants for annotation. Must be bgzipped and have `.vcf.gz` format. Default = `null` -|`--vep_custom_tbi`| A full path to a index file for cutom vcf for vep. Default = `null` + +| Parameter | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `--vep_cache` | Full path to a vep cache. If left blank, this will default to pulling from this [Annotation Cache Storage](https://annotation-cache.github.io/). | +| `--vep_cache_version` | Integer specifying version of vep cache. Default = `113` | +| `--vep_args` | A string specifying arguments to vep. Default = `"--everything --filter_common --per_gene --total_length --offline --format vcf"` | +| `--vep_custom` | A full path to a vcf file containing custom variants for annotation. Must be bgzipped and have `.vcf.gz` format. Default = `null` | +| `--vep_custom_tbi` | A full path to a index file for cutom vcf for vep. Default = `null` | #### Minimap2 Options -| Parameter | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `--minimap2_ont_model`| specifies which model to use minimap2 with for ONT samples. Default = `null` -|`--minimap2_pb_model`| specifies which model to use minimap2 with for PacBio samples. Default = `null` -|`--save_secondary_alignments`| A boolean to specify if secondary alignmetns are kept in aligned bam file. Defualt = `true` -#### ASCAT Options -| Parameter | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -``--ascat_ploidy``| integer to enforce a given ploidy value. Default = `null` -``--ascat_purity``| integer to enforce a given purity value. Default = `null` -`--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` -`--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` -`--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` -`--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` -`--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` -`--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` -`--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` +| Parameter | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------- | +| `--minimap2_ont_model` | specifies which model to use minimap2 with for ONT samples. Default = `null` | +| `--minimap2_pb_model` | specifies which model to use minimap2 with for PacBio samples. Default = `null` | +| `--save_secondary_alignments` | A boolean to specify if secondary alignmetns are kept in aligned bam file. Defualt = `true` | +#### ASCAT Options +| Parameter | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------------- | +| `--ascat_ploidy` | integer to enforce a given ploidy value. Default = `null` | +| `--ascat_purity` | integer to enforce a given purity value. Default = `null` | +| `--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` | +| `--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` | +| `--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` | +| `--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` | +| `--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` | +| `--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` | +| `--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` | ### Updating the pipeline diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 7b56a332..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -662,4 +662,4 @@ workflow LRSOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ \ No newline at end of file +*/ From 7b773d0f298a297c6bf85baff0332c3fba2474ae Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 12:44:43 +0100 Subject: [PATCH 553/557] prettier --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 7b56a332..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -662,4 +662,4 @@ workflow LRSOMATIC { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ \ No newline at end of file +*/ From 74990b85fb3c93850c1e980e589a75257cf4aa3c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 13:59:50 +0100 Subject: [PATCH 554/557] final 1.0.0 release --- .nf-core.yml | 2 +- assets/multiqc_config.yml | 3 +-- nextflow.config | 7 +------ ro-crate-metadata.json | 26 +++++++++++++++++--------- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 27d6da9b..662ad88c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -39,4 +39,4 @@ template: outdir: . skip_features: - fastqc - version: 1.0.0dev + version: 1.0.0 diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 1a75540e..4705d98d 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,6 +1,5 @@ report_comment: > - This report has been generated by the IntGenomicsLab/lrsomatic - analysis pipeline. + This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. report_section_order: "IntGenomicsLab-lrsomatic-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 76ce3eaa..8b7c724c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -225,11 +225,6 @@ profiles { // Load IntGenomicsLab/lrsomatic custom profiles from different institutions. includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" - -// Load IntGenomicsLab/lrsomatic custom profiles from different institutions. -// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/lrsomatic.config" : "/dev/null" - // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled // Set to your registry if you have a mirror of containers @@ -349,7 +344,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'main' nextflowVersion = '!>=25.04.0' - version = '1.0.0dev' + version = '1.0.0' doi = '' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 4022ff15..67aa24f4 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-11-20T09:56:35+00:00", + "creativeWorkStatus": "Stable", + "datePublished": "2025-11-28T12:51:54+00:00", "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst prepare a samplesheet with your input data that looks as follows:\n\n```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\n## Credits\n\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\n## Citations\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/main/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -40,6 +40,9 @@ { "@id": "modules/" }, + { + "@id": "modules/local/" + }, { "@id": "modules/nf-core/" }, @@ -93,7 +96,7 @@ }, "mentions": [ { - "@id": "#75fcd790-ddea-4e5f-ad8a-a3bcb0ee570b" + "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +124,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-20T10:56:35Z", + "dateModified": "2025-11-28T13:51:54Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -141,10 +144,10 @@ }, "url": [ "https://github.com/IntGenomicsLab/lrsomatic", - "https://nf-co.re/IntGenomicsLab/lrsomatic/dev/" + "https://nf-co.re/IntGenomicsLab/lrsomatic/1.0.0/" ], "version": [ - "1.0.0dev" + "1.0.0" ] }, { @@ -160,11 +163,11 @@ "version": "!>=25.04.0" }, { - "@id": "#75fcd790-ddea-4e5f-ad8a-a3bcb0ee570b", + "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d", "@type": "TestSuite", "instance": [ { - "@id": "#96bff4ee-228f-4a92-b1d1-e4fc3c4656c5" + "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6" } ], "mainEntity": { @@ -173,7 +176,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#96bff4ee-228f-4a92-b1d1-e4fc3c4656c5", + "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", @@ -210,6 +213,11 @@ "@type": "Dataset", "description": "Modules used by the pipeline" }, + { + "@id": "modules/local/", + "@type": "Dataset", + "description": "Pipeline-specific modules" + }, { "@id": "modules/nf-core/", "@type": "Dataset", From b4e9ee00b6816f07727e38703c2ff12710431102 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 14:27:06 +0100 Subject: [PATCH 555/557] snap --- tests/default.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ccd6e7a6..e8071e7c 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -82,7 +82,7 @@ "wget": "1.21.4" }, "Workflow": { - "IntGenomicsLab/lrsomatic": "v1.0.0dev" + "IntGenomicsLab/lrsomatic": "v1.0.0" } }, [ @@ -369,6 +369,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-27T17:37:23.810503056" + "timestamp": "2025-11-28T14:26:44.508445086" } } \ No newline at end of file From 592a118552971703798db2925c1fffa8b588fecb Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 14:49:15 +0100 Subject: [PATCH 556/557] fix clair stubs --- modules/local/clairs/main.nf | 7 +++++-- modules/local/clairsto/main.nf | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 74d812f3..21241d6f 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -50,8 +50,11 @@ process CLAIRS { def prefix = task.ext.prefix ?: "${meta.id}" """ - echo "" | gzip > snv.vcf.gz - touch snv.vcf.gz.tbi + echo "" | gzip > snvs.vcf.gz + touch snvs.vcf.gz.tbi + + echo "" | gzip > indel.vcf.gz + touch indel.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 20b3f038..130baebd 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -62,10 +62,10 @@ process CLAIRSTO { """ mkdir -p output - echo "" | gzip > output/snv.vcf.gz - touch output/snv.vcf.gz.tbi - echo "" | gzip > output/indel.vcf.gz - touch output/indel.vcf.gz.tbi + echo "" | gzip > snv.vcf.gz + touch snv.vcf.gz.tbi + echo "" | gzip > indel.vcf.gz + touch indel.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": From 0c991222e5fcb98d594be26b9e458f683c888c6c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 14:54:16 +0100 Subject: [PATCH 557/557] prettier --- modules/local/clairs/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 21241d6f..29837fd9 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -52,7 +52,7 @@ process CLAIRS { """ echo "" | gzip > snvs.vcf.gz touch snvs.vcf.gz.tbi - + echo "" | gzip > indel.vcf.gz touch indel.vcf.gz.tbi