From 8957d93a3e0909a5073d176074178f2e0bf3801b Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:42:06 +0200 Subject: [PATCH 001/109] added new modules for cnvkit --- modules.json | 10 ++++ modules/nf-core/cnvkit/call/environment.yml | 7 +++ modules/nf-core/cnvkit/call/main.nf | 36 ++++++++++++++ modules/nf-core/cnvkit/call/meta.yml | 48 +++++++++++++++++++ modules/nf-core/cnvkit/export/environment.yml | 7 +++ modules/nf-core/cnvkit/export/main.nf | 35 ++++++++++++++ modules/nf-core/cnvkit/export/meta.yml | 43 +++++++++++++++++ 7 files changed, 186 insertions(+) create mode 100644 modules/nf-core/cnvkit/call/environment.yml create mode 100644 modules/nf-core/cnvkit/call/main.nf create mode 100644 modules/nf-core/cnvkit/call/meta.yml create mode 100644 modules/nf-core/cnvkit/export/environment.yml create mode 100644 modules/nf-core/cnvkit/export/main.nf create mode 100644 modules/nf-core/cnvkit/export/meta.yml diff --git a/modules.json b/modules.json index a3f3a8fd65..b43557f89b 100644 --- a/modules.json +++ b/modules.json @@ -76,6 +76,16 @@ "git_sha": "f53b071421340e6fac0806c86ba030e578e94826", "installed_by": ["modules"] }, + "cnvkit/call": { + "branch": "master", + "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", + "installed_by": ["modules"] + }, + "cnvkit/export": { + "branch": "master", + "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", + "installed_by": ["modules"] + }, "cnvkit/genemetrics": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", diff --git a/modules/nf-core/cnvkit/call/environment.yml b/modules/nf-core/cnvkit/call/environment.yml new file mode 100644 index 0000000000..3b96de7008 --- /dev/null +++ b/modules/nf-core/cnvkit/call/environment.yml @@ -0,0 +1,7 @@ +name: cnvkit_call +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::cnvkit=0.9.10 diff --git a/modules/nf-core/cnvkit/call/main.nf b/modules/nf-core/cnvkit/call/main.nf new file mode 100644 index 0000000000..fade6df0fd --- /dev/null +++ b/modules/nf-core/cnvkit/call/main.nf @@ -0,0 +1,36 @@ +process CNVKIT_CALL { + 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/cnvkit:0.9.10--pyhdfd78af_0': + 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + + input: + tuple val(meta) , path(cns), path(vcf) + + output: + tuple val(meta), path("*.cns"), emit: cns + 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 vcf_cmd = vcf ? "-v $vcf" : "" + """ + cnvkit.py call \\ + $cns \\ + $vcf_cmd \\ + $args \\ + -o ${prefix}.cns + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') + END_VERSIONS + """ +} diff --git a/modules/nf-core/cnvkit/call/meta.yml b/modules/nf-core/cnvkit/call/meta.yml new file mode 100644 index 0000000000..64dc336869 --- /dev/null +++ b/modules/nf-core/cnvkit/call/meta.yml @@ -0,0 +1,48 @@ +name: cnvkit_call +description: Given segmented log2 ratio estimates (.cns), derive each segment’s absolute integer copy number +keywords: + - cnvkit + - bam + - fasta + - copy number +tools: + - cnvkit: + description: | + CNVkit is a Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. + homepage: https://cnvkit.readthedocs.io/en/stable/index.html + documentation: https://cnvkit.readthedocs.io/en/stable/index.html + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - cns: + type: file + description: CNVKit CNS file. + pattern: "*.cns" + - vcf: + type: file + description: Germline VCF file for BAF. + pattern: "*.vcf{,.gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - output: + type: file + description: File containing copy number information in new format. + pattern: "*.{bed,vcf,cdt,jtv,seg,interval_count}" +authors: + - "@adamrtalbot" + - "@priesgo" +maintainers: + - "@adamrtalbot" + - "@priesgo" diff --git a/modules/nf-core/cnvkit/export/environment.yml b/modules/nf-core/cnvkit/export/environment.yml new file mode 100644 index 0000000000..a61b2765f6 --- /dev/null +++ b/modules/nf-core/cnvkit/export/environment.yml @@ -0,0 +1,7 @@ +name: cnvkit_export +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::cnvkit=0.9.10 diff --git a/modules/nf-core/cnvkit/export/main.nf b/modules/nf-core/cnvkit/export/main.nf new file mode 100644 index 0000000000..b65c10632d --- /dev/null +++ b/modules/nf-core/cnvkit/export/main.nf @@ -0,0 +1,35 @@ +process CNVKIT_EXPORT { + 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/cnvkit:0.9.10--pyhdfd78af_0': + 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + + input: + tuple val(meta) , path(cns) + + output: + tuple val(meta), path("${prefix}.${suffix}"), emit: output + 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.args.tokenize(" ")[0] + """ + cnvkit.py export \\ + $args \\ + $cns \\ + -o ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') + END_VERSIONS + """ +} diff --git a/modules/nf-core/cnvkit/export/meta.yml b/modules/nf-core/cnvkit/export/meta.yml new file mode 100644 index 0000000000..836baa1b58 --- /dev/null +++ b/modules/nf-core/cnvkit/export/meta.yml @@ -0,0 +1,43 @@ +name: cnvkit_export +description: Convert copy number ratio tables (.cnr files) or segments (.cns) to another format. +keywords: + - cnvkit + - copy number + - export +tools: + - cnvkit: + description: | + CNVkit is a Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. + homepage: https://cnvkit.readthedocs.io/en/stable/index.html + documentation: https://cnvkit.readthedocs.io/en/stable/index.html + licence: ["Apache-2.0"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - cns: + type: file + description: CNVKit CNS file. + pattern: "*.cns" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - cns: + type: file + description: File containing copy number segment information + pattern: "*.{cns}" +authors: + - "@adamrtalbot" + - "@priesgo" +maintainers: + - "@adamrtalbot" + - "@priesgo" From f8c531dd4bef5ae9ec607eb582bad1f89ad31f2c Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:43:43 +0200 Subject: [PATCH 002/109] updated cnvkit calling subwf --- .../local/bam_variant_calling_cnvkit/main.nf | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index 161c2dc21a..d690e4cbbc 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -4,7 +4,9 @@ // For all modules here: // A when clause condition is defined in the conf/modules.config to determine if the module should be run -include { CNVKIT_BATCH } from '../../../modules/nf-core/cnvkit/batch/main' +include { CNVKIT_BATCH } from '../../../modules/nf-core/cnvkit/batch/main' +include { CNVKIT_CALL } from '../../../modules/nf-core/cnvkit/call/main' +include { CNVKIT_EXPORT } from '../../../modules/nf-core/cnvkit/export/main' include { CNVKIT_GENEMETRICS } from '../../../modules/nf-core/cnvkit/genemetrics/main' workflow BAM_VARIANT_CALLING_CNVKIT { @@ -21,6 +23,15 @@ workflow BAM_VARIANT_CALLING_CNVKIT { CNVKIT_BATCH(cram, fasta, fasta_fai, targets, reference, generate_pon) + // right now we do not use an input VCF to improve the calling of B alleles + // based on SNV frequencies from the VCF file + // in the future we might consider to add this, by connecting the emission from + // SNV variant calling modules + CNVKIT_CALL(CNVKIT_BATCH.out.cns.map{ meta, cns -> [meta, cns[2], []]}) + + // export to VCF for compatibility with other tools + CNVKIT_EXPORT(CNVKIT_CALL.out.cns) + ch_genemetrics = CNVKIT_BATCH.out.cnr.join(CNVKIT_BATCH.out.cns).map{ meta, cnr, cns -> [meta, cnr, cns[2]]} CNVKIT_GENEMETRICS(ch_genemetrics) From 06a74d00cf31376b1b51e7134de30c6478cd2fd8 Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:45:58 +0200 Subject: [PATCH 003/109] updated variant calling germline all for cnvkit --- .../local/bam_variant_calling_germline_all/main.nf | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 79efd8bf94..7e3f544dfb 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -4,7 +4,7 @@ include { BAM_JOINT_CALLING_GERMLINE_GATK } from '../bam_joint_calling_germline_gatk/main' include { BAM_JOINT_CALLING_GERMLINE_SENTIEON } from '../bam_joint_calling_germline_sentieon/main' -include { BAM_VARIANT_CALLING_CNVKIT } from '../bam_variant_calling_cnvkit/main' +include { BAM_VARIANT_CALLING_CNVKIT as BAM_VARIANT_CALLING_CNVKIT_GERMLINE } from '../bam_variant_calling_cnvkit/main' include { BAM_VARIANT_CALLING_DEEPVARIANT } from '../bam_variant_calling_deepvariant/main' include { BAM_VARIANT_CALLING_FREEBAYES } from '../bam_variant_calling_freebayes/main' include { BAM_VARIANT_CALLING_GERMLINE_MANTA } from '../bam_variant_calling_germline_manta/main' @@ -26,6 +26,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { skip_tools // Mandatory, list of tools to skip cram // channel: [mandatory] meta, cram bwa // channel: [mandatory] meta, bwa + cnvkit_reference // channel: [optional] cnvkit reference dbsnp // channel: [mandatory] meta, dbsnp dbsnp_tbi // channel: [mandatory] dbsnp_tbi dbsnp_vqsr @@ -79,17 +80,18 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { versions = versions.mix(BAM_VARIANT_CALLING_MPILEUP.out.versions) } - // CNVKIT + / CNVKIT + if (tools.split(',').contains('cnvkit')) { - BAM_VARIANT_CALLING_CNVKIT( + BAM_VARIANT_CALLING_CNVKIT_GERMLINE( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, [], cram ] }, fasta, fasta_fai, intervals_bed_combined.map{ it -> [[id:it[0].baseName], it] }, - [[id:"null"], []] + params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[id:"null"],[]] ) - versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) + versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT_GERMLINE.out.versions) } // DEEPVARIANT From 46d0867213946e0d67b0cdd43847010cb0a7a41e Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:48:40 +0200 Subject: [PATCH 004/109] updated cnvkit_reference on germline call in sarek main --- workflows/sarek/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 5062470373..7d20f045d3 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -712,6 +712,7 @@ workflow SAREK { params.skip_tools, cram_variant_calling_status_normal, [ [ id:'bwa' ], [] ], // bwa_index for tiddit; not used here + cnvkit_reference, dbsnp, dbsnp_tbi, dbsnp_vqsr, From 33ffaf2f75d4a905cd616a741e1b4a2be5d5c47f Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:54:07 +0200 Subject: [PATCH 005/109] check for missing something --- subworkflows/local/bam_variant_calling_germline_all/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 7e3f544dfb..21039f3826 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -24,10 +24,10 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { take: tools // Mandatory, list of tools to apply skip_tools // Mandatory, list of tools to skip - cram // channel: [mandatory] meta, cram - bwa // channel: [mandatory] meta, bwa + cram // channel: [mandatory] cram + bwa // channel: [mandatory] bwa cnvkit_reference // channel: [optional] cnvkit reference - dbsnp // channel: [mandatory] meta, dbsnp + dbsnp // channel: [mandatory] dbsnp dbsnp_tbi // channel: [mandatory] dbsnp_tbi dbsnp_vqsr dict // channel: [mandatory] meta, dict From 65ee90059831d7f205b2fa11dfd990bf0e11a0bf Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 14:58:26 +0200 Subject: [PATCH 006/109] check for missing something --- .../local/bam_variant_calling_germline_all/main.nf | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 21039f3826..d09573986b 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -24,10 +24,9 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { take: tools // Mandatory, list of tools to apply skip_tools // Mandatory, list of tools to skip - cram // channel: [mandatory] cram - bwa // channel: [mandatory] bwa - cnvkit_reference // channel: [optional] cnvkit reference - dbsnp // channel: [mandatory] dbsnp + cram // channel: [mandatory] meta, cram + bwa // channel: [mandatory] meta, bwa + dbsnp // channel: [mandatory] meta, dbsnp dbsnp_tbi // channel: [mandatory] dbsnp_tbi dbsnp_vqsr dict // channel: [mandatory] meta, dict @@ -80,8 +79,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { versions = versions.mix(BAM_VARIANT_CALLING_MPILEUP.out.versions) } - / CNVKIT - + // CNVKIT if (tools.split(',').contains('cnvkit')) { BAM_VARIANT_CALLING_CNVKIT_GERMLINE( // Remap channel to match module/subworkflow @@ -89,7 +87,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { fasta, fasta_fai, intervals_bed_combined.map{ it -> [[id:it[0].baseName], it] }, - params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[id:"null"],[]] + params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[:],[]] ) versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT_GERMLINE.out.versions) } From 359aca68915d4706d8a799a41b9e90d87fdbe28d Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 15:00:01 +0200 Subject: [PATCH 007/109] check for missing something --- subworkflows/local/bam_variant_calling_germline_all/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index d09573986b..aea54bced4 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -26,6 +26,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { skip_tools // Mandatory, list of tools to skip cram // channel: [mandatory] meta, cram bwa // channel: [mandatory] meta, bwa + cnvkit_reference // channel: [optional] cnvkit reference dbsnp // channel: [mandatory] meta, dbsnp dbsnp_tbi // channel: [mandatory] dbsnp_tbi dbsnp_vqsr From 51adb8c6ce4e3de029ce30699c7096425653e0e6 Mon Sep 17 00:00:00 2001 From: Francesco L Date: Fri, 26 Apr 2024 15:13:28 +0200 Subject: [PATCH 008/109] updated config file for cnvkit --- conf/modules/cnvkit.config | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index afeed0bdf6..5f1c434866 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -25,6 +25,28 @@ process { ] } + withName: '.*:BAM_VARIANT_CALLING_CNVKIT_GERMLINE:CNVKIT_CALL' { + ext.prefix = { "${cns.baseName}.germline.call" } + ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } + ext.args = "--filter ci" + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, + pattern: "*{cns}" + ] + } + + withName: 'CNVKIT_EXPORT' { + ext.args = "vcf" + ext.prefix = { "${cns.baseName}.call" } + ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, + pattern: "*{vcf}" + ] + } + withName: 'CNVKIT_GENEMETRICS' { ext.prefix = { "${cnr.baseName}.genemetrics" } ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } From 89737aad29e1fe8c2ca924598ea53a716a7b65bf Mon Sep 17 00:00:00 2001 From: Francesco L Date: Mon, 6 May 2024 11:43:50 +0200 Subject: [PATCH 009/109] fixed exported vcf name --- conf/modules/cnvkit.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index 5f1c434866..bd35027d96 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -38,7 +38,7 @@ process { withName: 'CNVKIT_EXPORT' { ext.args = "vcf" - ext.prefix = { "${cns.baseName}.call" } + ext.prefix = { "${meta.id}.cnvcall" } ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } publishDir = [ mode: params.publish_dir_mode, From a04d896a2c5a1d3ad1ff3da9a7a8d832817c4e6e Mon Sep 17 00:00:00 2001 From: Francesco L Date: Mon, 6 May 2024 14:05:22 +0200 Subject: [PATCH 010/109] changed config selector to remove cnvkit alias --- conf/modules/cnvkit.config | 2 +- subworkflows/local/bam_variant_calling_germline_all/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index bd35027d96..067a215000 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -25,7 +25,7 @@ process { ] } - withName: '.*:BAM_VARIANT_CALLING_CNVKIT_GERMLINE:CNVKIT_CALL' { + withName: '.*:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { ext.prefix = { "${cns.baseName}.germline.call" } ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } ext.args = "--filter ci" diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index aea54bced4..0065166bd9 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -4,7 +4,7 @@ include { BAM_JOINT_CALLING_GERMLINE_GATK } from '../bam_joint_calling_germline_gatk/main' include { BAM_JOINT_CALLING_GERMLINE_SENTIEON } from '../bam_joint_calling_germline_sentieon/main' -include { BAM_VARIANT_CALLING_CNVKIT as BAM_VARIANT_CALLING_CNVKIT_GERMLINE } from '../bam_variant_calling_cnvkit/main' +include { BAM_VARIANT_CALLING_CNVKIT } from '../bam_variant_calling_cnvkit/main' include { BAM_VARIANT_CALLING_DEEPVARIANT } from '../bam_variant_calling_deepvariant/main' include { BAM_VARIANT_CALLING_FREEBAYES } from '../bam_variant_calling_freebayes/main' include { BAM_VARIANT_CALLING_GERMLINE_MANTA } from '../bam_variant_calling_germline_manta/main' @@ -82,7 +82,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { // CNVKIT if (tools.split(',').contains('cnvkit')) { - BAM_VARIANT_CALLING_CNVKIT_GERMLINE( + BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, [], cram ] }, fasta, @@ -90,7 +90,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { intervals_bed_combined.map{ it -> [[id:it[0].baseName], it] }, params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[:],[]] ) - versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT_GERMLINE.out.versions) + versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) } // DEEPVARIANT From f67b7f1855c2ea7187ca2bc10d0f5dc72923ae2e Mon Sep 17 00:00:00 2001 From: Francesco Lescai <53608000+lescai@users.noreply.github.com> Date: Mon, 6 May 2024 15:09:42 +0200 Subject: [PATCH 011/109] Update conf/modules/cnvkit.config Co-authored-by: Maxime U Garcia --- conf/modules/cnvkit.config | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index 067a215000..2bf455faa7 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -25,16 +25,24 @@ process { ] } - withName: '.*:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { - ext.prefix = { "${cns.baseName}.germline.call" } + withName: '.*:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } - ext.args = "--filter ci" publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, pattern: "*{cns}" ] } + withName: '.*:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { + ext.prefix = { "${cns.baseName}.germline.call" } + ext.args = "--filter ci" + } + withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { + ext.prefix = { "${cns.baseName}.somatic.call" } + } + withName: '.*:BAM_VARIANT_CALLING_TUMOR_ONLY_ALL:BAM_VARIANT_CALLING_CNVKIT:CNVKIT_CALL' { + ext.prefix = { "${cns.baseName}.tumor_only.call" } + } withName: 'CNVKIT_EXPORT' { ext.args = "vcf" From 0353e91fff9b7c61121bc4db3e93a2d9045bddc9 Mon Sep 17 00:00:00 2001 From: Francesco L Date: Mon, 6 May 2024 23:21:13 +0200 Subject: [PATCH 012/109] updated docs and changelog --- CHANGELOG.md | 4 ++++ docs/usage.md | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9cd995156..0b77f38a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` + ### Changed - [#1477](https://github.com/nf-core/sarek/pull/1477) - Back to dev - [#1482](https://github.com/nf-core/sarek/pull/1482) - Pin `nf-prov` plugin to `1.2.2` - [#1485](https://github.com/nf-core/sarek/pull/1485) - Update citation for publication +- [#1502](https://github.com/nf-core/sarek/pull/1502) - Improved handling of CNVkit reference +- [#1502](https://github.com/nf-core/sarek/pull/1502) - Specific CNV call step, with recommended settings for germline ### Fixed diff --git a/docs/usage.md b/docs/usage.md index fbd3e8d9a6..d40fa0d8da 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1134,3 +1134,28 @@ Currently, Sentieon's version of BQSR, QualCal, is not available in Sarek. Recen Resource requests are difficult to generalize and are often dependent on input data size. Currently, the number of cpus and memory requested by default were adapted from tests on 5 ICGC paired whole-genome sequencing samples with approximately 40X and 80X depth. For targeted data analysis, this is overshooting by a lot. In this case resources for each process can be limited by either setting `--max_memory` and `-max_cpus` or tailoring the request by process name as described [here](#resource-requests). If you are using sarek for a certain data type regulary, and would like to make these requests available to others on your system, an institution-specific, pipeline-specific config file can be added [here](https://github.com/nf-core/configs/tree/master/conf/pipeline/sarek). + +## CNV calling with CNVkit + +The CNV calling in Sarek implements the approach proposed by [CNVkit](https://cnvkit.readthedocs.io/en/stable/). +It is possible to call CNVs with whole-genome or targeted capture data (exome and amplicons): depending on the sequencing approach, Sarek applies different [settings](https://cnvkit.readthedocs.io/en/stable/nonhybrid.html) as recommended by CNVkit. + +### Reference background + +Given the nature of this type of CNV calling algorithms, which rely on the detection of variations in the coverage profile, the definition of a background reference in control data is known to improve the calling in targeted and hybrid capture applications. This is to ensure an accurate profiling, especially in the off-target regions. +We recommend creating a background reference with the nf-core pipeline [createpanelrefs](https://nf-co.re/createpanelrefs). + +:warning: In creating a coverage reference, one should pay particular attention to: + +- the control samples should be processed with the same targeted capture and sequencing technology +- if BAM files are used to compute the background, they should have been processed with the same pipeline used to call the CNVs + +### Germline calling + +Sarek implements the [recommended germline settings](https://cnvkit.readthedocs.io/en/stable/germline.html), i.e. applying the `--filter ci` option in the CVNkit call step. +However, this is defined at a config level by adding this option to the `ext.args`: the user can therefore choose any desired different approach by changing the arguments in a custom config. + +### Somatic calling + +The [available options](https://cnvkit.readthedocs.io/en/stable/tumor.html) a user can choose from for tumour analysis depend very much on the specific design being analysed. Sarek therefore doesn't implement any of these choices, i.e. it runs the CNVkit call step with default settings. +We encourage the user to verify whether particular settings might be more appropriate for their data. From 5af2e5d5b26bd0b1c1ed1722cd2d0c808e888df9 Mon Sep 17 00:00:00 2001 From: mirpedrol Date: Tue, 7 May 2024 09:24:02 +0200 Subject: [PATCH 013/109] Template update for nf-core/tools version 2.13.2.dev0 --- .editorconfig | 6 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 10 +- .github/workflows/awstest.yml | 12 +- .github/workflows/ci.yml | 4 +- .github/workflows/download_pipeline.yml | 22 ++- .github/workflows/fix-linting.yml | 6 +- .github/workflows/linting.yml | 18 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/release-announcements.yml | 6 +- .nf-core.yml | 1 + .pre-commit-config.yaml | 3 + CHANGELOG.md | 2 +- README.md | 2 +- assets/multiqc_config.yml | 6 +- assets/nf-core-sarek_logo_light.png | Bin 73442 -> 73430 bytes conf/base.config | 3 - conf/modules.config | 8 - docs/images/nf-core-sarek_logo_dark.png | Bin 25839 -> 25804 bytes docs/images/nf-core-sarek_logo_light.png | Bin 22476 -> 22412 bytes docs/usage.md | 2 + modules.json | 4 +- modules/nf-core/fastqc/main.nf | 6 + nextflow.config | 159 +++++++++--------- pyproject.toml | 15 -- .../local/utils_nfcore_sarek_pipeline/main.nf | 16 +- .../nf-core/utils_nfcore_pipeline/main.nf | 8 +- workflows/sarek.nf | 46 +++-- 28 files changed, 206 insertions(+), 163 deletions(-) delete mode 100644 pyproject.toml diff --git a/.editorconfig b/.editorconfig index dd9ffa5387..72dda289a0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -28,10 +28,6 @@ indent_style = unset [/assets/email*] indent_size = unset -# ignore Readme -[README.md] -indent_style = unset - -# ignore python +# ignore python and markdown [*.{py,md}] indent_style = unset diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 440d6f39a7..e322567d91 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nf-test test main.nf.test -profile test,docker`). +- [ ] Ensure the test suite passes (`nf-test test tests/ --verbose --profile +docker`). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index e9a44d1333..b844e91d78 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -8,12 +8,12 @@ on: types: [published] workflow_dispatch: jobs: - run-tower: + run-platform: name: Run AWS full tests if: github.repository == 'nf-core/sarek' runs-on: ubuntu-latest steps: - - name: Launch workflow via tower + - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) @@ -33,7 +33,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: Tower debug log file + name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index b3061e0521..702a1eadea 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -5,13 +5,13 @@ name: nf-core AWS test on: workflow_dispatch: jobs: - run-tower: + run-platform: name: Run AWS tests if: github.repository == 'nf-core/sarek' runs-on: ubuntu-latest steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower + # Launch workflow using Seqera Platform CLI tool action + - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} @@ -27,7 +27,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: Tower debug log file + name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95eab89afe..7990301999 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,10 +28,10 @@ jobs: - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 08622fd516..2d20d64422 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -14,6 +14,8 @@ on: pull_request: types: - opened + - edited + - synchronize branches: - master pull_request_target: @@ -28,11 +30,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - name: Disk space cleanup + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - uses: eWaterCycle/setup-singularity@931d4e31109e875b13309ae1d07c70ca8fbc8537 # v7 with: @@ -65,8 +70,17 @@ jobs: - name: Inspect download run: tree ./${{ env.REPOTITLE_LOWERCASE }} - - name: Run the downloaded pipeline + - name: Run the downloaded pipeline (stub) + id: stub_run_pipeline + continue-on-error: true env: NXF_SINGULARITY_CACHEDIR: ./ NXF_SINGULARITY_HOME_MOUNT: true run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results + - name: Run the downloaded pipeline (stub run not supported) + id: run_pipeline + if: ${{ job.steps.stub_run_pipeline.status == failure() }} + env: + NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -profile test,singularity --outdir ./results diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index d0354d3ef8..8d6428f8e2 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: 3.11 + python-version: "3.12" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 073e18767e..a3fb254144 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,12 +14,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Set up Python 3.11 - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - name: Set up Python 3.12 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: 3.11 + python-version: "3.12" cache: "pip" - name: Install pre-commit @@ -32,14 +32,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - name: Install dependencies @@ -60,7 +60,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index b706875fc0..40acc23f5b 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@f6b0bace624032e30a85a8fd9c1a7f8f611f5737 # v3 + uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index d468aeaaec..03ecfcf720 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -12,7 +12,7 @@ jobs: - name: get topics and convert to hashtags id: get_topics run: | - curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ' >> $GITHUB_OUTPUT + echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: @@ -25,13 +25,13 @@ jobs: Please see the changelog: ${{ github.event.release.html_url }} - ${{ steps.get_topics.outputs.GITHUB_OUTPUT }} #nfcore #openscience #nextflow #bioinformatics + ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics send-tweet: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: "3.10" - name: Install dependencies diff --git a/.nf-core.yml b/.nf-core.yml index 3805dc81c1..ef7b7ab3ca 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,2 @@ repository_type: pipeline +nf_core_version: "2.13.2.dev0" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af57081f60..4dc0f1dcd7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,9 @@ repos: rev: "v3.1.0" hooks: - id: prettier + additional_dependencies: + - prettier@3.2.5 + - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: "2.7.3" hooks: diff --git a/CHANGELOG.md b/CHANGELOG.md index 37417ceb38..c35a2a8112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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). -## v3.5dev - [date] +## v3.4.2 - [date] Initial release of nf-core/sarek, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index e671a7530b..0283867a2c 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![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://tower.nf/launch?pipeline=https://github.com/nf-core/sarek) +[![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/nf-core/sarek) [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 01da549cc2..222ad8b86b 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,9 @@ report_comment: > - This report has been generated by the nf-core/sarek + + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. + report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/assets/nf-core-sarek_logo_light.png b/assets/nf-core-sarek_logo_light.png index c499be35647eba4a58d074498488e719ac7d4e3b..483f8106828a2fd7f6d2963be77c973ee50146d9 100644 GIT binary patch delta 38819 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%0D#3v^2UW&xVF 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 IKYdRAKexJm5dZ)H delta 38830 zcmdqJc{r5)`!_xdCflfxilIV6CE521O%yUnDa)-zvS&oLYbF&D%F<>lOSVuEvW~l? zm26SAiE8Xd*0Me4Mfd0a{PBB^@9#K%zvKDiIgZ@jN6h;=m)H3^m-l)3RLRj>$?;es zP$yhj>r(ha`<}h0h2^K8riu&8hx^z6A~iG~jdo~r(68N@+kW`*{Yy<8hO3otWJo?R zJHs@6IycvM_Xfw>nAj76GT5%z%YjDl-}*o@QWXuX@`uY@Xi7uwGF*A;y?38AsW|ZQD;kXT73^ANGah&Uw25!^TbESdzdv@7 z_1_`nJ-(uXJLa5rxf~fgmC}8{dEKFUamS`Ho(Fa^^RDYi_l-qg_Ari<2zp8lHPMzH zKED?a+6WT#avRU7s^aa|bSWCv?I#?dr11Cp*d3ma8u`??CZg~LKA4^Fq)??5Ex9;wgEnqmi&Rx7(?t^Yas-tqje zRsH!AVr4_oPE)#{zCCihUg-K-DOc^sG2PB%y8VA$kr3TzbHUh5vHRGC59=8(A06{e zQdPd#R(IE@?Y{H*&&;fuaVLSAZ?4rOj&A{d;j3 zaoZDX43gI$COfNN-mIghxi99o>*|6Dn^!KCV0iKkqnPx≪tR-=&(*x4Ry*hV#_A zZ{?{aKM~N*ReO6keSPtE(GMR*S)D#V>uocCJf5!$^>6dc+f^jHSgIDY!Df+VvTrPo zG`f+OUy<6zIGZ|CEn}_8efHPc(C)`hzqV!09u-9N3y;428LiSdH(P6EZ`k(ouHil|89jdVr0cAl6`I0 zh*f$mk2(*H8Y%8|WCDjLJI%)`v!>xyBUa^biMdshE|UK2tL*xw^Mz@6<1FM{=3L^( zQEH{?F^X-Mf~Eu4#lNG|o6fTVzEU-AjaaN|H1Y81t_`G*WK@By4sJbSaC&@~IB8RS zn9Tg6`>n37{1w~EPKN8QA#E~Rv#vfRfu@tDb>;@hkb&wWWpwERbq~gDwy`Xy*tZl0^8*ewH(hO&0cd(+1w)$wFHn&OI8=Oitw)yaii!qd@^{~IaA7jL$ z{JQNTU1t7(oZ|8^ln3r+>Kdpd9S$`$4exW14rZMo=mT08C5EJYClW4PkGgZ|AkE%@ ze1LL)uf)7-iRWVHgZ@=UHp2fL5t8yD4R3kOM|8d@70-2|3w%2_fAiDJnw2x6!ijfM z&5E?TuED2xl>0+c__KSEa^sv;|2aTn*%}}Nf(p^$aqrW}1R13jaLe%z`$xPGrDpwuo*yH;76Kyd`bfRz{OV?;`LaQbpHASdThS<>OBUQ`Bc z;<7|`_cGS<3Z~Afh-%>)B0vsqrUmL5R{@8R{xDtkWpFRB3HU~?#hu-JPIZtiy8B*m z1VqXscbSiq$Cu4wBbj$CM8f&>Gx2#$L7L4HpXoW@vOe^jN5r;^SXV>>K$F}1=bRCv zc7EF2esWe!egv_hJtQS44bOFyL=J@@&wCWrgY4kS z4~shN%x_3AK)IG--bk{bo+xilx(+r!05&K6T@x*JWhJ152WKx^kWyURewT~iN!K+y zpn=TZ)$q~y9duW;BWX0LaSi27%lPFKzRrTKfgk;=vkk-rw6|$G^5he$NT`I5MO!tK z+=7P70F$pi1&B3A5^tspU(C1-gkhQ0$7IofY|MZQar5$JY0=Z*y{e;U&S-A}+Nr2N zSe6NqNQf3n zGdodCfB~6r8$plq;h9!fM$1H8iVX1JX~=^Y@I(|Ke1SV5hZv`thDfk&6pW<*LC3($ z7-5~wntS3cGiwC=^4f}A(4;hGtN;#0a%{m_42Yag(X3BaPkLN^%i72gdPdq?KxQ$B zTu8kDGRoI24!bqC&_X2gcp;hDYhe<|ezBAm9Tymi}EEWF}PmfHMgqQ=OTn-|s9W!nHG)y_B z+>o4g9wKKb*BxjFaPI?F#QIUFG@1b%y zU*<69=bXqMEzK>j*FdaBUC0dJ^*l`_r;Lb@cI`>#PzDobXFa6I@8JLT~0Q!kEe0ogz zHqA}1{{nRy`d4MAK&rTfFb<-*BDN75W4YTbjJOIwOUYizz`&$yUhEFQ6AZ{%l*Nst zk5199Dxx#jqO!`46h7I!Yi-vW=CXW){(m>DX8(XQ8|?U%!8Odx5z~^Ww$H{*l@}eU zdo}@rjcb7hjADwOmJx$7-Dq8z-NAHPg{W`Wbi{~pK&82cc?nf^P!kYi2plJ;xoy=4HwCV2eAt96ZQtbj~aQ|f=)6(VDVCSm}%r!bpQ-0uTSZR1A$|6gwaop%Wf%{L zu^UTK5RHD8_wMQ8fMenqbs%mP*x~nJ(h(m^G$j6k*k$c5C#WN(;xDbxN~4Ax2|yhUB)#Ydjst-h720K|??M#^W*l90-V!v?)J%P8XW(Ug)OJA|VkFBRb1+rX zxOXJ)Oy3)@P#Mr~Ii?{TauT-#`^( z3Z=pvIkd&xqkm!pGlelke`-5!-sV!NO3>X%GT#rRDavf`k8-FEBi_i#>Kf?gnO7}K zle$WifS?FT(@*zdk1>YPZgT%voV8Jtj*g1v{mZI^VxSwT6^=Rwf&Y%yW9S?A`Us-{ z$fPe7(H~3&J)1yJ-uDDMLOL_OHG7CjV4enDt~IWari#@TZ1C~1D{rpU)!di!Sb|K5 zJ0Ph396+b1X&?{Tz61E)7i6$VJ^mJYB3C}k5o6|Z?tck=#g{6e_LWMc%-24Wxb3b9 z%>q#HpmB4^qgGdhujF22gLz{AgiW~Mt+&Ij%<2BHJt=Uks3AEHXxLAa{WoZB$CA#I zD6q2q%*9Xx!G}`y2lF9tCvd?!5=puAFA_U!9u{h`5r z-5(Y6MGGp+Kg2Q`z#xHkg~*y+kc#a#l6Id3q4Gg#UWOh`Qg-Phfd(B9$E**Pd|!tS z=-CzmNrym`u7O&~4o(kb_QIJPaJo=>FQx&F8rHR#05+bqy3P|kH`Er4hvK~*bKhpq zOiX0;N6Bic!qbh1jVy=4Uj;)sDw~J~3nDdO2VOZ&e*(;R491{Qsr{K7 zxL|rW^AgZ}fBy|RFm5>*w~v01Zf!AQ9lnIQ6Be~HEMn|TV;$}*rI5A|au zm)Wml7rMHp8#gbsl$Z6T37LiQRIMj%;=cry%m(%X7&Ji9(>(XH`g{4RPxj!N`!frl z8)Qube+f9$F(18kRuK(Au%VDG_KMD)M`dbX7$5pt`Pt{|{Buz#t8&y<;$|awNSaZX zre*BDjxElV0LK)yx>^P^b|(R74g*M!=6;@4_T*>lgnPXlZhz`L)7np4+s>_y7VxV{ zO#+qjr-4T_)HAl%pY<&hfl?9wEe)()g2>ml7V4pryn1M9mizfm*Ev=3Hi$;-38V3a z&owlBj?c`iewyrW${3H6QB%&vq_)Zg&Q3MW)Sjz#`vo?Ni*~7$=~DoeX!f~K#nCB7 zGRJCBPSlJ8c*ZNb*WWJ&A)^2XNsJy^A*~I6{MC^US&Gc!{;;*Bhy;5M{24%feQ1z> zt_oMNQ$6EQR5bAhml4dQc-3{v(s0RKC&2vOJy3N-MadR+zh;fYX%-AChKKBaxsKXf zR;Y3L{4PRHID|_e=@~&n|OU_`)W7w?1aa+2>|K%2Ie`Y8lxKjtn5;u zfE~BxK)_-OI23`8P>vxxfRH)0fk|=GQN;exuTL8JW%CObSJgU)MThN(DZ0Lr(nf-K zUN^20o>(2;v%0hxmN8>M8~tM4=u=Ln;%96?&Dxs9w!h zd-KEtEF)bdnDM-S=-+mcBnmaC^o)m4h+|hdU1FXuI?^4V$W!5XMdAWmGTwlMOdLZ? zN0|}R85^ccBT2XwXUCt&JrAr>0SAj6Zk4b0$EO4VgPsM%%6V!a>;MO$cID!oof5QP zK!{Jd+0Vdck=<4z@vUG zP0t{zfuWnBS5RvTt$JpE8-5%KI_MEr1|tnWH!ujXRyLvsLx!f{{lLv8bTXyWdTBipo))e)=%im8#P4TMHQ?sQ>v5XG z0d;^-rPPp5>1r0tA2J zla^8Tr2okb8Jt;vWtU>{0dUV=p|&c^+DL{PnhoDWHVm+Li0+RHZ@=EFTti1TWC}z_ z60voM1AF{DPCg_vuU(|5uh3r0f=I11Nt7JQci%Q3`o)piC+@kQOIMZRN^kXsUls1L zpqrIpIG%o1m+<5eJBUZRj4ZnMKgSe<0)*ef=kI-9KqjX%-*=?oR zeF#O9T?bGrZXR;hy|b9P8Sxn;r`2^k*Jx?S$r#7}Lg|^sw^Akr0=-NpljO#L`AR?^ z=d2ARo2_zaX~S_HQ^1uh)M~z00y^&!V33e}sKkIBs|*wkS|-0-?zMbTm(M;4<wBz)SBYpvOWyB-kCb97Gdeh3fDEayE1^;ONPv3)(Tm;xzl@S3=fCD%CE;Lm+ zG!~g)`M#Sm(70yE1;V9@VZ^|H`l)d7B}%5VuPZ2(G@~5R6(^Pb+U6XFio3vnh|AIKsj@2s~(%jI!$|x`en!Una_N6*vK2` zn)mAxE5yyd4u!tFM`()xIlIVv-gTQ&t{006W$sov;^(?gaeBPxA?T-e0uwG_#U#46 z#Di0lpqF3bN9MK5GWMOpnhoe+z5rSU7{?esjOuM%Ti%acKMMbbrugL}z9mXewK2>GIOR8Bju02qEeTy6U?{kLI`fE@ZYCUHi;FoGlodM!| zK>7ktZM6nbrH)vOsm$DD(9>9?aE)B459w1zNZc9yRJ z!LnsFJH0>bnTocm|E}5yk<62waM{4~W2K8i>TsD*!VqZLsIddPWib~ z&w|2d!@th2Yo2tMznFAa`M@7&f!$3p3Iune>CLx;PRm@c{CxH75$a`2UmzhdKM!iC zr5eyMnW=%!E(q)^5N1Jz2ggRXBg~VG+fYcU@eOCklwb?fB;|%>!GJqP7_RV4rErVg zdM_tO@x|g$X!&pKNlBMo86}&9K$R)%c?yo+Um3f8QK?M--d6I|)#RAoptXbyN_D09 z9YMI4viI;Un@Uyut(e$?oFW9_fB_5UK>_ ztnLUgbSmE>0k-s}k&cWbIy~x-bE(z3GFETQg{&VqFNlee9;ZS$Xu!`POWgCs^~p5? z&l>ouJd9jcy5M_u9vtgnEF(R&zv8!PtIq~@K3GiN#kY)QapLo4=N}}jt1u{+2|is> zj`(QtVnY&54@#2y7H*mNXD}%1qL+|;`NG z^ANb8lHX63>7&rp1*jaNmFx!<9oG6?EN^xrhaRxWSbDhryV1SP;K8t7jxae5=%gt2 zT??88kg3h*^ltHs>@gH9 zQ(OUdongrVmjMb>2Yfzi3xjZJz%bF7W;H@hF)P-xHM5N$Jk64we_oEQhL&Jq7^K>& zBy4#G9_5Cu`_M9%LL2Yt^qU)KsP+qNR9f`tX7s_Th3dvtq$Z@Ly~PyMA5J=cC| zXi*bu{lQZIhAmBUZeed|-F`AHf@VEAcM@L?0$;tJD7Eakm@@`2M`1*GwQO1*P|@%_ zRxdbet?ZKeR~xx}k7N`8N$!Q-_yQq$Lzg0F3DzDO#1`Mst0xTu#2>_uaYJ_oT0F>DL+&JJtDO7k9r-z1!PuN2+fNdW>nG{g%pkd}n{>uQ}(@ zu<7pZ`{!Pv)V2%E7sQlu2n`N=Z*_-%c;n=gj4vxUC?9S>==g^BtgluoGn9K^hDCr* zKQYrFblwA+T{6{5b;XcUsWQWjyF56qqNBZo@V#l28%pwJriO8eyMf&1!IYnxH&~)8 z5hQH)Zrd>rT)uAKk7*D4-!tRKll=$c3Be=9hI1y5zMrK=gqe;M~CuJIRrwyfX2cdOgo;A zR<+Q0f8AvI-De%!9vuG=O$B^nxb4^7Z*oCt)z0B}`adm~kYn@I{E$88_VwbTNm|g* zv{E^id+agZK%b4>tt8%w7`>qBa3pE2lvknSYoztU&^U4&sh}p2CG1P5rt!(h_$BH> zQUu{Ur$_;&TT^h%4|u~P++v5GfUByY#7UAXT=KQXuQWtgA@pPEw-3+%C`?ZVDqO=J z1V9SEqB|99b!nyQOPK&nEBVy<$QeykKaHU!DSy3%tQi+t`tM_Hg26|M6xln&zcwIq zfH1plUqYtom%t%bMFK#>4tN+{Sv65|b^Mi_cFD{0Kea z|6Q`$Ybw%-$j{%UO&U{bCqrpFH#y+%1gw?^=vw01i4j+`9rL}%*TM?7lwO&)=|cP6 zlU^!n*Te(1ZlfatKsNHF!s_Wz97>S3ICp_wO0?U+vR2TPoiRVbvXZVdBpl#TO6q&L zj_nRI&q2N@x$|mDZ3$)pNYF+-!X9s2O zDc#^^EOk+bB<;_SUy@c+usdIWDCoNG23*y11oS36YS01}OKL8!8j@fjI8jq_r?P0f z#gp`>D@dM#UVH)PNrhaqZwwm@;~wlm+KYfpGozeRz_?p@fnv<356y7x4;WTpctE9p zd}$!0%_XbA*@>;p43`NRu$NDMx%c>8`%3?>DMaK~$M-_w^U1gP=<uJ1kjY!{3D22=_5=WDU{WrJ4>M-%VN2UP2h@}0%XC;*agXD?m>GwZ`w!~NOc z(-$4)2BH%7qx|*fG6+b0VHJB3($*ocGY8u-yys=i7SiWYsu^5+Dd+vbp>!ZOh-ATR zLlcT<|H!A7_RU@yZG)~{^CF&I5OwYFH39HYORkAl%R@Vt_3ZJ0Iq$6-$`4Tf0~&Kc5Mi6=`o)C+A#;l1Yy#3pK{$)#{3x`zTp= z)xWYv*LofudxBOkWJU?i;uZNv*XPh^z0)9t4h`vTt9u}f1mg0aPe)ZShmWr_SsW~$ z-if@A@U_!?b3rkF#vN4o`l&-;w%4s>qRHeqtIEGFPp$Lp^rNY=t@4awh6jrLoV*$J zA49pn1p%C)G#RW1fjH{asSNezKQ1{ob}duQV*X6ayG!2bO%MltAUkqQsKD`HqfSn| zhxv6yY5w~cG83Qy_{!M8&~4PA7*@z?I)v+@wP;w>4WS%~kQ8AzzKX{)rKdq3g3yxf zcmh6<2_*`IkM3udKx zAJ!ze&a>Kvi;xe)KZcJ9gpc04#1ZHQ4fYJ7yKqXp?hpnYZeX-w_&IT-v|_3^Zy#m# za>qkK#}Mdv$i(a0WMNuB`cqKF3EBj6W^Ut-oXBRn^<@67SmpbGyAPnDGeZFaBOrY@ zOl*$h6e3|LU(0ZU6n-UvH2VZmBiKQ20fmA8PIjiSxb^ku_e1aELjW4wr4sBLCGO8Z zH_O}+TN)WjdZ4FZ_f+Yzx8BAxUqF>FZV}USUkoGE9bZi=d%jcC;U2!d&;J!BWP!+AC)1p|3HZofR9f6 zMX*j-3F&EJXNofvZYKdZd5m#C<)SmM+Gy6mqZF|cg={_WLnQb?Rw!gh#9-#YX{ZT) zV3x$u#XUm;azO5i>SHVF%X6*-v5I?39s>~cj^Q;gbHooGneB_D=MC`t7j^o6Ng@QY zBuK?~Rj8~9wT^F(GTjP4H;t%uGHc=-4l5}uQ|DT{=G!dRb!)Q9OS%{D56Ns5xbA)r z3+qjrR;b?rYUQ=+FuR-IFiU*w<{4uN)iW~l4rEhhCd`W7yJsgs=pI$Eqv(L_TK*wJ z@8~B}1JYwIu4^qj^6ffU{sLH@a#V=)IO{%sLjd@LQESA>5_4G~F!f?i@HbZ75LY=J?ZmVXl2M^e@QXl_o|S z2Al{CC#DHiynMa6LFuwklJ>w5qyb}^YGZvct0D@k+ah}0I48TCIo1U-?`C?>8YC3G zH*dsRd>hb>x#dhIWSz)QxzpL-p5Pwv@`+j(7h~ba`>Jv71Z9?DVh#x9&SS zE*_sIHkLkk@W9j;8F+c=ito;LFkE>aU5{@|qL*Hx{1xa7E&W4QK0g3|ZkLuPm#5}0CE z4M_}M7|t0rZjO1IskS|cul6xDvtL|x`Iefxyxh1sTRF!+fTBG*V{KH7$;pI<1S-4&m={icV2Wi+*kN2np%ttKJ<)p&xghfuq!Po@VZAuiBL#G6iG=11k2uQyR!>g;b zwB_sZ*!*lUWQOrVHb0?sr#gATXLD5LktX2C5+EL02z%l|em-Y1{6i0v7~a(D={4~G z2v289FVE(>jE&0C*y)HU*ej%`z;&#gG(h7zC&-z!(#y!@fL4?F3GKXhcsn;7Pv3As zj%~@@3xFT)zq1?IE)yrfp^I>C=dL$LIQi#l;EA>9 zQ!k<>wHipch=zd+D(cnVYoSgUy$p43{Z>yEHqn6vM^D4ir>Tcq!Ph-F0fHUhY(wFf zo!DeZazhxc`i})*^1IW`w@eQLBNP{ak-)9va&n$p#8t%g z8l*%6oR6o4pch_A0OB6ZG*{GvQsTZ=FO^zu4gpw*lL^R6f_@Bv5C92arZjVxu|QLx zBrc}bc&%ffamefz&b3D;!Y{X)MBK)~X568gqd*#~Nt?4LwZD@G3-qF*-CVmH^t+T}R>7eGJ{JZSh9$^KRn2o{P(>Vr z&4@osCh;)g87#0!#iy4g2*PzzjMQ?5PGYFhJm4n@xB|Q#u4vzjLDmVT6q5kD_V(Y= z1aaJ$2rn31oV_i)`D8NQb@j%rG(!eABNL$6lX_Ch*>>{k<}oOgz3J9i5A20&c}+H@ zT(es}x3F1QJ@ZjnC@7(Tabo&HD=YW42>^Nq09vyGQWY4qEb&xS!Aw-pZ%yqiYwr^) zyo+qDk@QK106Zc7fl3*2aO_%z9tOQg@Oa=ynSREofAH57m7DF%2rU^uBGLJT{00V6ylO-gXl7c{tBsh8(Z3UzFGx6}87mNo&*1BDChfEoM#k2W^e~9O3R`D_bgD{)hl)F_Awv(~CJHlvz7ZoDBe=g_#T%0Pm}@ zi(oZiR)n1gQ-}Dk;F=VBKuYerqc-T`_0)7DY{X8KT@LW&oti^5yli2&CkWTRO*1um z5mJuP>BfN6g~aZ@An*)txJ){6R7ZRK)CYHtU<1XUzfQw))vF(8Z9#5nh5#L16fxPB zU*V@&D_GdEznDKvURKx4lqVXydnTy|A|P_>Vo=Q+5IHc@;Wyp_$z z48G}xA4WX3OU%sI$F9TrEx$AJX-q`Qq(+a<9f*x>5r7-Qc*e(X=?eE_p;{>N2Z>g- zhdRzqSTe_3TsHZ8z#c%LDXzXh(omTOcOKiBnDFt2X8M9-gxq(rThW0#*-{clWtm_V zLM@whm(fT2{KPQ6=yI=1{Zo3w2DDat)t-JH?#dJJ)>u(O=A*n?#?BGbHjxn{8y6_p zSznO?qlL%Ka6^&{!>6*9=Ghrm()Z*2w%20%WrYe36ugL~l$dK@qaGRaQuTb+cf}uW zCA7>Fe|vB9-1OMQ)ja#e!EueB7R);E@;#=wQBGXV3P?hbd{)40pM%811XQmuuk;E5JPZi3)?_Aa+OKMDgDp2o9N`);?=1-#?nd$gh#L zcmg|iItq{)o9r;~uwq2%*-;Q~;6b?rhc(y3%fZq#g66k*37zFi6=)$ZTpx}39+B0r7 z?r5TwtuI}geXWfs?2*GR6D7RE1G?f|v93@5M$&vrmMY66;09jswS2{g+}S4y+xF}5 zj!jR$g0^*zT_W41Kh`?cfrmAxlVpbw-OR2%UQb&G#oNF&wL$JNQYPrwEX?slW$&u9 zz7EaZCk212ttyM{eVZpNQG(?yWjVupIO0hcA-2_oWDKopy@69^P%)d??MVMM1}{1a zp85hkZwhSaS;B~anL>k6>JcjVaqC> zQqP=!X3SX?L{#8`&B+vbngk4}bBa=6YyTd%8rB{LD)8Zf{aO`f>D+Gyn39 z^I|wEPCO1X9SKNbsfd8Q+ogW=N$wSD%7OoNgD{K`u z(JppCB#MzXJEOaSD`y*R+?97m5?c@r>)~bwgaaGbLw`2ly^-AqADdZO6GMeaubB{I zF6WC0z@8CQQ*r@1iZ3o)x=y6KZAWA zF$zmbil8R!4{vsE{jZ-tO5_k<2Zbv_2!`EOXXbnSEikL_v=S42Jpyk0(WYnlPssO` zAr%5sDyy(`XBFMuW9OLZFxyJa=d|nA+HsI#v{FZ+KkmE-(r6Nmg@SwsqYY+p{Er$y zRbgfB3ctWp-PJG~?b7-$>qWKU;o9k;1FYED3V|dJ3tXkUpi;Oa0JDfWE6`nKg~{Nq z67DK6kpB3YD(H|&Xx0+GTLbcVtetHDdG-Z!!QD2@w(I^&`mctJBk2A-1?qtEfysi1NyTnSjLtTit?cQC*k-B9jW*-&nM z+sJ@=*>X1vZ$^^1>wBCUmY%($F{&`-3bbuHv`n%ua;U}!c7Wg!@8A&=v}hRJN}uQQ zM6bjX()6YBR<6XCoo3Y`N`HVZL%ObPd!8Fu!Y)DYY0NBS2%>Oajm~=cO-%hAAO7QK zE4XG=<;=&aUUNToa6|iZC|~8FFVR8owb#KW6r#@)LvM=)r#OO$Q}9;X@}odVtG0L9 z_3Z?vL7i^QmPq&k5<9z}D9dPNoFvU12w7P@UVe-)JmcS?@>;ejY_PA&jy5GsOMvP} z;M{@#GSoRuj#3ZwYPq;;AXx%|jaW2b8HKb2=qz>B*ZKVf)rUZJlY$3t-n{AOLJfxg zQ8okyyUmD&-FoIRn0su840H>BOY_VX40DZ8aT`eTzPLp@c2J^WII9-Eo6Uc zXPsw$102~j!ub|-UzmnBKf)toCSF%=pOkQ>eYi%v@sHIkE}-k?K~RkDgbS;5tJ!Uj zWp-^OZ7~T+!FWIrmTb~AXnH?ktniO)axnXH6 zqeP|vBk+DlfE1I?2%)?6HE}iVV;*J3g4x`8-EX!y!HD{g927%{Q-0bzT2kuqhYkf$ zG{ZXA@6j4?1#n#-rhs2k0vh@GXOPZF zqg!Jd2&&0HiuY32us1UkK;m^|ICSL=KJ?sl1U(hOh(l;{5}-pu?g+=*(5h4AQ9^iwC zq3rbdl@%Kl6WKVxP#aAIRxoOAf^T_&O^bBlOaV+4@9@S%$~qR#3<%tJ;!yAnkkf=- zg7x6EQTp}7xZjw0oY4mJ%LQr8{gjLUa%%QBI5P;LdBLl1x1Lc2AA6&(4TK(mUGzvZ zSYFv(Cf)v-u^097KpQ~}uIjn`L~673M5l-PxJqw29=))IO(+O^WWRbt>Gqz76|1t78XyUK9w zsSI6wRpSn&;X}-9RPzYpu|@zWk7x*L>!-clQRm@X=m)i+rCO@$UX8cr9<_?A^&E%5zt>;LLW2d(q zI~Rx}*d$I_@?Tp*TGB)}QE}>59p?*=dDc^Z;cMGj)BQJ|HO~36_cK2*)&(uH)i9YB z&;#HX!FUZaU!^~+ESmiZnxbSdz8aSurh?e6r|uLqzuFI_AH&AY77#gKFv$pqwxA!^ z;{|0TESEkpI$ipO9-Y4G-$VqtcO%Nx*P-dy=a9xs%%0U__Jgzs)AT>Jfr9_E96>bx zO!m%oo+VxlD1T;ZSj2p~`>%bZjP7A8b06Aq!GKLmoz;Dc`2p;!D~gbITlnMeyV1W2 zi$eyI8<;ie@wd1zeN!O;f0$tUHlyKy)Q)uC)&UcwZ#Ok zooxaoj>GPOQOudJ|JFi|4!GkO=GFe@9{r(h!nTKRew{jY7ByNH2SHO0gn7WMO%DM}cCH&#$4NvP#D(h0{_IN~g>dQ`}jobg*;2=EDU11Vh1OMj_ zC|9_t$`%(pTG^`Sor>;7fA4BKytML2Hf49h`-v;c{BMO){-1>U|8)BQX_b}#Czb!7-1YynMgL#v{C^dOkpBro zcmK4mRTN`=#@0Q8?GC~MG`{VlI=2?aM>JUOJs}y;oc#&Y<&bi=Nsm+IP)+mu`$AuL z$LVOU+P1{cm384r1xG2q)LX^FgEPNDqvvy7HOYAsGIdor0ehUnx7`L>T3WBS_vhoZ z42Hp&+nHai?o9ScWB6l0XXeZWt?-o4cj5^+{h?W} z-JVLGu&HMP#k3V8UcSQihIiG;q@}BWBr`(aOOHvnGL}`LljtMXe(2|293qf%osCMJ z-n^a*a^igqX@;~0>$ua?y>f+dO=1pe;WumReFIzxuKMH8wIq9%GUC?Z)o{FY1lu+# zZjI-KvhbaEeZ-mGKKcE|&b-Xcj1Za*z0%*q_kms;K_)zsUl?P-$aH(dhbN^LquAi!o{p)iF_pKD#;vZ(G^!fe3U$VCm-(C?2j zQ-;RQCz*>3JdN=5C(HBO%mvZMfnudLvKhJCUab?sieL~HPUL&y?e~5UJ{=rmbxYF8 z7y-`dwDotbYPLH>clQm*&(D%%GxYEXt{%4tHr;aH4E+TNf5`X9Ze@*uG0_}AhbU%- zbF?j>d|2wTt-nXfDN@0mqr3;V<;#`D_x`>%L?1dDeD2LNA(<`PUu*R2(&x{icRzOW zMZyKwi?15iS6tm5(OZ_Mxt>tZvDh9E5L~ZOx7Eny7Uc_HyM+4v8NY3{tcgQGZsF$% zo~rBsCY3pv=q;maB%5JEtHVVT#L45{kBJKFONC~o*}P0O4OYjcfFd5*j0P-uzwcz@ z3-5X-xYGHP9s~$_IgxQqKZMK>OP$2tH_fLdQ{=S0o`pF+W}AfzuDO+To$YJJ(-iKX zN$E=IoxHL@BUqd$YziNid!R+1py^@s2*E7OfzvlAUj*Tbs=xcB2bV`@q3S3{Fkzl! zHn{%RTW0c?1F|EgUby;Z*{iy;#oId9hNndIWXwLFEntdIwRo~89w$y9@XEm-TfT+< zkL!rBvk3DVLy(4-&DYvcBx548&F)IDs;BAL$aA8|pkzjoO6@i#qq`3yHuET=gKj}j z!RdX_uovu1yVoBnpUkJtJ*)QCH{Nc;A_tgLDguZ4)l<&}@;Nek6)t0{7QRC+3a=(5-IJRk?aSo_(8?}LA%+j#Rg15jhLZ~0PlJvA}Tv3u1S!thCv!Q&Jb99 z;Ssb3jQv{;-?Wp1saHc%7QE|OhUCeE#se=HTJSp2uoL4i2wk}LUFMT;XujiPDX_=? z_L_*ri8dAa;w;MO{nDrX9gJx2`Xr`!-acbzweU3^7P6+}UayZ31sTpT8pgSiPRZSayVPeNtS2C$jO&Q3J(9EmhWhTmSl6%Erbutz#t6)vyVnuUg)@F*4}_tV9oP_YFsh!CV%`1Aj3F)cx#}^sr|28YM7V zSoW0=jKhp~WE5?vea)I;B-dz!xMJDDOuvHdgDG)M-HbJrbwMHCMWd#iy2SbSUr)e` z<#AW(BGA%K^VXYxT{>Uy5fK#zLBG)tUU;)j;9#|UHeoDbQr>8=`tR(ucu~_3tihT{ zlRQH)9?*r?gQ6ODNc&*fmlG#G{No!r0zpqMBd#f*(J0hr<|=mFLjE94k!b-a<0|1x zk88TcIOrd}5aO*|x${9O^7cDN!8_3tvKekP7KLw0oRhD1-GF=j2MvkUq&3nI18gF5 zWOl*g?t4Pi8x2HF^VAJAbZ;b1a5k<{f*;siYh^{?%8YB3X7rt}UkWFpzZD3&yo>6y z=Gl{`2mJ)t=N&@Y?|qr$Wv^i#*I-FQ6x^ox^VP;u8fp-E9itD|ZY^7{Q%XMPTy|^YW*^Jvr zdfXyzp6I6-6*TA|&(x#8voI!S#%*leYojKc0sm);$tRd%l3|V#f5>>?CPRa98xFfb zz>7SL>uwTtHnLEBT+m`9TghLio9oTbmV(*VvJ5uDNZPRn{vlz$hsDenH;Vm^Yuw53 z66(8BqG5Lw((9{AnVmb+koDZ!yVQ*oi#c=+6z>HD8Nadbk=v9}WN18)71z{5>#;ad z%_<0xONyh&XH0U3r)16<&YaD2XYknW*XzPY=&B9oa%L=TmoY0hu@Xbo6>4pVNM5v}O6(=|6vRepb|ohh6Wsy}Dmc4$W%e`f)j>+c{JQH)l{1_b~}&MkSb5FRN`C438D5v=GuI zd*w6`8+Gm-nZssg#8usbNH_T2303BRGoX&qaW>ER>(ehN8m>=Z9wf&aDelxzeSb?1x*97aMmNs~$S*-3Vv9%=geFtf*ABkoW|3sOJ`fTHM;4rR4 ztk{OG)D1rBo?gZSdTIK<-wz>0x)(6PcPYOQ8#{*peZ*7z&l(R%!5e|`dw5J^J{cQ3 zry<=cSt%T<*GC(#cWhKw$(RJ}I6q8}v*W0cEK9q*m3I4EqFK~GPxC>aW-LqMNW^PP zsT(ddVivW~5&SV|#m6Yd@Hl3K>OsPffcJ8#V4(W8;C! z#?5j`Z&TQ@6#w;}fmDRdZGtNRVu2CzO5C)O;VJyu+sh39T9nC{r1!6iH_jmFRhmy2`Dy;hsgP#P*Zz~! zt)fFDOv>Y$9>q1u&;-6VC_<~9MC-{!;*vLzD2B2bBNXF0Ji?hw>XOWhh-=ymFYV^f zTU3%_DVjSoz73qpDT-^l$`GKD(vBPVS8A~O{^`vvO`;T)^C-sL>TBS>H$uv)+d9E-ec(Z?bicAD7<722bn-#s z#2nnAt>DO(7_96DRVBRWm<+Fi840Tq)D<(R2Gj$eGvbIG^>|%A*NusidB7w?v;w@S zK}iN8;z3a!|4rBR9$}{+dVnqjJRcNvBn^8mVnYXcYmekYk<5Mp9OMFDH{C)$ET}Eme3iG0+-+PLfHM&8SS(f4eDT z(tzp8tbzN_-^Q|)e6z6UEq8L&Y>ec`FFEh`{I9OwJRa)(iyt2pZMZGBREFC%_^5;y z8EY$zwdhURi^vjUm~8Xrx;Nbx>TOE~l~98yMP`!GJ|)wTtqfC58QTyscE2;J`~7}@ zJ*t0rzuvFcd7ale&+|Ozb>0N=Epig z(wp$xo0!TP9$dIbJ`U{&kM+2rbaG!nfDC_9D?b|&eh5rJ+IHS3+?meo#3gpoR>Ad} z9~1NofdgP@rG=MyxRJ3N^FJEQ4+H!PPODpw)iOw5Tawiumjb)CH}PgEJ@hfhm48uq z1{+^Kc%Bxv{g;L(K#!efu(EBeNx0ZVxaH%XY9AF2DXQ=c`}Z`mCs-`Y-5;IPd_xK1`=zQ~tgAgUdaO zge&F$&L~KQ8$H(^X^ns%CF7ojbDTxX_*Z`c1{Bt{#u{`@T`Pa(pxf2eAoOib^Gu-{_6Zx(e9I>nJsnNl{ks3@%RNh*0{nTNUrp#gm}FY z?LY8-390EDl@E7T*BE3;dko0G+S+Ov`Pk0VZ#Q4=2XG0Mf7Xh2(SJEBd3|V@6`+;h zC8GoBNP^TLTJ6w6NOQI9-p>~b737O8qz00b-k#s^g)cW|9O6md^Y6xaIapW@)Kbp5 zoLVSP2>{QqWw1)9Kx%NSm=7I{)^&Hl+@)-Br?0zgecO>`|6bE@*9c}Gwc*hp-h0tX zX}K<%&VQ)I1UC5ngqi0s7>)+ZjvV{<`j88xkK8^ypHm~`Op7*5qr1*)rf>qyQePKBw)CVSR{my(H}JuBMZ zA7hYz53;9xs!rj;;&%BFtY<-avR-!#T{9jORV2to;00UAB25q4Vo zQO-iG>@kHw=zS%ho{Bb{i_3$K5dv*umkuOqejKw~9nd~8O+vVQ$dkOd{}`~HI0FSJ z=-G8&T$kDa#&>JUW7{#379OXpI`Ylx|FOu>#>F}N39eN7;*B1I|K;CvgRH5qR(_$3 zU9#w6l<^nevcH#5A%2tbGVn%SzwRb>iT?|Yq3o*&lJhuHLu#E=5=^~ky#(TRo7x{% zzHA=_?Jwv>;@)8a*+hc-A&3UXv1dBBl!GOeVhtZ*C^wRRZ8>R(q0s%s$_@F>?WUScJYt{{jHSN z8R&Yk@y>u$X&o`qwMgT~qzENRU~ylayDnqtuNSfg=!i7(>&F8}Xaho?0__0U8SWbjSwc@dxZz;X3C($_jf#W_0)k zADZs!_8)~VMCN+$UgGl%`TnKHMH^*;uOWbpVQhoacZIUkjt2pkfc#y zUfPXRl|_4~e=%M(mxV~WKl{c9m;TRT#8?M66wIt*P*hAjA(X~V(ScZ+U|7d4uVs?4U?qYRxvV}9BSr+8B1 ziDeJcKCNdy+aaoUTSD-B!mQ@4sCm98au+lO+cJRDhvqt$RHZDyT>X3gB{5g-;h*{6 z-T5*stDEAHo547DIF%!tKWjoTpr1dc+;OzP%yItI!c$T8Rcn7*NJ2?Hl%BP`4X8?O z$UHUw@f#MpHmp9)Xq{UA);-_6XD_kJ7p`#?&;o}4cDD5Ujk?rrp6mN)*ZYq@TY9d0 z*7a1|q3ZE%aoEYlXEy{@belv-jk0 zZGUzD{_~^h^5XRB?7r!3DNumbTy5;*uw*Lz!jxmoRy6*C)2Tq+Ml^4O0dOZfYD^DV z`fcGaI(x~BH!WkZzH6#nco7^jxWkpg51eGoPsZpgE%=;5=B8~^QDrvuksqzAhf^Ci zp1s4lwq-unzqmww*DCTCF3R0u7NqRA^#q_ z_!+V?kL7di$og~nz<)-vs#yQ9I>YLnY{YUs)2DE|= zi+_(EYli~$>7Skt#SbF>c_F_-rh093vP*o#K$zY^OFx;bP0@jO&b~-zjj|$u*iAob zeK4Z**&RieF&_>lT>Nv??256q>_)jPx%ll4HH}nf*6Vn?d6b(EzkX_!J3Ek;`>FM3 z0tDeNG-Ci2lL^JnM$*~VdZVjvdVO%P%-a8OV*Cv&X?pB(&Y;7ZNW!OLW3GRRy3738 zHI*Yg{Xb$CDm5!z|7dbH!`@#y+TlE^VtI1cM`|p9o&5uMIP$DoVwagkqBT-KE=X+rzhXDN79469(KlD>aAWBHp;Wuzuq zkAS=&O~ZHHEsY~-_G_doI7E*Rg~=4tK|VF6cp2l$r+>fISR@t$!rrYVdl!P%?~Uj; zVi#9)Ge6DuvcL&H!qU15276WU#pGdS-V=fjq~XiE_)1toB}qQ+Z)Zs@^rUJ^Z2@SEL2>kDxM zXGFrhH*vn;{IadZt>a;=_{J&IBA=xp$AhOd=T7&J_YYqc#{HrCufmz;wKM0x&{Qo? ze&TrKWsx%!fO#XaLh8qbwDMUhtZSU*74H=XgqSn5T-uia$YAv#IwefPEoUuFFwlQP zL}{O*>KLc|$Z<#WQ#%$xLp!zBY!(=Q#b2PNfdP={7<5amS~zx$yeIR!?Np@h;4VJK zrx_Zl0&AH_8{QCFU-OD+H*b5IEkq&p;|VM&mf7`a%i{)yJJ#&ix&A=EG|2Q~*vt{~ z(bL!8o zhXljxfl-<>F^eBSuM*Flfd@`(l(n6waw)7sr)vsuNeTA=^44fXcz~q}_|hjsi1XV~ zO@MB$RjkSDz#rC+JM&ApcrmcIL`rCVSUfL28Aq9?i8O6vWog-dA3t6nc_4(dgH811x3T^K0=CT0QcKdR z?CU>Vso045gLiS{PpL(d=^kTTL~t)DzOmn#<7;ShUtUg&fXF1Ov(v(ip z$*+mC+YAf7x+{{et4W`LZt(Jdr8YRS)UF#%2y+cCPoaxO#wNZAgt(IX(ED4GxV4pz zpjFWtCQS!lb;Q}t`LQ+o6sYq?Vw(y}kLO4cy9O+_&zoF22)mIH``0@6`tc~}qKc0P zLiM8T)5f?q?$X%rcWA?V$a`+khP7F2*r35wA@0o?j+7kqww?ID_z6j|%GMNELr?T$ zj#{3~*8M>;?w7($i??q+5E(NME>SKe?3LRm^XV;!-(LobnE&_hz+SoUwVxd<*X{w) z6gOQo&i}rW|7A;-y?@Po1rB5iezL!Q1;nwX?3}3JcH`zt2f$tAQzanQeH|4Z!ZQ{MICx!iROCrxM_3%=BEny1*R0aq{{EyM3$N$gS>Oo8s! zr^w_u3CVBAcX`)4QH%aQJ^z${{rKpwN#F7SVO*_$kzKPc|6t4Vq^O}B$3F}!}GC*&0;@4C!AbMe@f9DrM=e0Nx_1_p%oe;5$LUMP798I&oL z8*GFC2E3M!d3~f-h!2bc6*kSBC(!m@m`WSQKyDM^uvF9-I~)a+c#YNmcCl9lye>lqCE-gnte2ESNp>A0^0P5qystpg?9CeoM6a0b5>&9 zFz~Hsk}hp6*#!Ogw@4J^0FWAG9!mmLmP~UCp}Y3vl^G)c(xr7f z)6xIe#isoOJ|Ijay30#ER(1`*z?7=^;;Bw@;y>oV)%I|nP) zcNu5eM=c&45~c%=unMa;`^6<;ub^Tly=t@J)u#&csPm@O^S}3`+N&8tdn-24LrwsP zA#@N`D`CpPdA`*0xwvf{WIA{eY>~TVw-(Fdx{)NGbZoz0iK-9k^C2U%y4nHNR}8}LjT*uvfK_m&OoHd+dgRHh=iAH9w!Ev(lOdPF z=U5gDsuH`r{&OdHuPn!3ZBR;9xOvlJR3+C^YkGyj(lHXmoLTBTAl!d@J5OI^qJMSl zif-bkrq9b+_zlJk7M|F(^MOLZ0W!KnRemC+vB8@Dn%`AG8{WoUdMqOh2vNqGRxQRc z+5SuRSJJ|A&L~`pgZ%5Pq=(&)?OzWU1f8E3DK~RYv&y5A_f~)7h_#-Zg)>a|)j~jn zW6BtbRg9#Ja4s?~BOO5`h?$%d#b!HC?y3)G-IrA3#ApxNdG192&DH%5^=RVt0QFnp zV+3~4q`BYiv8N(cf8Oc%*N}aQ&V56y+4A3u;ZB0{*LGo?)Lp&7_Kwdc)n;qd>mPoqD3rrz;-fMC2X+3N~*(wFp0F#IngfIRslo+K&Ej~cue9lzy>oJQUaUa9cRlQX zvuCdMz`~Se+OOCf%8$(t@vo1hdS+N^0NV=nnBTm8W&}CZwlhZ`e7}6m?4tb@J3XAC zjDdPrA6vTdg=QVB5ia7*KRK2EKQo!6mqZ=-B7|fkp;(;`N7<3QNf)wPYFSbok;y(S zZJh0VDoGE=(As3P6b`Knr`tqjC9Tme`n!sbl+bN{MIWKK^DAv&NnjDf(9J``2EH6b zFLKM1IcW9&`oLRI(Rh3>dRF0Pm0P@%SY^3Ze!14|gJZ;y^wJ2twH6AjcZ`I83BUEg z);pO0W(Q=F0^r7-VrYGf`Dx@L^xW-zUYp$G4+y%c{xEAxXg%*gU*+$!SMKIPTeS=_)Y1-mW%22vY*<9p*ipX@6)wBhgPLr++({6>3A zIK8NL0#hP@dqGgaa2x*R&PW??>xzl~#U&ry3ta#*I_?u|&WqlzKe13*ingE~qHUA> z?-i*HDz$D`u0xX0-qK8VldSvVKxNuN_3}7PX%F0OE3Isrz2S8V^yPf>;{_%+Z|egE z4A}tZ2P;ll){n!dJAPaifNFHQ@{~|yo22k|%^TSnG@7DvBHFD5oq}=*+WrFvm3Ptf zLN*mXjjX$7PqVbKdcDp{ep}efb#K;bH-@fHJh*@N1}p6sxt7-oPL~^Ouw8IQMmm^3 zH0h-}bk?=1t0QdG7Zp>Do8R}AIfsjfD@2bv!#LD_j<|q?=41&LBP0LPqnr`9u#i<| z76`A5KC^{Axy9&?Pev`tp)wjXQja`=1v@q^F6xP^wK?~aFBeglZz0FpAsZZ6QL0fD zPEp-%I1dMZ3hMZYVH0A4i@8PFCOM7BU07aGPZ%;n{+#>l05a*+w3IYs#6Dpz-gs-V zX5=Bv4s~iWD(Yz|@^9fDSp1kT*L;g!uUc4o=lv3Dt97SkXpv}ULin3x=*xx)s?=BS z3pbi=WhCGunh5BXwz00|$jAfw`(X0B^>n&PQI8+VG+VIUTwHw7MLp61(?OcN+C{Hn zzAV!`8PBrU7Zf~i;Tw36C6|(n`I?2oe23{=slYQbDaKpa8AUzSNO%pM!4lp?_9NSE zhiWpjAKvR~y^=Pvn3R(y*no_*(w&^5!uk7STbPTG0(v#9HB_{nU>jW|58Fth5#++vM!}ou{gI@v8X;E?#<{uIs0=j#u0B&rtB6MNt zVOBbhJP{H;!(CdOn&H^A^XJR`Vdhng$zhVaF(cu~?OZ_~5?;t%ckViU=1=x+3wT;0 zxUk2HglN#XeAhqNOOY=eyyVrz3AKtJK5LO|mGHH?t8CDrQe-5RyDkrDx<*nlV#qYt z!XXIeaHYy{n>HK9rG=#tN`Gpr!_mPfkv*d2*i^kx;q-fTb_%^G4Y@xlyu6g&bDNa2 z4W4F8o>ngn3sJCjKJvFmDgDJyHM*rcc7#b5*AT{;T>KKsEMe9WS*46eH`^iMZwRGt z0>|dT_%gkfAB4C=I9apvL+9xXNZElrHb!aX+(aecUUS(URRM(tJvGX%iR~6Oz=G)bmT#n`gjJN&Rv(4PZwpi zy_7F_1*_!n)JKh<>nTFf34DJ zizd(OyP*va{bj3)$1R41?)^4IXFQ*i&Y?ZBW_@KM>P}2E8J<&iM#QT4I|t}JjwF#O zLq@#NWg>~lpuQF&?+j!6HS z%Auo?N+6 zOvb{3C95~5fCe8EpM{C(QSW}vl^|;tct%7G!(23pC&`OwxBXpvgnL=!ZRZ`>24URYzQK{JZG#} zpBQAU#i=Rir-9g-0Ig;yx$k+3mZ7r*GZo&G-&WZTt;$nt?siIXjU>+t)J;%5RO0~V zLAn(T&6M(Xo1tRvQps-WUa3{gDqwnK3noZOYj}@;6PM5f&LQ!%q3azl7GU|(D z1)L{yDi(2zCI4`J=izh~^oq23(@rD>%c1&OVqJ?{QBMZwP~zls&9=j~lE*sn5(N_P zwXXdqMfm`-3RTAcP(C%KDc$Y7=`W&3Hdr)a{IO8wtIwj!SBwE6t`)qg9BUr&qudhe z<)i=t$neMUQaVxzCnrZl^+Kk@utY-SQOxSR_R$nx9$lr0w|HFEAHiQ1(DRHm`l3lm zq|iXDv@~|w2OH2N`W2NHsuN?2UaUql-4Y@?d+xLlRWhva24hyGCZl$t&j_oso(u#W zHuwnEWL>FKR^I_Q!T8!;;)n66n1XO zg`?$tmjo2dIDq_8zdfAH`dc|eAVW&B9%2)6`$WN_r=^t9v93V$!-z&S;(Ht@NZ?mWX5G_f{xD_d%0k8 zc^PAJH*fkPVN#=tg3ay=ooHPj@whZu!C=*PReaeWNp?e%q}xrr;2zNy3%L{bM5cMn zP96`v=>5@d!}}ee=w6N|2E*DU$ZTGjjSF^z>5(dsPjD&V>mm2g%#KP#8Yh2j@Co|3 zSLDE)927l@#jG@{?64=F1-ZAXY!SBz@>8M#_m42+af=c^DNiQu z#QTY;879fpY`ym`_rr+O>N!N0#pWlHxbbyLkSmqF(%DPn=rvjQckJ>Poi$!dNC~QGgr!`DhflWGJH<6yO9fw zf9uEipZHzrNO&!GDXVJYR&OLlHCwPW!5J+Oun0Q%pOb&aPt51?3d!PV=A<7l_5)#+ z71-NEjYunOKwh43xVV!DM=*3%1EP z7ku4b)N|ygv)BU8;$E{YZel;htdco^2|i`=9(Qv|GumuL)O@t$W`NGyI}=WLyza~B z6ypf;ys*#nG+XsNIQ|`*x-No5s@^xpiNz@~J~``_k36I^KF(=M>v37L;`1WYA|@o* zyTZlUDSg>(3wI=Q0_SnnCLNy!krb5hcfR_=rw|Q@>{#aHdG5Np3*Zgq$l^?rsVT!N zj)@{o&%pAUeReJF;>Cvg?5$0{mCR@2n>%egIJxD&UpybIR)PQ3jTm9i-4nIu!cpwE$%qd(^;_0QHS2JWVycbKyU%z=yE zxdgFw=pk$%Sv%|D$AsMbcBAh8AQ`6lr)k0bq=(8OuR7@~ypQ4dIsI!acJ(hDqKs|i{h#7{9yLr1TtQk7{ zu-c1^djgBAABXR1#zQ!O8#8mM5Q792?S?+t1Rh@5a(32C60hl=1k19MG5J754Z=2P zR(WA!MO){CO!cecyS4Ll3=sv}r%QqW->8oh)%gD_0k$>wsp?-Z(cE|^NCfQ{{& zBDsIP5TfMoEBg?o2@=-+e)lOLf6h;o6g5_BQg?uY64|BC7kI(vQqs(SE1K~=(F7{5A%4{&W zB9T(ycYfFRT8<+4cp0NxOnCWpp3zEHu49v%xdrR&dx`Btx3Q-wqb-M}n1o0hq~C1L zHdiFpD*7^gkm@S>s0#k>pYG{`o7|-`tEcKX5P<5YZXfmZnu3(r{4y&HEv6SGDa8Md z-fJv$h!DGA#uORnblx)zKv{H>f<)WmBq*bqs?Fvi;e*19$69#4>XD%MY{+ztALxCQwU`MPw6nV2>rz?*j84#&E^N z2b&z|{*_!kE0H!zdbG{(=tWg|>P(89*{pHD8)7?t*bUT9iZRI~br>@ZZxL%ULY?fAKH zF-nMhZa#Cx%AZ59IM~!NXP@}(N+(0yNB0c@X;MlrN=`bw%VRA#D$<6Tso{t$uGA8* zL7BBTn8|iSIb8hWul^*{Lr5j;{vvu$C^Aw=dXy^Y#HReGqJxmY=Oa_>!@NfGmd}ew z?hXj^yn+-8i-`*xk~vz@av??84Y9jLH!**)@zQcw&QLa(f+@**J~)EYP?H!|{bsZC z3Ws*AvKp$OM~#7297LiIHUab0PkMAk&`la$OM5nTVhn`Fu?`(LKl>5DN$4FB&>6g+{`rdP znsT+ome!dq(8?O=)wwhb#2`XEvRER-e~t`3 zseeGhIF3yzMLkn_UK;+t%Q#Fwu61p@36vX@Kw?H{_M6a^wX>} z;-rc%7t;N6=~4TTYMpYI2oodr&V=$q##yl@XcR^X917c*a87evv+{u~yvp+c0Gjem z7X=(F<~CjAg3MT#aHPO9k4*{Vwm}7pt}oby4gg5?uwjQNs5ZL>IyuD|X^wj%)ej{M zmd~YwP3{t+4~=rcf;GlJ5VpVRbC&P&aVYHyC=8zQ@j+F_$AQ?HKeuy#=#3ru>}q=Um*?Ev%B+(ZN9=~OsTrz;t%Ur1dQzJvqI8YX_R2$=foT$45U?8amkkwMA z#&|X%x0K$6G|l8CnBSsXIW;8|^`IrBBhq0;W|ht|y+M;ieKP4fuiv&-u$Uck?1 z=H3sK!-WV>482XyqxUrDd96H*xEZp;!HIYdZfUk^ndvLJdk#JXr3U^&c{Wqvkf)~M z%^@UP5B)=rvO;**=;fy9{q`h>ThlOOJ+?(r&+CB7DaK*M=Ii$? zx*>}29@29TA+u-wV}=^uaSft9}LC2ICrlH9AWcRI*`(v<;G za5*CZd#KNLqW3IB?sJ4!YjZAp{~lcQ{hP=%mi*Mw6ynaSa)iiQ;Tb9F2{MZY&OxJF zq)2JreXNtEe*=~1x9L5l6r*c`o4T!0vUiF+23S=XT)y$iwT2#)a}ZCFr6 zr@Ls3e+Gd}afESUWBW0q^GQm=kH~!|OfH;~oYWQ=P&o{=LJ|>>=bI7qG{Md?lqI~V zZlB4M?tM;Du)*kt>)5_6D!DF`QGwV1VO(T>{@)`1O2QZ_EyC# zD?Fw9Dm~Kd2t^e^z)L)gG!xG=xlcE3bM(kCv6+(%t#Ci+E`yXkO%u8TVC5j#%birxC0 zXDRL8{U>dGktQ*woY7Wd2)OpWW3odE?UHv(-AsRZG-i_0cfaZLvH;GJw@A= zr>5G&)ytQ)^u|au7NYtViyu*anIQ@md7hKaP#wXpluq#-^&8(#5ij&A*LOtRHn2Zz zj&|@vs-wv)V$2`q+ohbQ2Oei>jGsbG%9x#|hCW-0s}GN8<{5o0VakKb!7k{LZf`U6 z-rJ9P58RjASahjnSk8M?{9#6BZ2^B7spAkLSNfQp3HpTFcp5P|_BZ30;&Xcv%;;{0`l;jn}yvf9Jkv=7>+_$k9>X;SyxzI-MaDUcPWp zlA-ttzgBMfux(!0TOQz;qhz_VccMDK{BE6qCPf#;kZ~9SPP}{TX>+s!b|eYhu+dBN`7kUX;Mw*Ys)Gh z?1lO`z#R`{poCuN*i=&FUs`(tHOr$b(CHcK<1v_rDzE&HnMg8A{~??nX~rHbgD`Fl zxF*#+f@F^{otjLrn5}FN-x1qUVpgqUU5l#b_%~=TuXSQI{w+`ERbTUKT4lz;Uo`z8 zD)WLu9KOsK%PKL!1jY1;U0AaBsO&5-*;#^Ko=Jw?6ZCfW-=RE0r42+!EtxNdZC_Hb zhbZ}}evB@AJ7zu8d@_qqC%NYcZXqMD2&FwDujd-sOgh8U2i0uXD!;_bf3Z^g@8v+y zt?w3rKrg?)@iQHU!X#pRaR=N&s67TeMqPjGbud^!%Zzy}oM27kWo+LPrR4 z1fnim9#c;BZi%e0X0@P@nOPKNi^&nHJ_&#GytVNuzmSO@LJ|qY_2r63%1$_uhUjo2 zBV!lLmrT6L3np%aVgV&46<tE@xw?!N##Io=dv>wy9r zTy&G!>4u;wf~9%T`{T}j&0`Vb*YqAf5C|~#%tN{AObrFhKJoYv)9sJo$!-H5Uu-V z%~(EBk(68m!=uq;aV4g#2kiMvJznf%;etcQc+=Mi9A%!=#((}-B3GxwC{T#R|+lL*s82PC})O+ByNri++bP~>Q0kh^(o3QIUSDWRn{avzp zQs_QR^+Hf)++vML2gL2v93E%{4kqw)4efomsc)}HtRC45Z2ZF64qit{!u$rF>b{|y zT>OtAGy&0skswm?`tx?W;P*KYb=fpQ)iW>FNRrp-yYWK3ZL^^?8u2#3LJntE#Pql< zNXs*dBVBna&gaD*f~<(>@);)5lxOiHF`#<_WN#il_Relqx5$n#F4=jRN9h7>5ZZ~T zeV7{jT1xq#=2YO9WGp5S);_ft!5h!5y?gVRlzzifUhGrh8Tp}B!ix(@ap6%1D7i$` zP}+dPi}i;b`}i2_zP-klv2IZ#ri=+D^ISAMD+#5g^jM2TiDK*8NTxts$9@7ig;ddu zJ7xhp5N@z8C{Jo}DHF~Zli;z2CT;z~Th@#OS#F>dxcKEKyX(x&z!FL{$TMmQHSR)) zBQ_Zh%ywen4OB#RYgd7*K|YjOPx8Ew4#wmMQc#M(1&#sbQg#lRlIyn%N`CQBlc@%id~? z#~!CpBzchzVfw#giFC%qoH`dsbaHjBZD^&)G>rVxr$+$rdBpwv(P*rptTNrFS%v(4kRc9h&p0(Vl9DsS^r z&aEH3mt?o^te(R4o^*92_k~r6OikG*HZ#+fogYdSQ6aPI`8ixHMzMB%_G0r&++wex zgj@pnu$1=gRzs6*-b~HN-H4n2+{rr!H59GxF9=oK^~tgI&AiTiq2~x5%Dl&xQ9CKK zZ7|p{SqwRcL=x4AeJdd>?pwuqxGu<>9wl&;czR1A?{P{}uOP{k#XW-*V_>pcO8Wz5 z4Z79P`v8!OSo>CXp=@E9b54!EG|q7crDi?5mXw6&NiVq{sQJm5$c_du|MX3YaoC(W zItQ6<106I&kS;NP7xy;upjxDyFuRTMPd>#F(~J=3nJ40gn|P|Wp@6BCV4(7Y3ArNE zE$r%)7+>=1J&>raf&9ND{TBC3Vw+#HNuoxcV!ucQUw*Us^nM_)=v?iMB@QX=OlGdB z;XI{0W=)D9f;967TMO1W?n1A%!@vxuv};am-Pv+}Q381v#))uwL9spvpojD%Gpd2#Oh#nK9(>boea~0>g>N zS+a$?Zg31LMUU(#vmxXqWv3XE=S5V1tXDmfzEsNK)^?eD}x;FSd?>XRulGB^kI zHp)U-#b_JBZr{)sp!#`*DeaG#1Hyy37r4C6UJ+9rl1T$eq9dCt2mn827#}>Bpayol z>2IP(hp|ZlF@mgE=9eBZm_nF~fn7camDUu~*Czd_gz+>^0J4xbohOFd6J&6nXLD0k=%vqh2upVXhwQ9$9>ZbUR0oNwQr_ zdt#7V*Z0&sozsBkK5F9)aQbBaN2|0PdQN}uJE!notEUDX7?Z^!ss*J}jr|2vzS7oh zwlUduXo}#}Em{>`Y1a^RU1WNVIgl$bCz%>B68{#uYt5evR&F-^^~DV|8_tpfn|) z+1bgf$rjjW%CGFmdCJyp90Z!$E_7Tp^I0_WTzD0^AMsanFXpPvmPv^@8M16R+!D*s zBp&bIlS@fbkWP1^piw8r!aT7jUSs7;0BGNmq$Ml+Bsoy6yu8cj(v&3FB=@o)hh(dY zg275IqBG~JR6HSJ(45ai+j*tEA|paoAZDR4{*u43o~K8m>ac%jOlI(!lW9gYTyO}_o6dv;pwE+B2ra(x3C&$-im?`3CqgX6 zn-+*>hWHv^gY#vh(Ev>^(;z@P5au)?;rVkZr@GEfzS;LTtFH83jx;r;OgUn^G1u^r z`t?TY>>BTg$@{Z?qO_F92i84U z#)!_~%5Th|GxlMfwnG=|Y-wJ1Xla6*gka0izfYo^ijvk5K0r4Sr5^M`OT_cT8 zLc;dYo>g#Ce+1A^kfwN&C`S;K8GD8HCfpHIBt(W|+sR@@S#jBNdXGK0Pk|Jq+h|WF zV)WTH8smkcnL(Ju{iDHyYo^NlpbUlp`u&zbNxIX$Pg4W3suV(`6$M4ZLO6tCm_a_T zdVNjHER^-U>AUfCTCULgSrK#cC;fC;6)G_h#BH0|>RDGxNc~-+2D^9jWbJJ`ROcFf z;tN4s*Edq$$ycT}C#O6#V}IBZoiKVXA=>fr+3MPW!6&WgcZ?HbYisRkc znBXO00IDQVf@=8s&l3_EsPm?w{f0RZoW7$`x47ENzg-kjA-t2=tFI8ZR^6gcW9>)! zPrfFsTH~^n2F^vMitXne`Y+5(6!d(-U?fGUn(X>ef0;&cTjTm^%qLs6L$+ZuQPNy(1CWcJ6e=n z?vF$5McVU~^534+ znNG)!X6;t(1Bh*N6bS5Bnbkp5bqLp7O>DgnCBx|_V|KSqOw-%?5vswxMV_?>o1`EU z7?j<%&3E9=-X|c|uuSHAA*x^{8(N=%2 z>{L{6dFnf>YYVUXnD>g;*XR(0y(isfj*hG$DeMcqbP|z_Sp-~t8{5R!%(R8)v39kr zE&`dRDM9r8-eVEGs@AtR-<&+^lb6FGjQ2UtPN#`RleK=V^E4C@ZKn5JCsFmvzddfk z`f8d!Uw`trqW{L!_XqsNzG%M)9Z={yy0?V4s4uS0_U-$Lk#Y~H186(u%2W7&37~Gp zYUmB2(>Xe33%g~@+VPkYX7XCc1!cP+fteXw6Y-_)_I4-d$$@FCPha=kr1;UHl zCXc8|r5^pF&o93GNW8GBU{|$(@g;4_YSY>QMGa)^obRaCaCHm%$lZWFKgHFv|KtpT zso54@^kNgqmecnp*L^aoeik@+af))TfcYWn0sc1!AR*MN4pN6EB>%l9PM+ivR=u)w zH}ge#YG%`h@3)n^oXx&J+IqL?^Z7b=uj;1HeJxFF67}IIB*2rgsXxkFJ~SsU-x58I z&lT*^^pe`>^5}kV9hI~x7ZSx81{tN%nr&Okdta%LdXzm<+O`S$dS6z|OuopJFRiH@ zHRx9M;80^U%Lm$~5`LVEIJVx{k0pY<;}%L{(_eo)Cs$YMDM=;EW_T(|Em=8*au0uc V?e+ASx#Sl}du{jJ-sSn%{|AuO>}UW0 diff --git a/conf/base.config b/conf/base.config index fd61a5d231..8f5fe455bf 100644 --- a/conf/base.config +++ b/conf/base.config @@ -59,7 +59,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } diff --git a/conf/modules.config b/conf/modules.config index e3ea8fa6c4..d203d2b6e6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,14 +22,6 @@ process { ext.args = '--quiet' } - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ diff --git a/docs/images/nf-core-sarek_logo_dark.png b/docs/images/nf-core-sarek_logo_dark.png index e38a05fcd556fbaa511c4e04ab369b3e996e4b60..1478416c723482df7e2edc99e37523950d187f3c 100644 GIT binary patch delta 25186 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 M9&3lGJmnepKP8Ompa1{> delta 21814 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 diff --git a/docs/usage.md b/docs/usage.md index a33f46329d..6e5f3ae610 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -156,6 +156,8 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - 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` + - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). - `conda` - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. diff --git a/modules.json b/modules.json index 4a8ad7cfe3..67d220e72c 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "f4ae1d942bd50c5c0b9bd2de1393ce38315ba57c", + "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", "installed_by": ["modules"] }, "multiqc": { @@ -26,7 +26,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 9e19a74c56..d79f1c862d 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -25,6 +25,11 @@ process FASTQC { def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } def rename_to = old_new_pairs*.join(' ').join(' ') def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + + def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') + // FastQC memory value allowed range (100 - 10000) + def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + """ printf "%s %s\\n" $rename_to | while read old_name new_name; do [ -f "\${new_name}" ] || ln -s \$old_name \$new_name @@ -33,6 +38,7 @@ process FASTQC { fastqc \\ $args \\ --threads $task.cpus \\ + --memory $fastqc_memory \\ $renamed_files cat <<-END_VERSIONS > versions.yml diff --git a/nextflow.config b/nextflow.config index b234540d04..e4f98cf7b8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,8 +15,7 @@ params { // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - fasta = null// MultiQC options + igenomes_ignore = false// MultiQC options multiqc_config = null multiqc_title = null multiqc_logo = null @@ -68,103 +67,109 @@ try { } // Load nf-core/sarek custom profiles from different institutions. -// Warning: Uncomment only if a pipeline-specific institutional config already exists on nf-core/configs! -// try { -// includeConfig "${params.custom_config_base}/pipeline/sarek.config" -// } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/sarek profiles: ${params.custom_config_base}/pipeline/sarek.config") -// } +try { + includeConfig "${params.custom_config_base}/pipeline/sarek.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/sarek profiles: ${params.custom_config_base}/pipeline/sarek.config") +} profiles { debug { - dumpHashes = true - process.beforeScript = 'echo $HOSTNAME' - cleanup = false + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false nextflow.enable.configProcessNamesValidation = true } conda { - conda.enabled = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - channels = ['conda-forge', 'bioconda', 'defaults'] - apptainer.enabled = false + conda.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + conda.channels = ['conda-forge', 'bioconda', 'defaults'] + apptainer.enabled = false } mamba { - conda.enabled = true - conda.useMamba = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + conda.enabled = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } docker { - docker.enabled = true - conda.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - docker.runOptions = '-u $(id -u):$(id -g)' + docker.enabled = true + conda.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + docker.runOptions = '-u $(id -u):$(id -g)' } arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { - singularity.enabled = true - singularity.autoMounts = true - conda.enabled = false - docker.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + singularity.enabled = true + singularity.autoMounts = true + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } podman { - podman.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + podman.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } shifter { - shifter.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + shifter.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } charliecloud { - charliecloud.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - apptainer.enabled = false + charliecloud.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + apptainer.enabled = false } apptainer { - apptainer.enabled = true - apptainer.autoMounts = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false + apptainer.enabled = true + apptainer.autoMounts = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + wave { + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' } gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB + executor.name = 'local' + executor.cpus = 4 + executor.memory = 8.GB } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } @@ -231,7 +236,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.5dev' + version = '3.4.2' doi = '' } diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 56110621e7..0000000000 --- a/pyproject.toml +++ /dev/null @@ -1,15 +0,0 @@ -# Config file for Python. Mostly used to configure linting of bin/*.py with Ruff. -# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. -[tool.ruff] -line-length = 120 -target-version = "py38" -cache-dir = "~/.cache/ruff" - -[tool.ruff.lint] -select = ["I", "E1", "E4", "E7", "E9", "F", "UP", "N"] - -[tool.ruff.lint.isort] -known-first-party = ["nf_core"] - -[tool.ruff.lint.per-file-ignores] -"__init__.py" = ["E402", "F401"] diff --git a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf index 7590b7206f..c8ac1fac5f 100644 --- a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf @@ -140,6 +140,10 @@ workflow PIPELINE_COMPLETION { imNotification(summary_params, hook_url) } } + + workflow.onError { + log.error "Pipeline failed. Please refer to troubleshooting docs: https://nf-co.re/docs/usage/troubleshooting" + } } /* @@ -230,8 +234,16 @@ def methodsDescriptionText(mqc_methods_yaml) { meta["manifest_map"] = workflow.manifest.toMap() // Pipeline DOI - meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" - meta["nodoi_text"] = meta.manifest_map.doi ? "": "

  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + if (meta.manifest_map.doi) { + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + def temp_doi_ref = "" + String[] manifest_doi = meta.manifest_map.doi.tokenize(",") + for (String doi_ref: manifest_doi) temp_doi_ref += "(doi: ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) + } else meta["doi_text"] = "" + meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " // Tool references meta["tool_citations"] = "" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index a8b55d6fe1..14558c3927 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -65,9 +65,15 @@ def checkProfileProvided(nextflow_cli_args) { // Citation string for pipeline // def workflowCitation() { + def temp_doi_ref = "" + String[] manifest_doi = workflow.manifest.doi.tokenize(",") + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + for (String doi_ref: manifest_doi) temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + - " ${workflow.manifest.doi}\n\n" + + temp_doi_ref + "\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + diff --git a/workflows/sarek.nf b/workflows/sarek.nf index dab0dcc93d..89342946ac 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -40,22 +40,44 @@ workflow SAREK { // Collate and save software versions // softwareVersionsToYAML(ch_versions) - .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_pipeline_software_mqc_versions.yml', sort: true, newLine: true) - .set { ch_collated_versions } + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_pipeline_software_mqc_versions.yml', + sort: true, + newLine: true + ).set { ch_collated_versions } // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() - ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath(params.multiqc_logo, checkIfExists: true) : Channel.empty() - summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value(methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml', sort: false)) + ch_multiqc_config = Channel.fromPath( + "$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() + ch_multiqc_logo = params.multiqc_logo ? + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() + + summary_params = paramsSummaryMap( + workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? + file(params.multiqc_methods_description, checkIfExists: true) : + file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) + ch_methods_description = Channel.value( + methodsDescriptionText(ch_multiqc_custom_methods_description)) + + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) + ch_multiqc_files = ch_multiqc_files.mix( + ch_methods_description.collectFile( + name: 'methods_description_mqc.yaml', + sort: true + ) + ) MULTIQC ( ch_multiqc_files.collect(), From 08a28b3f28b35571146f4d88e36485941e0df1fb Mon Sep 17 00:00:00 2001 From: Francesco L Date: Tue, 7 May 2024 10:29:34 +0200 Subject: [PATCH 014/109] prettified changelog --- CHANGELOG.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a211fcc11..a79974b422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,7 @@ Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is ### Added - -- [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` -======= +- # [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` - [#1489](https://github.com/nf-core/sarek/pull/1489) - Added a `testdata.nf-core.sarek` key in `conf/igenomes.config` for small reference - [#1493](https://github.com/nf-core/sarek/pull/1493) - Added a `wave` profile - [#1498](https://github.com/nf-core/sarek/pull/1498) - Prepare release `3.4.2` @@ -28,7 +26,6 @@ Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is - [#1502](https://github.com/nf-core/sarek/pull/1502) - Improved handling of CNVkit reference - [#1502](https://github.com/nf-core/sarek/pull/1502) - Specific CNV call step, with recommended settings for germline - ### Fixed - [#1378](https://github.com/nf-core/sarek/pull/1378) - Improve cloud tests launch workflow to use matrix From ac3580f6afd6c938d08ba4e1ba714625ad733684 Mon Sep 17 00:00:00 2001 From: Francesco Lescai <53608000+lescai@users.noreply.github.com> Date: Tue, 7 May 2024 14:54:53 +0200 Subject: [PATCH 015/109] Update CHANGELOG.md Co-authored-by: Maxime U Garcia --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a79974b422..918765e09b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is ### Added -- # [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` +- [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` - [#1489](https://github.com/nf-core/sarek/pull/1489) - Added a `testdata.nf-core.sarek` key in `conf/igenomes.config` for small reference - [#1493](https://github.com/nf-core/sarek/pull/1493) - Added a `wave` profile - [#1498](https://github.com/nf-core/sarek/pull/1498) - Prepare release `3.4.2` From 77398d37efcc346b16d7b8f84faaab31910ccdc1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 7 May 2024 15:00:34 +0200 Subject: [PATCH 016/109] feat(version): bump pipeline to 3.5.0dev --- CHANGELOG.md | 18 ++++++++++++++++++ assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4257960df7..d10e9316b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file. 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). +## dev + +### Added + +### Changed + +- [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev + +### Fixed + +### Removed + +### Dependencies + +### Modules / Subworkflows + +### Parameters + ## [3.4.2](https://github.com/nf-core/sarek/releases/tag/3.4.2) - Sájtáristjåhkkå Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is one of the few peaks in Sweden that cannot be climbed without proper climbing equipment. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 206bd82386..ce1a6e388e 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,9 +3,9 @@ custom_logo_url: https://github.com/nf-core/sarek/ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index f26930b9d1..a9385cd9f4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -396,7 +396,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.4.2' + version = '3.5.0dev' doi = '10.12688/f1000research.16665.2, 10.1093/nargab/lqae031, 10.5281/zenodo.3476425' } From 2c09df9dfaa9f5d96114dc584c0028aafa114b7a Mon Sep 17 00:00:00 2001 From: mirpedrol Date: Tue, 7 May 2024 16:36:41 +0200 Subject: [PATCH 017/109] Template update for nf-core/tools version 2.13.2.dev0 --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e322567d91..934d8f2600 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nf-test test tests/ --verbose --profile +docker`). +- [ ] 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 `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. From 0ff1ae846ea8e497c3a589c36faead59148130ce Mon Sep 17 00:00:00 2001 From: mirpedrol Date: Tue, 7 May 2024 16:40:48 +0200 Subject: [PATCH 018/109] Template update for nf-core/tools version 2.13.2.dev0 --- conf/test.config | 2 +- conf/test_full.config | 2 +- nextflow.config | 23 +++++++++++++---------- nextflow_schema.json | 7 +++++++ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/conf/test.config b/conf/test.config index 9f40765fa6..c1d6445a17 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,7 +22,7 @@ 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 = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + 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 af9296e668..f3c62237dc 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -17,7 +17,7 @@ params { // 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 = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' // Genome references genome = 'R64-1-1' diff --git a/nextflow.config b/nextflow.config index e4f98cf7b8..59b7c74429 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,9 @@ params { // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false// MultiQC options + igenomes_ignore = false + + // MultiQC options multiqc_config = null multiqc_title = null multiqc_logo = null @@ -23,15 +25,16 @@ params { 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 - 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 + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' // Config options config_profile_name = null diff --git a/nextflow_schema.json b/nextflow_schema.json index f16a7119b4..18876d3535 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -265,6 +265,13 @@ "description": "Validation of parameters in lenient more.", "hidden": true, "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." + }, + "pipelines_testdata_base_path": { + "type": "string", + "fa_icon": "far fa-check-circle", + "description": "Base URL or local path to location of pipeline test dataset files", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "hidden": true } } } From a6008e67d81d4c437be0b5c70bd5b361561023f4 Mon Sep 17 00:00:00 2001 From: mirpedrol Date: Wed, 8 May 2024 11:04:40 +0200 Subject: [PATCH 019/109] Template update for nf-core/tools version 2.14.0 --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index ef7b7ab3ca..d6daa40345 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,2 +1,2 @@ repository_type: pipeline -nf_core_version: "2.13.2.dev0" +nf_core_version: "2.14.0" From 84900cb24ae502b2cd1df942e2e17dcc97548b8a Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 8 May 2024 14:17:21 +0200 Subject: [PATCH 020/109] Template update for nf-core/tools version 2.13.2.dev0 --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CHANGELOG.md | 2 +- assets/multiqc_config.yml | 6 ++---- conf/test.config | 2 +- conf/test_full.config | 2 +- nextflow.config | 25 ++++++++++++++----------- nextflow_schema.json | 7 +++++++ 7 files changed, 27 insertions(+), 19 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e322567d91..934d8f2600 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nf-test test tests/ --verbose --profile +docker`). +- [ ] 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 `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/CHANGELOG.md b/CHANGELOG.md index c35a2a8112..e6c10135b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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). -## v3.4.2 - [date] +## v3.5.0dev - [date] Initial release of nf-core/sarek, created with the [nf-core](https://nf-co.re/) template. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 222ad8b86b..01da549cc2 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,9 +1,7 @@ report_comment: > - - This report has been generated by the nf-core/sarek + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. - + documentation. report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/conf/test.config b/conf/test.config index 9f40765fa6..c1d6445a17 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,7 +22,7 @@ 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 = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + 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 af9296e668..f3c62237dc 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -17,7 +17,7 @@ params { // 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 = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' // Genome references genome = 'R64-1-1' diff --git a/nextflow.config b/nextflow.config index e4f98cf7b8..0b5c676c40 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,9 @@ params { // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false// MultiQC options + igenomes_ignore = false + + // MultiQC options multiqc_config = null multiqc_title = null multiqc_logo = null @@ -23,15 +25,16 @@ params { 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 - 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 + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' // Config options config_profile_name = null @@ -236,7 +239,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.4.2' + version = '3.5.0dev' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index f16a7119b4..18876d3535 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -265,6 +265,13 @@ "description": "Validation of parameters in lenient more.", "hidden": true, "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." + }, + "pipelines_testdata_base_path": { + "type": "string", + "fa_icon": "far fa-check-circle", + "description": "Base URL or local path to location of pipeline test dataset files", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "hidden": true } } } From 8bb7d5b93f62820ef9297a8da0bbee00a73a38bc Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 8 May 2024 14:01:04 +0000 Subject: [PATCH 021/109] Template update for nf-core/tools version 2.14.0 --- .nf-core.yml | 2 +- assets/nf-core-sarek_logo_light.png | Bin 73430 -> 73442 bytes docs/images/nf-core-sarek_logo_dark.png | Bin 25804 -> 25839 bytes docs/images/nf-core-sarek_logo_light.png | Bin 22412 -> 22476 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index ef7b7ab3ca..d6daa40345 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,2 +1,2 @@ repository_type: pipeline -nf_core_version: "2.13.2.dev0" +nf_core_version: "2.14.0" diff --git a/assets/nf-core-sarek_logo_light.png b/assets/nf-core-sarek_logo_light.png index 483f8106828a2fd7f6d2963be77c973ee50146d9..c499be35647eba4a58d074498488e719ac7d4e3b 100644 GIT binary patch delta 38830 zcmdqJc{r5)`!_xdCflfxilIV6CE521O%yUnDa)-zvS&oLYbF&D%F<>lOSVuEvW~l? zm26SAiE8Xd*0Me4Mfd0a{PBB^@9#K%zvKDiIgZ@jN6h;=m)H3^m-l)3RLRj>$?;es zP$yhj>r(ha`<}h0h2^K8riu&8hx^z6A~iG~jdo~r(68N@+kW`*{Yy<8hO3otWJo?R zJHs@6IycvM_Xfw>nAj76GT5%z%YjDl-}*o@QWXuX@`uY@Xi7uwGF*A;y?38AsW|ZQD;kXT73^ANGah&Uw25!^TbESdzdv@7 z_1_`nJ-(uXJLa5rxf~fgmC}8{dEKFUamS`Ho(Fa^^RDYi_l-qg_Ari<2zp8lHPMzH zKED?a+6WT#avRU7s^aa|bSWCv?I#?dr11Cp*d3ma8u`??CZg~LKA4^Fq)??5Ex9;wgEnqmi&Rx7(?t^Yas-tqje zRsH!AVr4_oPE)#{zCCihUg-K-DOc^sG2PB%y8VA$kr3TzbHUh5vHRGC59=8(A06{e zQdPd#R(IE@?Y{H*&&;fuaVLSAZ?4rOj&A{d;j3 zaoZDX43gI$COfNN-mIghxi99o>*|6Dn^!KCV0iKkqnPx≪tR-=&(*x4Ry*hV#_A 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 V?e+ASx#Sl}du{jJ-sSn%{|AuO>}UW0 delta 38819 zcmdSBc{G*#`#-z~Y|4-j#ioITB$?+1LnyK-MTSyj$dD~E-Fv4}D$3Ac&KNQjMaEkl zX+p?QrXAHb+YN?{zw73l&-py-SL@810CjkB=gK8qaydB2Pf|y_Skmx&>q)|8#y<; zZn^zITFG1b)55}!1N&(uF~@_Y@j5Y=f{o$djlo99aFvXvV?=f9IJNM4bq97)JFaPS^C&*=A7mfboxiV= z=l{ffqN&2vYxJc~!DzWVO=(12nj>Gm|GrdJZw%<$C`75JOXm6F-%%|;|yW>=^*3e63c|)C( z!z6Nghkq~JE!oN&dgMWyhX+UHu5zb{$ZNbHxaeOam8mo2uKe^ZlCFn?-Hf6oC+&Qm zG`)`sxs&wTa$eE@ruUtsNZ*ciE}vdIf0EJN_pYGE2GN~5<}+iNNcgC==}h|}#jiv6 z>%RWv|6r%5PVJCr8V-5%=2)GG%col|N4(w_2bUEGe|Wh{PgS{OG&cEUW$|ddBJJ9- z;&IKhXMPq$DUB5DY5n@7)?#9yN&MoQPoY|zAKX;0JnRrK;|(p*)&64C`ldF@$}7}t z|GTsNLtm^PaEx-Pj7St8q3N@ZH$pLRvJn`Q^x;<6)RMn znEqtzRVi=lrR^jUaKtNC$ym|jm}>k3wZ`WoUy~}#8czI);+rh^Vsqk*<-CuVq*BRz zQ^KWQ8Le)WbsJ6&7SNmZClK@AG0D_#>Eytd$=}iw`<)IV+zlsX-s!dLPYeiKhX~mT z>?^(}l2&Ho@vyAjy>SgUPs8v+h!E0{C}hSLKdRC+UX`*b!lzaFD4|-W6aFon0i$<$83o_#C-ieuS;)0Gh}hU`^(y>l0@nGNBVi6?j4*g_@%j3b9Xd> zdzedaXQ$IvV?>DQrEDCXv0f>3@NNOFpsZubXIsq>aHge|^$# z3nk4|j@;jF3qv1n^4>Ceg&iE05~syh=0N>R@Hqa4fzf^nZIAeTz>BDimY=*N<7mm8 z6bfVQUzYX&r&)!&jB4&`Lo7c*WDp3`i-~X;{4Efmn)bA7(6%2V5VLN*BaI+;ZkLGE-X60V zAJ&$hp0Q>;UQ_mBC1v6-)E{ z^s{Gh=|!8o$CxDA>S5QiGZYM~Vp=Um{!uG9hfQN`)46cGmZ8ysS}9Zk{8;8gDqrX` zTXkgo5Xh8&V_7RXhe~UkzBl7@AHm~on(^3GQpz!`^)pt^Fft?^XqN6u8rR2evf+1a z)0K}CHFi>mFa76$DCzk#c5P>i5C+4=xou4C;0Sh)Yhe*O5$%C;Yj-a z2WsWfAI<#Hf*v18dW@%_khlNbgyHgT5O=sesTm*gefgM_LhC?df9ukTnhcfuU|s@d z-Lmu9U6DYo+g3B1dT^ae<>`FSt^;GmfgO!Gqa}rgr!KXM$K1Xsh?G~@IE=Kpsh(#` zmgrGr7eKQyC3JeC9L@Y8%UT5fSk__>BfHJx;}^A4$_wiZNWYKun57PtE}P@2p^X4Z zucfCgkVULac3V(Vf7~+^X#~DeqCCCp<%6Dj{B2B}p`-e*N z(}}aA@q@UWQvhRs>n^z}z?dP*-%Pfodce2i&@lMKsp&zSvCVpt9sr&4rG1cw{K2I{pTwODK#-aYiu>9INPVL|b9=nNB)jWC>C2q!I-Kv zqNMBT;du#U4V={yF?{|7pI}(Zgptw1a{!M|TAGfuHXrIB7j~;3bA@%NP&2=5{)0gp zXTGx&r}}aXIO|^?gIUQH@V^h9mT_nq`Wbu4Dc-pQF=IAJ2QlU&lS_uAr)q{wUH^;pepoOGu$zlXDw3bDj&a}xc&X2MaZcORw3@lBr zXxf?rs`)>XA|$=(vnrw$`bH0~s6fLV^DIIWue_9KW~OeEN3AH*tRQ8pkFqvFR?)p!^V)0!_I-uQ4RCX{bY* zVOd&>G}$L#QW+Z#cwydS_A0vl2)Xb#A%H@q368p=U@FTZ+>8ZKO5E!$=|qAuJt+-R z4TBZyeH+%Cx!?m-o$dMZ^18*WUTWR|gBbx{l(7!iGk6up=cOW=03nJVd4u;}nt7>K zPbP-1&3@Wnz(S^&iy+Gv%Nt=ZY2ZAz)JwA8qQS51M^p~lG#C=Z*Yq^ISi=`Z)3;>o za`P`2KxcxQZ6ROGGA0E#L)5#oR&KPz*P(^&R8T-Ed7!eW9a=A=~JgTTPToi#hlx4gb?+wck)S~k;D`lOB=xN9Y5oC}!a+X<4_eEk5|38G&5 zXb%2r$~X-~@;e9EL-xKjXdf_}W3?PG5sW+eU+xMb%z^Jyb^tjP8v(fH^o^|S@;-I0 z5xF+b>AftUpUxK-&Hz(5)1?p}kL6Is=d*3=M?9ol{gUC4uWO?+C>X&;OZM2=k@Rq0 zQM`vTKb~bNv59RUE8=+BRIf*JdWT|n^&`*YDxW|)i3pK5P40t4g;=SG<&}_TWb8Ty z(TDeA(C>38pwIRnHLg-|Se6hi38{eg%!N>pYm4UIIE&I+KD0QU$btR>Y-}fd$8cPV z8#FXxbH!n)_3SCOP7TeIt9EdN!efl3et9+HrHWjDPvr-e6OQrNtefhL4xw#;ozK*%EW=+qKnZD8f)9rI&&(+Jfd=L$?7B>kSe?3T((R>EK zGX$c4^YM>n;pwSJ5dZW_CL(vnzg&%IZRpPy=$iLQ1Rn4Q-2T8qa$*uuY%SU1ggH_5 zS|qZfTz+8#65D5Sb#2YP@y3wkoIsrbRt#sx2nN`_yrIJ(nfEiI|JJT;QsHDgu~H7x zLA`rbvH zxDOfjGorl+giBL;6KICQrK6~sDhc2;oBcW`k=HA?k=aK9n4OZ!3q+<&BY8PlyiQ%_9BJ$ov2?!3F4!^b==k@#9 zU!GG))bkGm7bC2k|2C1UTae7}p~tuhajB|2`O3Ga_Llzo)ZMp~DtYzeqsvo%7R$3v z7f!WobX5@*B@{-D-%E2!CrajctZPisx+FcnU5Nx)EOJSbz5*@#&q?DH?QbLo0-m)4 zPA!DIOa}`9MZIl;HmkuZil}9}*2VeFn!9uF#iS8U7;AFXB5xgGvhR+o_R?If4xo%S zIpgnGKX`TR4;uyJ%$2m(=6Q+%DHeT&cGxsrsTXwjGrPvi`2p9vfo!n}St5hy{CKFW zf)G4!L~f%;L1teCWHZ^Ol|TF%%jy1s7}tgJrXGylSFO-roYs1lTHu#H+S2vNLpg0e zEFx3LpXik*^OlMekSluN4JdoS|O2Gg4(!zTJ$t&d7-E4Dfs8w&LEV)@dVu zw%OAatw|7&WM8{it>R-}l-As9V~(X@#bah_SO)ZIJ6LXAGRqeWxp5blb?w>~{KEBl z({HokLr5y{lyBar8E#g@;GNT-lRQP$w*bA}hMSCl8iN$;WKQ@^UI$>Og>r#^ZoB3W zw3`j68%b;P7$s8(XRBU=IrvkBqJvcZH=|Fz7rS>=iI`Fjg1#Vf9T~ecNL%{} zr~VkeB21f7j}V>(*OZ-tct9Eb% zB_G;+kdbku_{YV;H9Z&;7qod)=CyewiuF)bK{-yTZq@_|QSwG(DM*CBVay}B;v2&u z@|vlqRPkn>Dx%@~;oMKa2fN)=bXx^uQW7OBFppJ@X@i!F+OSs6? z`F#=y4%}`nL#>%iKTiVmq;W&y>!}{g2KjU#qD_TNcCr}5_${S^*Em0@Z@^7X2z0wNf{R^ zMm|KDAn7){sm_P=tOut24sdjVD@hQo56u@#@HXaN%%Rs zdU*&_N%25B(PZ=+`Um5a=1s_9z}0w%n`$I+2fO{grw%fU`y4lGZtlDbGKDtt^MiOE z3{jMrW^2NLqP0R@bMFS6!(WARdFLeSSmpfWT~`CG^Qt9|?pD+e+PbJaYh^V?O)-D= zcdlayi6NPgEZ$>rGMTkSCUNP(X3W7q6>bZC=^$4shj?Ska7YQTDF%d|07E~TcKcyU zx3(O6z=s1kZqWYb^2yJ?%P9P}<-~Agl!f*t*%`>slsUn0r%}E%Et63x)BtXCsBp#x z0n>!_PP^2ks{i<=M&=M|5<_~WZ~1Btw4<+WlW z6)=%0&0OClqsubAkg`KRrI(I_{3ea{+J6 zmYXy)Bm%A926F_MdYc?e>;)f;h`hz|x*n*_(>fy01^Em`Uev*yWB^e`n};@_KX`2! z65T&n9EKxVjf@{`##{dW)+^K)oe}p-v#>3Jy<1N+t?x>`A)lDIXpc(yK1%IMLU+EJ zyIYKGf!CrOul-R9Le2Mzq&@?ABS8&zXdg|9u7&~lwxE{=c?OH0&rqBJ&)FBal`7_ zb@{w%u+Vy-$w--dY`V({4U^&00N@(D`{i--1NiaB)!=wlu1R zZ!++=dM%Fn(|qB?JjiS1G#@&^e*ol2ocM!$26kAFu>;1(>sV!jk*hkPqa*<;Rm&)=o=q3bMmFj0dbYo1*9rulPP=Y2 zGO~KVPbPF9<1-klu+2kk=T-CFlLe!J2LPy>y~*B$y0|rd^Ikg&CvC=c(e!De6K=RyQBVuc*^ z*_mEI`BNcNiM;`d^RDJ5p$ z08i15bS>Fj_DT+QVi}mOvJ}K{Xp^f6B&Jkhu@hw8;H|+TISO_vKiknQLI2atFZG0r zH3?5|=shfq#I?;`SX#$07t9VA8n0|LjmJaXNtg)$MCjb_&uwtWKmaFg;qakWrS-mM z=D>wl3vNlVq-~*{b$aLaWxZgw=#je1f?IYPx8z<(>iE2Vu(pZSIT%JSrq%ZjECr&h z&NDs8lBw)vlg01lAiCh76RJ+i1MOdywxGL9mZhcm89_d|6-f2)jRqYZd znI9jP^0c@EctLKuZ^qpzz~lFQbm-CibmbM=!kjHMEWYcLuqNMO5M`;?O|@FzC;EDO z-w||mARnlSzzB|zZn~@U9V_$}Zn#15M~F%*D_ndmXe8wIvFS?0oF;1#{BZ+EC`Tet zcciC3Ql4!@$~X49IvvXRHk0`+@W%BHSHv`wbZh7{fUO=~n3#*;0)RJPdu}8R(7H@Or~= zTDnZN*YTcvL$?D?CJRCn5KMt6`z;yx*wnvj-b6gp(L3-#DD+X6o9Ye%G-fl)(oWQs zb`VO5{srT2pt+-%aMH0vzAmrYda^UQpG&cxXXGKY2tm-AtbomC(^CPAC_slKBMeP> zr@9Ve?KIJzuadvs)BT*1cQ7P^#1v95Q8|4d$6o_Me6%jx2ISQR)Zs|L@sHzFVbW8G zYO1&?f_O{NXlqb~omI?{A*{-oJz3E@wp``tNNc8^oI16eL+_mW%Tko8+ zyJY^~nZF1VkD%2=;5phZKVdNVb8|qe7t0IifUy&*ojt*V}NjeFIy5nM@M4=6J58bR*xLP<}Kd zZ68%l^tX6|e)v^On$orc!`9(31I1gjju1BE`crzm=)Q1^==<}i-0_<~B^izpClcFx zC(&#unl}7lV{vF-E|gg7E`D4AQnP6>ynK)rVyyVt^HAd3k4L{e=Bn$gN21!MZ5&@h zc0LmdmzRaC^6ex4q>h(qTC&cCgS1H%ZPi(2hAsNta^~GL(s}$Vmo(#+&ntytei$SO zkf_a*ypL0_TNwhAK#e`G#=1UuXVran?WfbYGf-aW5nKoz_@y+Fd)tGMppnnXkD#Di z>+Rq;-8(=>1?Y1JnSHx?LW%%d5JHC`DAepn)F;R8+X{4Um0awV(Ocr1 zxj=nKGeOO&!e=KI#t^gVMo73lfy)m9oc2e^ktFLhcENlO8*wTBf>7naxm`r!{&e=> z9a$S_Oy~+qKRe@g9_x@Fv7I>o`)2bdclQ7fsv1MTeW}m?TcJ`+Zlm=yWLd@|51^SQ zq^?=MPxf()OhHC8#~VF*AvB~^rpOGJW`2s@Q^@~`58JsSt%-V2MST>WBh-kCi-tH; z_ZvW`G&SuCP1?xlQ9b}PY@2eMm6i)Ag=x~U7=rELKh`&gH1=Z*>S%h4) z6+=G!7+G*LOYdd*+rAljpRorz{8-*;wY62tPdJ*#Rg&+KvF3-JI^yX{az@~J z2^NXbe@l$3JV3-nm{RN#X2jUK&+^V8|S z=*)%>;jCB*nOk89)>d+jhsR9d>x}@NK!gZyuwMB-8}k&XKWgBfR#;+6w{Ua?pCZAe zV$Y=gS8wRbXDo_{izX3Ai=vlCn$b^ilesC49Fxe5vQ-C1n5ly_A)ct4jgUSpm@}qP z7I)~wDrZ)RsSR<(e7^$)iZ&u(zZ|tMZT`6h?`Zx|FqccD1D=7Zpw5w*USK1<3N%(vrZ&LzDIl)jv5v5;2IDpE= zm1ik~E0p3Dh?V08<>BxEGV9qOuPgZg0V#ybjSa3bmYeJoOxHG6%4qZ8wn)TTNYz8E z9nK4~XZo4*Fe>13DOeUVB-0w|QEvBnhiotkiAn|E59BdgqyMdKA$mtppIfg8J-jQ<&%6?LS9RQfI z$P?fVqs4iFnPb#T8Pzte443{B&1PXS{fK zKKN~4Vdv6^8oT7h-s%D62;n2#@k{pLpjY@M0>CwkK`9EvKD_G4K={-p%g&Ft4BD}^pNh+p_}`lVORcjQX_lJA?A!;3*0U#1#$w+PF3 zp4-E0)H~p7R5CruaahR{^cN2LlfX$6w0;jb75wGl*pV6~-v+AznCn~t*Qv3be>IcT zEKlJI*?^VFB^(k!2`Rtmf-x*7t9>XC5%8WIQY%HKpVUP4{VXvp)Mkv7%76AhDX%b69yp}`tLTrl z-qdRAZf{lY1^4p!i)V?!=U@<}H1*UML~aNBxXYMLUT8cJk|^`Aju~lXxKd-R$2^=z zoA2m`p3QN_2oT4r$_*qR*+M1y5`;Tt6)?Or!_n~s^|~@ABraRgJeW5-uAQ+0K(0wB zU^*N1>;BW-JSpAYdt@bSnm+NjzjR{h;&tJSk%{Bl+Z4(Iq*%}HBLVf`T0xXVw?FKT#rJ1KMjT6p19jQBte0{}m!zBLhU%*vh>~qh z<;kq#w3~E)OKwDWr?#r*p)FT{B2?)TMdLLE{$6FiKT@iFCXt&+;46dGTY1aBMi`0v zy9d>bfBl_Em~N6XRnwbkk&~Eg$bXw7=yBz4yf-rIx*lkhGTbDI6 z6j;-GDpl7yLv|$(ncP#+y0EUUhZTJUdSNyA;B7#swfSf*sCE{(W~2bF#apRezAqQS zx>MKtH49}mR5f=~?hT1aKch__;zoM)AYjxfS5K^|8p+fpjVjgEl=v34@TX$6bq?vb9NAMjxlFl^l-illDZ_SSi9I9J=r@J!X%_pTv#o1GwGwl!tBuaEA zP5~~=CT0r|+!B|EI@zby!_ge6i+;P3iGP#^>8_&|&14E!l`uARV%v`A9ZAxa%IOCs z`){j$wckd~oOC`4y3;j;8XyTl=dEU2y4Ys;7(W3EOV&TWG$qjQ<~O9MD=U9|KHga8 z5ZS%?yU~w1uZ4IcX}oZw#y5XX7~ zIP`i;F!y_aN*|eK!otylivQQvnsaS0l=#Y7Pd(HE{C*U6HS>8~T;z>Q9od7pFfexYeNV5*bpi%?!P2E1I zIUxrW%#{dB5jx9V`Ea`IG?c*Mf=hNkx_;cgaDA@(2?cBCahMU}1-!o^w4Uq8|uum%py^ZyB za9!IgS5z*@`knEHLx8~VP?%8}cVSwqL%EO5&ggdyV1?r(!xw7d7Y)4goe9LkVV!XR znGR{@*QzMFS4Q6_zrC#mpJ79^aRGx}&$>s~3mk}C8lP(X;IK~N)B4Wm5L^W=i$gYagNH%!%G#%Hjp>A#jRWb zN=LgEXxWph_x_03X$<$#sh-wvl}@u&W`(ZO?i0Xg1cG^x)j;v-G)2baS`Etmn}nNK zHt7io*H%cl%2bO^P}z$3S@(LK?vFqT-$Y#ZTYNxn{>LN~i0!j=q$>9mRrY7czW6vq z#GDXcrM;#T$5`?#_e)yZn%jS=OKUFCyP1&O=Vm|CGUsujEAl4K^!>y{4+H;vL*^AN z;iXB$dbL;AR99(lDF25Wyz#JQm$7jrPVENOHiBwTG7d1D{;J-5Q1&JyZqNiP6H@1m zy3+oBMw2xR1K5axDXB?pt_-sc?YNWP3oi!6b3EWyVvIhlA>Ikjmid9>Sw!T~%VV^# zBR`hpA>Xh&pm^`-C#N^aDx^}eNTq5|)SWrcieIS{i|H>_i?56a*E%O8{`q}Y)wX=$ zim3LbwcKu3u3Yh~DNj&PzwjmBx7vSXZ0@+8;)UJRR_=fC&kk`v28AkqKmqlqpAC!2 zpn#Gcpe!iG_r2)*@bUL78;iH_NAz$G1h8h&tCV6aKgt zX@fLBWl@KDm9w7r?scnmG(6H#`XHfj zu=h`CN{_ecfL5u(XXdkOZ;YlVoWlQ=Ee?2b0h^@o&4};3S~zt(3!*Es2wgjE0rlH% zcJdE?YHpbE_VSR)$qEdsnTEdpJ6h9#z}c2v*ml$H?796mS!8nRx#t-DIeC_k-LCJZ zisJb0Db2l-_H0R9VjWbg9#|ChD!Je^^+@MflRE=+rrDDzuzFqZ^O^7OH2rr}1vHZz zepUE;AnpBiS_cmx?Zc~%L7u*5IZvlt12=;P?W-DmJxs9kZ@+~KGP%1V^jkLS30W^0HlJ2%7^Q_r0{Cv#wXQext9 z%{PBVzj^aUN+2etqx<>2>%x9&x`jdYA&qvGr^2rpi?5k4J;L!XUZWud`4b9ZjO#*3 zanf-(E6H>5eD+*@ugLgaRJB$kH(84=49y{d^nH?X=3YlvQkfg#yp&*yfWtLU3#nk?0N@ZE9Zh`-Hn`8D*Aw-wdEO>e@^)^7 z(O0BbOyWavU54JRWMBX?O^U+h5cqjX-$#>64_cn?U!g6}(mG=ba>Nimbj!Aa zgt8s#MhkwMBCE#Xn>*mHMnqCSbDy2vYVD^zL)DOvejgMu4$FjNxdS%V3GIzERXHQR zdK8oLE};ejo0SQGMPzjvF+Wq8AHC=6qCfF5(vSNRvznMXr}iV!>S0$|ETY?~~sqTLwqDdj0i zcv$;j>K<&W03T4J>(J9>3c?Qg9Y5$ps11Yf8QZ%{=N$NqB#oZ};tm1jtYhIArh?fu zXS@@+D%m@8{Og9T;k)vWja&Oqqu-%dva=of*id)M>X`qzJv(9!VcHXGhplYFDl-DD zL#jkOul2{q=y6E9K6fCH2z;2IdHI*??okheV!IT0r@kkuk#UKe~r>Nu7l!Ah^pz2zh+=L%?#9TkOuQ$Z89yn#$z%inO+ zRK`qpJuwu@%@pH(858+-}@jFA$os_?$~!3xJ}v67+6P zCSRQmh7lB@NWyz3OPO&yfSolvh^t8z`7>XF0E-GHq^m%9=^#pYsEA77c^{Ph9FYka zZaUyb)FV}MCJqZ+h~_vvVe$eSnU>O|EssAAOb|QCAT+@2g2o^kFTV&0qO)s>|pfX@e)jD+c7^*}k z=|AHsszDwHcmE19w_#%}52!V29BwJIFR^W9u^*u51ti_IBJ7Kasiv7>&Yugn+vKPa z@ujJiCVi-oJ~+HRRb(cSGqG3n`WYPj@))`(IFRCkn|rnH@Y_$@CH^E%80$t;z2K>8 z@GTe^5{sR#%er#abtIl9rnG|6keiQ^%UtLg)D^zNAqOD}AEMB#4d!=ViLR6zhWgZ)#L)#^062Zf? zKpYrH^l}7i!{$#Uc&-BMVp_>V9lNx;QmuU725&u4iTnQhVY6u&U(xNBF!%)m>J^lR zkxPZ}hgAn`tz!f`cozi9uAc1l-RkX%EirLhYD}8de#Uq51$3_R^1nJd95W(w#T#L6 z4;n#@qO;6__;3N+>$tA-jp|ILiaWW}GEw!N5@jBjOPAOdzYj&Y7y94q)}z~nS!SIC zrVsLj>eLPTzah%3dT6(zWM$o56L+C1S_w??o2vN#itG;JEKw^8aom9B!?^XEpn33o z`t(!^`V9y&5>@3vmXnt{mdht62S=COKayjT-aIVpab4E)SC$2mIW>V!BRVwF<6ySm z8zb;jkI)i7Kdri3E_D`7PxPu^STy~HI#Qa)g*w(ECs29o8uTkA<35(m4JioW@^Q7FfssVS#oqDC*!~ z-^M|+2)WWD!QC9&8NJz)-Gc$t?|{!fN}}Llp(Y?vY#d^B5bID#;}jscaC{trKobH( zA<79ea6)*2WfmS#YFQa?n;QoaT(GQsdgj;LMVRd?uI}V0fjvYV7~TgTkf`O4k_`@n1kRhcV#2?eb4t?=uuf)3W2-9cr={Z5%n$izsJ z39OhQ+OcjoLke)AuuhrN5_$#Jxwm$+1?xbA<=k?mCTT2t8zwOL<9$K9)#|7Zb8Z3DM z5jTi12}lS052B+Ys~ucC1~&1>8KFnI#oSb5h7@3XQ3!ga zlPloHG@`8Di+djljl2txHbSc}gFb1?crnPCb5d6w#O?qeZC}Y5B(V)yVhjTw3{A6WHAgS7-jMLv0jZZLUxt_Txt4Pab(4ZJu4yQvqqI=uOi zOLHKG-;8>1yB6dbTUqJGKA+PMfoqNTslO+xuB=J3KNrlY;jk5s;F48zcNL0aU-;Mj zIkU-}+S?$sH{#7O`s0I3nz5VR9KU5Ue1LHalyyCApX9-t%W-}gVYw6Xu;4_6#3AVh zd_m3#F8~wBH;E+ev%#l&&w^pIRvMwp`V<0+Jx@&L?@>h9JMewb?6gvVM>MkQuIt$p z_j(A$7{fD?_jbwOBXUfuR%g8kSFjg3;N1xflDU~nq}8ggVTLN3X|CUN%IhAE23@tnv^i9D2iyW=&C_kpdtMFB&`F`wW z2<#t99mGl!CI4~LH`ExQRgwnQ%f?Maj^D~UMp8#2`d2B`>$cz$uu=Qpch4GK-pimu zlM7qFl>4FR=~n#YZ`$QtmMz;K`|2DykW`E0(5dkzOio1)~GAKPz zD-O;ff!!FJJd5J`h`cvFbM8r@)-+hm6$iX9a~Jwt^mMv>_S}N?2L;%mse#DA z?65TUUwMfElQUx#=+%K_zZQbL5fql#?7d|cYwJtQh!?qI8<9k9Ke&5?(w{w$wW+c9 z@>cSkY4}<%`#=sF=6%?PLkAS_-@Yy9Z_8&!!y5TC9(hIQNwaNlIfynwW-CD6Y&?>u zrVHCFxr28cUGOA;OGT!Ggf|RVL>WDT*^3^Xg;Amm!-x}~xKN3zXQnNmSGLNRvHk{J zWSY1HyuvO4^&$4^Q41B@8o__Z+mf>N)dkcarZ}Zwlk;)5d1;o3BVwlilKUuIB4_aG znKmHZI!F&?VOjkjt4je>slvL{vumEmOik%_kg^^IWGnZ;HA{)roZ52bnNf=e6sMl6 zXkrr}YsNN4+wO?`W75~@DHb<^%{G8GjRT_F@Bd2yCXZm1k1%5bbR3L8@1+_#YSGRu z0Qy#X6fwxC^nH;MEgNW|LSFNf0oYv&H-WP!DPQz$|GJl9#SmnaJXt7?wX*v+p2uQq{JinIOw=Vc!* z(NK}4AvD9Bd99st>8|p?zhMwchCon$k4V5KR-j`IBXRP_7DgR#)H;Lk18uN2NDSD8 zu(mVqqf@Q(n+iA@tLg{bNV?IR|BYOLJy(pYy`g-#PP=*0H>-b%mX0~nP2OV;aKU2Q zg3K$uCRi&|O?**t6xDg9gYjp|_XEZ@*qd+vP@1GG$M1spKn<3rV-q8>?G0)RhlK3V zL{4S>=GfgucqylSp8XEN+9I*Hcyz1{&L~&Rj4nCrBexKnc&YjZAgX4?1 z%JTsGIzU9m(|;2YcV1e>Qn; zmsrx~>V)-!Q3Asfy$c5E+4WMwG+KGze~Uojf?b8Jj$Vuh(*YjU$rH2A41e?o8U-Jh zw`-b~HeLm9)U8kp_HUD1|5YD$2);}Sq0QmCro_7@dsVj?>bw(IgWV{6DDgOB+f%z} z<)i=o2>71RE;-HJ|DFPN{OtRrI+PGIQB|`0?=8t_1{JsLT|3{gW|0kLL&x`QCPc8pHF^tmx zWSIYNK;!?FU6B6)u1eA?{&Zw(rZSrcyvoXR=cYI3cXvBX4dM@_< zXol-;%I7tmH~Nh~-3;=&tFuAS!Pj|OTyF8lS_Utp@o;68P?;_>*hOOLd8aM}xhhagZ@djDI>U4PtlS{JR0-gU0Abb8E7KdyZ)&_~Zv+A+L$ zK)0&2%VJ*4ZmLsI#HKzfhMqvT4fOIN6mS#}3XXpnyO{WkJTkAg;;oRb!de-;Az>n; zLMPM5tOL5Ur_Z}PUJpXFHz;-cuJ&Fq5g$OMP$>@=vc<72VvK6ReGy3$KRS6k zuk`!+8&)rw%E)tgvaKU55ekNM3OLq5MtGN*DBSQ@z4f1r*k?HLRingF-qGfuiq#9x zZPYF1yZbzOkY0V0p>vFWA#q_G6F%MKk*0k1Ke;7>>8!;qBi5OiV3~NSsQ=+6i$q${ z=os5O^W8_MjuNQWKhF?Lzb1Bt%-h}`&-8DpZ$y&?&C&7CLEO{5o}#hOWD};vg9?Vt z_siHBdCe2&tEQ*A6My-I493iE&MZ-6?Plyj!=BGEy}wSM7cB}FD>ISF%-hBxB#dVg znFvn!TjJgK0S}xHOfbKt(~Jmw#Hmb?)Wfyg9ZP!$*2~S$kYzG!a0o{u+u}Xn>dmR< zHlqK;zl`|x@rl2u*$+F&Wb)AFhC2QNM z{>*t1V|jfW$LggFb^a5d-f$w*85{E-`pdQvWz3Ft3I}l39hS|1U9h%XKwWrd3u`rF znwMt9A(PoduO~ze=}etsz0z?XFoT^*bGpRW#6s?I{#%rCi8?Ozrc{yHjLtM~SaeAa zjp}C()m#iJxwwHhR6N-i(S?@s-{E2jhM%a3%ostND`2xXuFg+7Y${`jtxm3?iO@J+ zrBnZ9ZwSCFON3qQL(pi{K(e2YmiH=_62nD<>3%WDN}vi~X9@cqONM_6TI9lvBjn<$ zIfCVw!S3GX`5CcOZ1&t@hKhIE-^ypICk+RorM``72xaEYvFR zq?m{jNd)t3k=fC8wt`v2MBaIh85M8m#tWNOja#KMOUQL?GE0U&&4haPAd2&U zPB#AGYgY98#&9XhjCIB!xi~WQ*3Vi)+~% z@#Tdvs^HsLN}4{iiekbOL2ueq6`n2kyN@01pbMO9v^J`LXhSjarPW*9ut*_j3mOHs zo>)7>&#F%R)tBbPVPG<3jEW+37kqJ;FGrmL>OxmwCRTtTl$W(lp&CqIXmLwr{^n;S z!TWbpzKjovzxtuZUzVvsjHH*F7~8T{u*0PCQh#~DvBw5+=SX#N27UO@Xy0+R=`&Ik zlj%&6$2vFr1tr2gzU{;(nkX**Inj8*!aK@DHnT*gjyX|GL&E6tC$DpSW@DXZ^k^_e z)17i3PKUI;qamaz-p2K()Nu8s1iOnxakrd{uq}Cz+uiA#H-h_)ZCj?Uu<5q2KOxO8Fp?f73wlB@C+@ zh4qp8ZT2RvE)j+1;S}ykiigG6cDCMozKdqm{f9A1>m^jK@6=Y#viBtF5`!g~!KU8t zcKfoF?omwmNMQ_b&S3QpEY@n+_-Er%aG~SgNP#`Yz=BezBba&2a;Dn~C@C9$SdHs%l7tihZx25#oGl=@@s9(f?aPid41WVhHm=u|Yl7V#@3F?#G6-SUT@|dwtd!Ku8m5>; zWd@z-W2wtw#m_02HwrPKs7R!$BBcF$!hAaJbgh0vh9og0aLLp!ZZYzu0ACb z7D6i|{<1XjGLunB56j(}S%T~_8Oj8LC)AMaFFK`YcCMN+XZ(z9v5?6$q~2;jXfmWI zlQ}>ip%2irzjPW2MNqjDE0CSLWAn{tm6wLd*x z$&x8Le-hrTY7^D3jOpk6+0p+Y`^I^EWTuEhWzUZn@u1jo9YoP*ecgUWZLM*{V=2~& zh~{olipk>a5xh*MJk$YMv5Oq@^!`~Lq{lKdBi2SH)0{Fd)~i--U@9vsz=>@VP_BfA|@j44qEyK4d1B_}!Pso0~=J-0a$u5zEW5$Wh5v z(@~fkPGn}q+OH+2nXE6XHTRmCB0HX^nsW855`!42{*MKGg4ga2>Cn>ol7KeRbzqKv zx{H{S3fGs+R2C#-!Gnq55t1&u2lU;~l`F7R7>{CGUZy*-f%Z*?p2}pdJ{B4u)iItE zO)+VRZSg_PWz3kCPoL5Xvtz5{DWBCf4Tno(Tb$7-dPA7y+cW&$-i?10{()ZvbVWj* zzR1xHH!3|-#Y1!;HG(4G&n=mlxWcy-XcH7}L^DI>f=Hd8e9A$Yv*IwlmB}PiOeAmx zY}GjJo$AIm3No4DI3}(z(zCfFNTcr1@6hH=vQ>1AFWLSZ`ngd1W_c;9wD+0DKfnLs z#yVeCdi7vZ8tX!YWytxfjPq-Y>+lppRk_ zlo?yicAU481RVuq8?UN7$)y|SH~5}Z(e<)p#f8af6w!ONe5_3j2D}GnL(o=W2D?$O zt^}*MwY5>s$4!Q+VKI@vSw7w(950+5yQrj@(Nwu;G~z^JSj%McWyh*sja+X9m&uGZ zV}q@A_6&xkYgHx^t2%6VdsYTsUJ`F8%comXOcbC=>P*2nRtsL@K0^p_ZTyq*&*kF6 z!z3CW#Sx#{MD5imZx4mD=h}9J#KWNGM&B#^@ z)a5sCI)1OL5x1+-;d9b|ypW z3<3idCtIkdGGy-g$bQY;ZC%YWnNF4_$;Y$a0xxmSujy1Q&%D%o*H;(&;{nSOfBP!3 zuT?fPmL@<`Gbr6pF*wUTzcKUo{NSxzNV0BG0;RoWSZeZ(Wv=PiuDb;7_FN#KjO>? z@OLIQ8xv0=s;tS_mS1W6-fk1pT{X`iaEKbE3?P_DRj;d?=z1z^lpPB%du}>-*kovT zL~X(NxO>3Kf)zWpUo;mxQ#D!eLz6$?B$$ck-ZAutOlG})cq|aeB6=UyVg;?|DS|&& zC~3jtqzM25H01|4J>ABx%d^ zC1D3#LGxz?kv32ITP0s+4S!#N{;Bx56N&e}sS>&?AV7vEua$T0=8jtkN$WM7#uz;t ztd-Fvo&1%y;y>SNx@PL=wYa>WnLsG zCb_r~G@b}w2ZzZj`FxPOWUe9xD{WrzpKr~LtHQr_!MJMSiRy#urF-VWc*A^cl z+nw3J0|kWlKabr4;u)Zm_d}ZZm4n9!xS1kKPv)(Kpo`LLmT_++jvVD#a2EHRb5@E^ z(1Vt9HkV)i$-8GFnE2P?(=DOto;I*Bu?cR4VWI~*gQLKlUfsNhi$csdE#=-!9Id|G z?8RA3hn;;KoVO0uW-K#aFNod!?=IvdqEa|3V+i#*0{69Y#Rtxpi;V zQg@nvX#*kehYzpjrkSgm8c8c?3I0YcgqlmoH)ks`8-C+OnFw6|HKJQifSfv5CniH3 z7<2PK#5)ay2++)XC^fkCY(Uzr_z%CGfHpFyul=~h67ONn`LfMYm9Pxw|CRwK{|lXM zwWI+1UrXAXYcy&ti@h2+>eD5h-_jc3Y@4!K&Sjh@e|3?hInr-bRzP@T*T3S~%nKXL zZHdw<-T{fH|Ak0gHXbB=1oDDhm8o63zv0wUQqVU%l2(<9@dlt_XJ+^e)X?W7QZ5T- zcD41Nf5HYR=wDc6Zn~{`6@F3RQv8h%F>bcq&}uL<@_^ z`&F^fNOVK8wCb21sU_6M)}IO6*G_kimK!`TRJvE^5-;cU5@IIwp~a?u4!t;HNeiFZ z_V3(1;8NYbLg5v=rIjJG2I|t?osbPW(?sj8Jcr2a4)mS-5M5JtZGN8$*ZH@c*Z-f1 z9f8hC+rCnrSIL=wL#HDWvJ%Y_6gJAG;a21Bjg>73g!2Ep_5Q`?^5f8R@m35vLE%Be zkY#V@-N)(5FUOTT#~y#wcPYVofFmoC>FbE;+x0yz&21o#r3L#nT&y`2t7`l^?@Joz zI}5s-&C$wL4>qf>CkIvB4ZKL+pWwv)IIEclm(itzUzzB6eWbjLiRfFt)akE&g+AFn z>(Igvoh;q)ft}5ns0E~AM;a$?gQ@%*@;MfVgI_ji1X=t_)=CorTF`3-rUYj`A7BWz z6VhG?Qy+j93k|_ko$!AS=c<2s8ctK{o`YTTURT1ED%>3ASTF+qOB+(g1Z=MYZQ;~! zMW4ylBtH!p3Lab6za3k|J2nZ(o| zy| zV;x}a_=7>X(!3UcW81ZP54Xad%M>g_)=}CL#B)cD<*HdNG2I6YO8oa+**3-w< z-@5}*8YGST$fxNyjIzas&tEdO6A{K=v-_^kJ#o93HA{yjSv z1cILZL6l2*W#awY%1hyvD^47-?T%x~C#E|O~@ z>ujn<@%M$PioTP_$@2t!+StICx_x<)uzuN6nU@T)e8}O(2?1xVHh2!T@il*)%`ubu zz)CR@e7w2iwu@qoS0FXq%h+YWJa5angMHyI?c>fboX{RTzWYv%?VKpqpO`!;YL0pC z>zO0;_@=;{XClysf}2%i6pD4W0D9-S{(ip7Ji|qbE_*i4)0JwR*C?ecJChw=eT+f; zYe4YXp{g!VTO96ey8w_d!t*zSmsr!cnR&NW7eVG_vr+m*Olkmts@pcdVU~WkF?{Iso>XvIq1uh6w4lIB2F-YshPGr<{jTqM;(@6`jUT1n3MZy~WKzd|i=buLpwVX6b%zi(=75HE_j}w z)g|5cJ~g#_0WmLh(Vz`zuUbM4pJsN$D&V5?hh-<+2ELz|jM0DjJ77&wzdLQc`{|6L z+N~2|-O3d;Fh@I;Txd#VE1sV@pe^3(a&}34bkd7?thkddf9Oc3 z-2HF{VjDl{uG_}<=#IKlqqdre(p+d{PX*uJKf=Xl4!;G)AvZJ?DX3fukKJ_F{ zyy|hZULK%4s}qvK8qqUK8Fbn(ASE)1InG5(ejAfjwfP=*itcayVsDl9K=l@M$pG`< zeW~ov?|+r|j(lD~WZ2nuZ|sT6YrDeQ(G#{Y#@2uNU@XsqmE`yN5VXAXz94f5656gS z6R$3h0NAg5LgqPDm_1qQi}#_@6{}mVxsHK%-xl5J)s_?ua>A?2WOW2m%FvTBZ0mFC zXEar5j~dvb-RJ#`P-VyNJ72;Yb2*FO<^_A}B@~7=8aW8e?6rcFX%0D#3v^2UW&xVF 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 IKYdRAKexJm5dZ)H diff --git a/docs/images/nf-core-sarek_logo_dark.png b/docs/images/nf-core-sarek_logo_dark.png index 1478416c723482df7e2edc99e37523950d187f3c..e38a05fcd556fbaa511c4e04ab369b3e996e4b60 100644 GIT binary patch delta 25214 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 delta 21759 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 M9&3lGJmnepKP8Ompa1{> From 3b6e7cd973a7471a556ba4932921a37fc6361afe Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 8 May 2024 16:08:08 +0200 Subject: [PATCH 022/109] fix linting + update CHANGELOG --- .nf-core.yml | 1 + CHANGELOG.md | 1 + assets/multiqc_config.yml | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d8bffb8ff6..3eed72be0d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -17,4 +17,5 @@ lint: - docs/images/nf-core-sarek_logo_light.png - lib/NfcoreTemplate.groovy - lib/NfcoreSchema.groovy + modules_config: False template_strings: False diff --git a/CHANGELOG.md b/CHANGELOG.md index d10e9316b6..cb63909a9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [#1508](https://github.com/nf-core/sarek/pull/1508) - Sync `TEMPLATE` with `tools` `2.14.0` - [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev ### Fixed diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 27b7085893..6fde6ec486 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -4,9 +4,9 @@ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-sarek-methods-description": From 5c6547e1cef1967566baf38413fb46db487304fa Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 8 May 2024 16:08:58 +0200 Subject: [PATCH 023/109] Apply suggestions from code review --- assets/multiqc_config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 6fde6ec486..ce1a6e388e 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,11 +3,9 @@ custom_logo_url: https://github.com/nf-core/sarek/ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the documentation. - report_section_order: "nf-core-sarek-methods-description": order: -1000 From 1920e05a646e4eec666f09b1612780130755a5fd Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 8 May 2024 16:11:44 +0200 Subject: [PATCH 024/109] Apply suggestions from code review --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- conf/test_full.config | 2 +- nextflow.config | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 934d8f2600..e322567d91 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sare - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Ensure the test suite passes (`nf-test test tests/ --verbose --profile +docker`). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/conf/test_full.config b/conf/test_full.config index c1b07ea4f8..1ba5ad2c78 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = params.pipelines_testdata_base_path + 'sarek/testdata/csv/HCC1395_WXS_somatic_full_test.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/sarek/testdata/csv/HCC1395_WXS_somatic_full_test.csv' // Other params tools = 'ngscheckmate,strelka,mutect2,freebayes,ascat,manta,cnvkit,tiddit,controlfreec,vep,snpeff' diff --git a/nextflow.config b/nextflow.config index 828023a7d7..acf5355594 100644 --- a/nextflow.config +++ b/nextflow.config @@ -99,8 +99,6 @@ params { vep_spliceregion = null // spliceregion plugin disabled within VEP vep_version = "111.0-0" // Should be updated when we update VEP, needs this to get full path to some plugins - - // MultiQC options multiqc_config = null multiqc_title = null From ceb20e0f802cbee1615bae03ecaf1e50bab69dfb Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 8 May 2024 16:44:31 +0200 Subject: [PATCH 025/109] update modules --- modules.json | 14 +- modules/nf-core/bcftools/annotate/main.nf | 4 +- .../bcftools/annotate/tests/bcf.config | 6 + .../bcftools/annotate/tests/main.nf.test | 108 ++++++ .../bcftools/annotate/tests/main.nf.test.snap | 79 ++++ .../nf-core/bcftools/annotate/tests/tags.yml | 2 + .../bcftools/annotate/tests/vcf.config | 6 + modules/nf-core/bcftools/concat/main.nf | 2 +- .../bcftools/concat/tests/main.nf.test | 15 +- .../bcftools/concat/tests/main.nf.test.snap | 112 ++++-- modules/nf-core/bcftools/mpileup/main.nf | 14 + .../bcftools/mpileup/tests/main.nf.test | 134 +++++-- .../bcftools/mpileup/tests/main.nf.test.snap | 340 +++++++++++++----- modules/nf-core/bcftools/sort/main.nf | 4 +- .../nf-core/bcftools/sort/tests/main.nf.test | 24 +- .../bcftools/sort/tests/main.nf.test.snap | 39 +- modules/nf-core/ensemblvep/vep/main.nf | 6 +- modules/nf-core/gawk/main.nf | 5 +- modules/nf-core/samtools/convert/main.nf | 15 + .../samtools/convert/tests/main.nf.test | 32 ++ .../samtools/convert/tests/main.nf.test.snap | 65 ++++ 21 files changed, 857 insertions(+), 169 deletions(-) create mode 100644 modules/nf-core/bcftools/annotate/tests/bcf.config create mode 100644 modules/nf-core/bcftools/annotate/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/annotate/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/annotate/tests/tags.yml create mode 100644 modules/nf-core/bcftools/annotate/tests/vcf.config diff --git a/modules.json b/modules.json index a64bdb2c7d..0eca87376b 100644 --- a/modules.json +++ b/modules.json @@ -12,23 +12,23 @@ }, "bcftools/annotate": { "branch": "master", - "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", + "git_sha": "2ad29c2aed06d815d9f68ad7ba20b3b1c574ce9c", "installed_by": ["modules"], "patch": "modules/nf-core/bcftools/annotate/bcftools-annotate.diff" }, "bcftools/concat": { "branch": "master", - "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", + "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", "installed_by": ["modules"] }, "bcftools/mpileup": { "branch": "master", - "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", + "git_sha": "e7df38a545d7d72083eededabd8849f731a01502", "installed_by": ["bam_ngscheckmate"] }, "bcftools/sort": { "branch": "master", - "git_sha": "487d92367b4d7bb9f1ca694bf72736be90720b15", + "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", "installed_by": ["modules"] }, "bcftools/stats": { @@ -136,7 +136,7 @@ }, "ensemblvep/vep": { "branch": "master", - "git_sha": "3db4f8488315cd7d7cf3fcb64251f6603210e831", + "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", "installed_by": ["modules", "vcf_annotate_ensemblvep"] }, "fastp": { @@ -296,7 +296,7 @@ }, "gawk": { "branch": "master", - "git_sha": "da4d05d04e65227d4307e87940842f1a14de62c7", + "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", "installed_by": ["modules"] }, "manta/germline": { @@ -356,7 +356,7 @@ }, "samtools/convert": { "branch": "master", - "git_sha": "1b93e06140e6807cc408519759f68bd26da63a00", + "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", "installed_by": ["modules"] }, "samtools/faidx": { diff --git a/modules/nf-core/bcftools/annotate/main.nf b/modules/nf-core/bcftools/annotate/main.nf index 7d9dba4255..f9437cccb4 100644 --- a/modules/nf-core/bcftools/annotate/main.nf +++ b/modules/nf-core/bcftools/annotate/main.nf @@ -59,8 +59,10 @@ process BCFTOOLS_ANNOTATE { args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : "vcf" + + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" """ - touch ${prefix}.${extension} + ${create_cmd} ${prefix}.${extension} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/annotate/tests/bcf.config b/modules/nf-core/bcftools/annotate/tests/bcf.config new file mode 100644 index 0000000000..b8496b33c3 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/bcf.config @@ -0,0 +1,6 @@ +process { + withName: 'BCFTOOLS_ANNOTATE' { + ext.args = "-x ID,INFO/DP,FORMAT/DP --output-type u" + ext.prefix = { "${meta.id}_ann" } + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test b/modules/nf-core/bcftools/annotate/tests/main.nf.test new file mode 100644 index 0000000000..9abf9475eb --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test @@ -0,0 +1,108 @@ +nextflow_process { + + name "Test Process BCFTOOLS_ANNOTATE" + script "../main.nf" + process "BCFTOOLS_ANNOTATE" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/annotate" + + test("sarscov2 - [vcf, tbi, vcf2, tbi2, []] - vcf_output") { + + config "./vcf.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.versions + ).match("vcf") } + ) + } + + } + + + test("sarscov2 - [vcf, [], [], [], header] - bcf_output") { + + config "./bcf.config" + + when { + process { + """ + vcf = Channel.of([ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + [], + [], + [] + ]) + + header = Channel.of( + '##INFO=', + '##INFO=' + ) + .collectFile(name:"headers.vcf", newLine:true) + + input[0] = vcf.combine(header) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.versions + ).match("bcf") } + ) + } + + } + + test("sarscov2 - [vcf, tbi, vcf2, tbi2, []] - stub") { + + config "./vcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("stub") } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap new file mode 100644 index 0000000000..72b0687841 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap @@ -0,0 +1,79 @@ +{ + "bcf": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.bcf" + ] + ], + [ + "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T09:21:58.526449656" + }, + "vcf": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz" + ] + ], + [ + "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-02T16:47:47.127427579" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-02T16:43:43.707474961" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/annotate/tests/tags.yml b/modules/nf-core/bcftools/annotate/tests/tags.yml new file mode 100644 index 0000000000..f97a1afc85 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/annotate: + - "modules/nf-core/bcftools/annotate/**" diff --git a/modules/nf-core/bcftools/annotate/tests/vcf.config b/modules/nf-core/bcftools/annotate/tests/vcf.config new file mode 100644 index 0000000000..cb809f614c --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/vcf.config @@ -0,0 +1,6 @@ +process { + withName: 'BCFTOOLS_ANNOTATE' { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "-x ID,INFO/DP,FORMAT/DP --output-type z" + } +} diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index a5830a251a..d64640b32d 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -36,7 +36,7 @@ process BCFTOOLS_CONCAT { stub: prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf.gz + echo "" | gzip > ${prefix}.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test index bf1a5f3fae..d5d9f78743 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -34,10 +34,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.versions - ).match() } + { assert snapshot(process.out).match() } ) } @@ -63,10 +60,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.versions - ).match() } + { assert snapshot(process.out).match() } ) } @@ -96,10 +90,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - file(process.out.vcf[0][1]).name, - process.out.versions - ).match() } + { assert snapshot(process.out).match() } ) } diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap index 7344e6e38c..90d3fc068e 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -1,43 +1,101 @@ { "sarscov2 - [[vcf1, vcf2], []]": { "content": [ - [ - [ - { - "id": "test3" - }, - "test3.vcf.gz:md5,4bcd0afd89f56c5d433f6b6abc44d0a6" + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "1": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "versions": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" ] - ], - [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" - ] + } ], - "timestamp": "2023-11-29T13:52:27.03724666" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T13:22:49.766749302" }, "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]]": { "content": [ - [ - [ - { - "id": "test3" - }, - "test3.vcf.gz:md5,4bcd0afd89f56c5d433f6b6abc44d0a6" + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "1": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,5f6796c3ae109a1a5b87353954693f5a" + ] + ], + "versions": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" ] - ], - [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" - ] + } ], - "timestamp": "2023-11-29T13:52:21.468988293" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T13:22:41.119912312" }, "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { "content": [ - "test3.vcf.gz", - [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" - ] + { + "0": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + ], + "vcf": [ + [ + { + "id": "test3" + }, + "test3.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + ] + } ], - "timestamp": "2023-11-29T13:41:04.716017811" + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T13:22:59.90466392" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/mpileup/main.nf b/modules/nf-core/bcftools/mpileup/main.nf index 5e57644af7..6bf8bc2dc2 100644 --- a/modules/nf-core/bcftools/mpileup/main.nf +++ b/modules/nf-core/bcftools/mpileup/main.nf @@ -55,4 +55,18 @@ process BCFTOOLS_MPILEUP { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bcftools_stats.txt + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + echo "" | gzip > ${prefix}.mpileup.gz + + 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/mpileup/tests/main.nf.test b/modules/nf-core/bcftools/mpileup/tests/main.nf.test index 6478bbc2d3..dc35c54266 100644 --- a/modules/nf-core/bcftools/mpileup/tests/main.nf.test +++ b/modules/nf-core/bcftools/mpileup/tests/main.nf.test @@ -33,13 +33,43 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.stats, - process.out.mpileup, - process.out.versions - ).match() } + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_fasta_false.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_fasta_false.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_fasta_false.bcftools_stats.txt") }, + { assert snapshot(process.out.versions).match("bam_fasta_false_versions") } + ) + } + + } + + test("sarscov2 - [bam, []], fasta, false stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + [] + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_fasta_false_stub.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_fasta_false_stub.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_fasta_false_stub.bcftools_stats.txt") }, + { assert snapshot(process.out.versions).match("bam_fasta_false_stub_versions") } ) } @@ -67,13 +97,45 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.stats, - process.out.mpileup, - process.out.versions - ).match() } + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_bed_fasta_true_stub.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_bed_fasta_true_stub.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_bed_fasta_true_stub.bcftools_stats.txt") }, + { assert snapshot(file(process.out.mpileup[0][1]).name).match("bam_bed_fasta_true_stub.mpileup.gz") }, + { assert snapshot(process.out.versions).match("bam_bed_fasta_true_stub_versions") } + ) + } + + } + + test("sarscov2 - [bam, []], fasta, true stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + [] + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_bed_fasta_true.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_bed_fasta_true.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_bed_fasta_true.bcftools_stats.txt") }, + { assert snapshot(file(process.out.mpileup[0][1]).name).match("bam_bed_fasta_true.mpileup.gz") }, + { assert snapshot(process.out.versions).match("bam_bed_fasta_true_versions") } ) } @@ -101,13 +163,43 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot( - process.out.vcf, - process.out.tbi, - process.out.stats, - process.out.mpileup, - process.out.versions - ).match() } + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_bed_fasta_false.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_bed_fasta_false.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_bed_fasta_false.bcftools_stats.txt") }, + { assert snapshot(process.out.versions).match("bam_bed_fasta_false_versions") } + ) + } + + } + + test("sarscov2 - [bam, bed], fasta, false stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + file(params.test_data['sarscov2']['genome']['test_bed'], checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.vcf[0][1]).name).match("bam_bed_fasta_false_stub.vcf.gz") }, + { assert snapshot(file(process.out.tbi[0][1]).name).match("bam_bed_fasta_false_stub.vcf.gz.tbi") }, + { assert snapshot(file(process.out.stats[0][1]).name).match("bam_bed_fasta_false_stub.bcftools_stats.txt") }, + { assert snapshot(process.out.versions).match("bam_bed_fasta_false_stub_versions") } ) } diff --git a/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap index ef80ab1b7f..8b8d5eabbd 100644 --- a/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap @@ -1,112 +1,274 @@ { - "sarscov2 - [bam, []], fasta, true": { + "bam_bed_fasta_true.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:45.172966" + }, + "bam_bed_fasta_false_stub.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:57.815085" + }, + "bam_fasta_false_stub.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:15.731277" + }, + "bam_bed_fasta_false_stub.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:57.844573" + }, + "bam_bed_fasta_true_stub.mpileup.gz": { + "content": [ + "test.mpileup.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:39.462382" + }, + "bam_bed_fasta_true.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:45.146525" + }, + "bam_bed_fasta_true_stub.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:39.42754" + }, + "bam_fasta_false_versions": { "content": [ - [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,0f2f2c8488e97e7f13979380d5d3b6b5" - ] - ], - [ - [ - { - "id": "test" - }, - "test.vcf.gz.tbi:md5,34cb2eeb73f4d2b98218acecebd92704" - ] - ], - [ - [ - { - "id": "test" - }, - "test.bcftools_stats.txt:md5,a988fbcd2ea5d1ce30970dcb60a77ed7" - ] - ], - [ - [ - { - "id": "test" - }, - "test.mpileup.gz:md5,73b4a00398bddab2cd065b40d17ca4dc" - ] - ], [ "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" ] ], - "timestamp": "2023-11-29T14:11:54.549517279" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:10.137483" }, - "sarscov2 - [bam, bed], fasta, false": { + "bam_fasta_false_stub.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:15.746204" + }, + "bam_bed_fasta_false_versions": { "content": [ - [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,687244dbf71d05b3b973ab08ecf05310" - ] - ], - [ - [ - { - "id": "test" - }, - "test.vcf.gz.tbi:md5,3785df15f3d7faf35f3ad70d167a50f7" - ] - ], - [ - [ - { - "id": "test" - }, - "test.bcftools_stats.txt:md5,f8c5ab149c4bf0e5f51c518346cb87b5" - ] - ], - [ - - ], [ "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" ] ], - "timestamp": "2023-11-29T14:12:00.865439661" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:51.772936" }, - "sarscov2 - [bam, []], fasta, false": { + "bam_bed_fasta_false.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:51.72798" + }, + "bam_bed_fasta_true_versions": { "content": [ [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,0f2f2c8488e97e7f13979380d5d3b6b5" - ] - ], - [ - [ - { - "id": "test" - }, - "test.vcf.gz.tbi:md5,34cb2eeb73f4d2b98218acecebd92704" - ] - ], + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:45.20135" + }, + "bam_fasta_false.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:10.051991" + }, + "bam_fasta_false.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:10.123726" + }, + "bam_bed_fasta_false.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:51.761517" + }, + "bam_bed_fasta_false_stub.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:57.832271" + }, + "bam_bed_fasta_false.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:51.748389" + }, + "bam_fasta_false_stub.vcf.gz": { + "content": [ + "test.vcf.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:15.709802" + }, + "bam_bed_fasta_true_stub.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:39.453121" + }, + "bam_fasta_false.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:10.108027" + }, + "bam_fasta_false_stub_versions": { + "content": [ [ - [ - { - "id": "test" - }, - "test.bcftools_stats.txt:md5,a988fbcd2ea5d1ce30970dcb60a77ed7" - ] - ], + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:39:15.770612" + }, + "bam_bed_fasta_true.bcftools_stats.txt": { + "content": [ + "test.bcftools_stats.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:45.18304" + }, + "bam_bed_fasta_true_stub.vcf.gz.tbi": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:39.442077" + }, + "bam_bed_fasta_false_stub_versions": { + "content": [ [ - - ], + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:57.868309" + }, + "bam_bed_fasta_true.mpileup.gz": { + "content": [ + "test.mpileup.gz" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:45.192888" + }, + "bam_bed_fasta_true_stub_versions": { + "content": [ [ "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" ] ], - "timestamp": "2023-11-29T14:11:47.814900494" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-22T18:37:39.470988" } } \ 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 c982944c52..246148d613 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -49,9 +49,9 @@ process BCFTOOLS_SORT { args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : "vcf" - + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" """ - touch ${prefix}.${extension} + ${create_cmd} ${prefix}.${extension} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test index fec59cfe57..8a496dda7d 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -9,7 +9,29 @@ nextflow_process { tag "bcftools" tag "bcftools/sort" - test("SarsCov2 VCF") { + test("sarscov2 - vcf") { + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("vcf") } + ) + } + + } + + test("sarscov2 - vcf - stub") { + options "-stub" when { process { """ diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap index 7f599559fc..6200cc42e0 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -1,5 +1,5 @@ { - "SarsCov2 VCF": { + "vcf": { "content": [ { "0": [ @@ -28,8 +28,41 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.04.2" + "nextflow": "24.03.0" }, - "timestamp": "2024-03-18T12:50:10.340362246" + "timestamp": "2024-05-02T16:55:21.237927554" + }, + "sarscov2 - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T12:32:50.506309198" } } \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 885efcedb6..e82471aa1d 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -57,9 +57,9 @@ process ENSEMBLVEP_VEP { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf.gz - touch ${prefix}.tab.gz - touch ${prefix}.json.gz + echo "" | gzip > ${prefix}.vcf.gz + echo "" | gzip > ${prefix}.tab.gz + echo "" | gzip > ${prefix}.json.gz touch ${prefix}.summary.html cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/gawk/main.nf b/modules/nf-core/gawk/main.nf index f856a1f82b..578b448c4f 100644 --- a/modules/nf-core/gawk/main.nf +++ b/modules/nf-core/gawk/main.nf @@ -41,10 +41,11 @@ process GAWK { stub: prefix = task.ext.prefix ?: "${meta.id}" - suffix = task.ext.suffix ?: "${input.getExtension}" + suffix = task.ext.suffix ?: "${input.getExtension()}" + def create_cmd = suffix.endsWith("gz") ? "echo '' | gzip >" : "touch" """ - touch ${prefix}.${suffix} + ${create_cmd} ${prefix}.${suffix} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/convert/main.nf b/modules/nf-core/samtools/convert/main.nf index 3c539e484d..d61fbe2e3a 100644 --- a/modules/nf-core/samtools/convert/main.nf +++ b/modules/nf-core/samtools/convert/main.nf @@ -42,4 +42,19 @@ process SAMTOOLS_CONVERT { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def output_extension = input.getExtension() == "bam" ? "cram" : "bam" + def index_extension = output_extension == "bam" ? "bai" : "crai" + + """ + touch ${prefix}.${output_extension} + touch ${prefix}.${index_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/convert/tests/main.nf.test b/modules/nf-core/samtools/convert/tests/main.nf.test index d2ab583901..91a0c69ea1 100644 --- a/modules/nf-core/samtools/convert/tests/main.nf.test +++ b/modules/nf-core/samtools/convert/tests/main.nf.test @@ -72,4 +72,36 @@ nextflow_process { ) } } + + test("sarscov2 - [bam, bai], fasta, fai - 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] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = Channel.of([ + [ id:'fai' ], // 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("stub") } + ) + } + } } diff --git a/modules/nf-core/samtools/convert/tests/main.nf.test.snap b/modules/nf-core/samtools/convert/tests/main.nf.test.snap index 9d56a4ec6c..3d6f88c4dd 100644 --- a/modules/nf-core/samtools/convert/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/convert/tests/main.nf.test.snap @@ -43,6 +43,71 @@ }, "timestamp": "2024-03-06T11:14:36.643960504" }, + "stub": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + ], + "bai": [ + + ], + "bam": [ + + ], + "crai": [ + [ + { + "id": "test", + "single_end": false + }, + "test.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.03.0" + }, + "timestamp": "2024-05-03T12:01:40.896170698" + }, "bam_to_cram_index": { "content": [ "test.cram.crai" From 3b34ec4ec86ffbb7bc50a863ca27d0909fc071f8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 8 May 2024 17:15:38 +0200 Subject: [PATCH 026/109] exclude tests that need to be updated --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 266572d9c7..e3b9513e56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -214,6 +214,7 @@ jobs: - "23.04.0" - "latest-everything" exclude: + - tags: "bcftools/annotate" - tags: "bcftools/concat" - tags: "bcftools/mpileup" - tags: "bcftools/sort" @@ -243,9 +244,11 @@ jobs: - tags: "gatk4/mutect2" - tags: "gatk4spark/applybqsr" - tags: "gatk4spark/markduplicates" + - tags: "gawk" - tags: "mosdepth" - tags: "multiqc" - tags: "samblaster" + - tags: "samtools/convert" - tags: "samtools/mpileup" - tags: "samtools/stats" - tags: "snpeff/snpeff" From ca4c0e1bdfb277c4e28cd13b33a5ad1fd56953d1 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 9 May 2024 11:43:31 +0000 Subject: [PATCH 027/109] Template update for nf-core/tools version 2.14.1 --- .github/workflows/linting.yml | 1 - .nf-core.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a3fb254144..1fcafe8805 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,6 @@ jobs: uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: "3.12" - cache: "pip" - name: Install pre-commit run: pip install pre-commit diff --git a/.nf-core.yml b/.nf-core.yml index d6daa40345..e0b85a77f2 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,2 +1,2 @@ repository_type: pipeline -nf_core_version: "2.14.0" +nf_core_version: "2.14.1" From 563294f07a489502127e5d15e590a72147ac8f51 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 10 May 2024 17:09:39 +0200 Subject: [PATCH 028/109] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a20f3932ed..1e8d12f872 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. 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). -## v3.5.0dev - [date] +## dev ### Added From fce316ad09e1f62f57a9deefa028ef56e4be54b3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 10 May 2024 17:16:17 +0200 Subject: [PATCH 029/109] update CHANGELOG --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99023b123f..ae12ac078b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` + ### Changed +- [#1502](https://github.com/nf-core/sarek/pull/1502) - Improved handling of CNVkit reference +- [#1502](https://github.com/nf-core/sarek/pull/1502) - Specific CNV call step, with recommended settings for germline - [#1508](https://github.com/nf-core/sarek/pull/1508) - Sync `TEMPLATE` with `tools` `2.14.0` - [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev @@ -30,7 +34,6 @@ Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is ### Added -- [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` - [#1489](https://github.com/nf-core/sarek/pull/1489) - Added a `testdata.nf-core.sarek` key in `conf/igenomes.config` for small reference - [#1493](https://github.com/nf-core/sarek/pull/1493) - Added a `wave` profile - [#1498](https://github.com/nf-core/sarek/pull/1498) - Prepare release `3.4.2` @@ -42,8 +45,6 @@ Sájtáristjåhkkå is another peak (just under 2k) in the Pårte massif, it is - [#1485](https://github.com/nf-core/sarek/pull/1485) - Update citation for publication - [#1487](https://github.com/nf-core/sarek/pull/1487) - Update sentieon-modules to Sentieon `202308.02` - [#1490](https://github.com/nf-core/sarek/pull/1490) - Update mosdepth to `0.3.8` -- [#1502](https://github.com/nf-core/sarek/pull/1502) - Improved handling of CNVkit reference -- [#1502](https://github.com/nf-core/sarek/pull/1502) - Specific CNV call step, with recommended settings for germline - [#1505](https://github.com/nf-core/sarek/pull/1505) - Update CITATIONS.md - [#1506](https://github.com/nf-core/sarek/pull/1506) - Fixing typos (`index_alignement` -> `index_alignment`) - [#1509](https://github.com/nf-core/sarek/pull/1509) - Update contributors From bb0ec8dc57dfb15915e5469b6bd7117c68b35988 Mon Sep 17 00:00:00 2001 From: Francesco L Date: Sat, 11 May 2024 15:37:03 +0200 Subject: [PATCH 030/109] added calls emits to cnvkit subworkflow --- subworkflows/local/bam_variant_calling_cnvkit/main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index d690e4cbbc..58051d5fa6 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -39,5 +39,7 @@ workflow BAM_VARIANT_CALLING_CNVKIT { versions = versions.mix(CNVKIT_GENEMETRICS.out.versions) emit: - versions // channel: [ versions.yml ] + cnv_calls_raw = CNVKIT_CALL.out.cns // channel: [ meta, cns ] + cnv_calls_export = CNVKIT_EXPORT.out.output // channel: [ meta, export_format ] + versions // channel: [ versions.yml ] } From ab67e8cd3040f1528016d8fff36d37fc60f0ecb2 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 15 May 2024 13:56:05 +0200 Subject: [PATCH 031/109] Update trimming.config --- conf/modules/trimming.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules/trimming.config b/conf/modules/trimming.config index 58be3b2539..d58fa57b67 100644 --- a/conf/modules/trimming.config +++ b/conf/modules/trimming.config @@ -16,7 +16,7 @@ process { withName: 'FASTP' { - ext.args = [ '', + ext.args = [ !params.trim_fastq ? '--disable_adapter_trimming' : '', // Disable adapter trimming params.clip_r1 > 0 ? "--trim_front1 ${params.clip_r1}" : '', // Remove bp from the 5' end of read 1 params.clip_r2 > 0 ? "--trim_front2 ${params.clip_r2}" : '', // Remove bp from the 5' end of read 2 From 20cfd911b6e305110f59461b776aa4139caadcfe Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 15 May 2024 13:58:49 +0200 Subject: [PATCH 032/109] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2642bdccc2..4270542362 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1508](https://github.com/nf-core/sarek/pull/1508) - Sync `TEMPLATE` with `tools` `2.14.0` - [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev - [#1518](https://github.com/nf-core/sarek/pull/1518) - Sync `TEMPLATE` with `tools` `2.14.1` +- [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling ### Fixed From a204e3a891d1d46ad83b7a7d3da4ab1aeda49766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Famke=20B=C3=A4uerle?= <45968370+famosab@users.noreply.github.com> Date: Thu, 16 May 2024 14:12:15 +0200 Subject: [PATCH 033/109] adding myself as contributor --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 64ff612627..2b88ec1d57 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ We thank the following people for their extensive assistance in the development - [Chela James](https://github.com/chelauk) - [David Mas-Ponte](https://github.com/davidmasp) - [Edmund Miller](https://github.com/edmundmiller) +- [Famke Bäuerle](https://github.com/famosab) - [Francesco Lescai](https://github.com/lescai) - [Gavin Mackenzie](https://github.com/GCJMackenzie) - [Gisela Gabernet](https://github.com/ggabernet) From 85905b378ad8de2d67b7890fe43290343e072306 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 21 May 2024 16:32:07 +0000 Subject: [PATCH 034/109] Adding support for spring-compressed fastq.gz as input --- assets/schema_input.json | 40 +++++++- conf/modules/modules.config | 4 + modules.json | 5 + .../nf-core/spring/decompress/environment.yml | 7 ++ modules/nf-core/spring/decompress/main.nf | 40 ++++++++ modules/nf-core/spring/decompress/meta.yml | 42 ++++++++ .../local/samplesheet_to_channel/main.nf | 64 ++++-------- workflows/sarek/main.nf | 97 ++++++++++++++++++- 8 files changed, 250 insertions(+), 49 deletions(-) create mode 100644 modules/nf-core/spring/decompress/environment.yml create mode 100644 modules/nf-core/spring/decompress/main.nf create mode 100644 modules/nf-core/spring/decompress/meta.yml diff --git a/assets/schema_input.json b/assets/schema_input.json index ad0b39f586..ce010b51dd 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -47,17 +47,20 @@ "pattern": "^\\S+$", "unique": ["patient", "sample"], "anyOf": [ + { + "dependentRequired": ["bam"] + }, { "dependentRequired": ["fastq_1"] }, { - "dependentRequired": ["bam"] + "dependentRequired": ["spring_1"] } ], "meta": ["lane"] }, "fastq_1": { - "errorMessage": "FastQ file for reads 1 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", + "errorMessage": "Gzipped FastQ file for reads 1 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", "anyOf": [ { "type": "string", @@ -72,7 +75,7 @@ "exists": true }, "fastq_2": { - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", + "errorMessage": "Gzipped FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", "dependentRequired": ["fastq_1"], "anyOf": [ { @@ -87,6 +90,37 @@ "format": "file-path", "exists": true }, + "spring_1": { + "errorMessage": "Gzipped and spring-compressed FastQ file for reads 1 cannot contain spaces and must have extension '.fq.gz.spring' or '.fastq.gz.spring'", + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz.spring$" + }, + { + "type": "string", + "maxLength": 0 + } + ], + "format": "file-path", + "exists": true + }, + "spring_2": { + "errorMessage": "Gzipped and spring-compressed FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz.spring' or '.fastq.gz.spring'", + "dependentRequired": ["spring_1"], + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz.spring$" + }, + { + "type": "string", + "maxLength": 0 + } + ], + "format": "file-path", + "exists": true + }, "table": { "errorMessage": "Recalibration table cannot contain spaces and must have extension '.table'", "anyOf": [ diff --git a/conf/modules/modules.config b/conf/modules/modules.config index f24cb481b7..cae7d55180 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -59,6 +59,10 @@ process { ] } + withName: 'NFCORE_SAREK:SAREK:SPRING_DECOMPRESS_.*' { + ext.prefix = { "${spring.simpleName}" } + } + withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { diff --git a/modules.json b/modules.json index dbcc044709..ca634ded86 100644 --- a/modules.json +++ b/modules.json @@ -449,6 +449,11 @@ "git_sha": "2f3db6f45147ebbb56b371536e31bdf622b5bfee", "installed_by": ["modules", "vcf_annotate_snpeff"] }, + "spring/decompress": { + "branch": "master", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "installed_by": ["modules"] + }, "strelka/germline": { "branch": "master", "git_sha": "e8f2c77a6e4174ee0a48d073d4cc8ff06c44bb4c", diff --git a/modules/nf-core/spring/decompress/environment.yml b/modules/nf-core/spring/decompress/environment.yml new file mode 100644 index 0000000000..d960ee714a --- /dev/null +++ b/modules/nf-core/spring/decompress/environment.yml @@ -0,0 +1,7 @@ +name: spring_decompress +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::spring=1.1.1 diff --git a/modules/nf-core/spring/decompress/main.nf b/modules/nf-core/spring/decompress/main.nf new file mode 100644 index 0000000000..94448bddbe --- /dev/null +++ b/modules/nf-core/spring/decompress/main.nf @@ -0,0 +1,40 @@ +process SPRING_DECOMPRESS { + 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/spring:1.1.1--h4ac6f70_2' : + 'biocontainers/spring:1.1.1--h4ac6f70_2' }" + + input: + tuple val(meta), path(spring) + + output: + tuple val(meta), path("*.fastq.gz"), emit: fastq + 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 VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + def output = meta.single_end ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" + + """ + spring \\ + -d \\ + -g \\ + -t ${task.cpus} \\ + $args \\ + -i ${spring} \\ + ${output} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + spring: ${VERSION} + END_VERSIONS + """ +} diff --git a/modules/nf-core/spring/decompress/meta.yml b/modules/nf-core/spring/decompress/meta.yml new file mode 100644 index 0000000000..8f43aa93d4 --- /dev/null +++ b/modules/nf-core/spring/decompress/meta.yml @@ -0,0 +1,42 @@ +name: "spring_decompress" +description: Fast, efficient, lossless decompression of FASTQ files. +keywords: + - FASTQ + - decompression + - lossless +tools: + - "spring": + description: "SPRING is a compression tool for Fastq files (containing up to 4.29 Billion reads)" + homepage: "https://github.com/shubhamchandak94/Spring" + documentation: "https://github.com/shubhamchandak94/Spring/blob/master/README.md" + tool_dev_url: "https://github.com/shubhamchandak94/Spring" + doi: "10.1093/bioinformatics/bty1015" + licence: "['Free for non-commercial use']" +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - spring: + type: file + description: Spring file to decompress. + pattern: "*.{spring}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - fastq: + type: file + description: Decompressed FASTQ file(s). + pattern: "*.{fastq.gz}" +authors: + - "@xec-cm" +maintainers: + - "@xec-cm" diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index 4de0722aed..5ce00db54c 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -33,9 +33,9 @@ workflow SAMPLESHEET_TO_CHANNEL{ main: ch_from_samplesheet.dump(tag:"ch_from_samplesheet") - input_sample = ch_from_samplesheet.map{ meta, fastq_1, fastq_2, table, cram, crai, bam, bai, vcf, variantcaller -> + input_sample = ch_from_samplesheet.map{ meta, fastq_1, fastq_2, spring_1, spring_2, table, cram, crai, bam, bai, vcf, variantcaller -> // generate patient_sample key to group lanes together - [ meta.patient + meta.sample, [meta, fastq_1, fastq_2, table, cram, crai, bam, bai, vcf, variantcaller] ] + [ meta.patient + meta.sample, [meta, fastq_1, fastq_2, spring_1, spring_2, table, cram, crai, bam, bai, vcf, variantcaller] ] }.tap{ ch_with_patient_sample } // save the channel .groupTuple() //group by patient_sample to get all lanes .map { patient_sample, ch_items -> @@ -43,18 +43,29 @@ workflow SAMPLESHEET_TO_CHANNEL{ [ patient_sample, ch_items.size() ] }.combine(ch_with_patient_sample, by: 0) // for each entry add numLanes .map { patient_sample, num_lanes, ch_items -> - (meta, fastq_1, fastq_2, table, cram, crai, bam, bai, vcf, variantcaller) = ch_items + (meta, fastq_1, fastq_2, spring_1, spring_2, table, cram, crai, bam, bai, vcf, variantcaller) = ch_items if (meta.lane && fastq_2) { - meta = meta + [id: "${meta.sample}-${meta.lane}".toString()] - def CN = seq_center ? "CN:${seq_center}\\t" : '' + meta = meta + [id: "${meta.sample}-${meta.lane}".toString(), data_type: "fastq_gz", num_lanes: num_lanes.toInteger(), size: 1] - def flowcell = flowcellLaneFromFastq(fastq_1) - // Don't use a random element for ID, it breaks resuming - def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${fasta}\\tPL:${seq_platform}\"" + if (step == 'mapping') return [ meta, [ fastq_1, fastq_2 ] ] + else { + error("Samplesheet contains fastq files but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") + } - meta = meta - meta.subMap('lane') + [num_lanes: num_lanes.toInteger(), read_group: read_group.toString(), data_type: 'fastq', size: 1] + // start from TWO spring-files - one with R1 and one with R2 + } else if (meta.lane && spring_1 && spring_2) { + meta = meta + [id: "${meta.sample}-${meta.lane}".toString(), data_type: "two_fastq_gz_spring", num_lanes: num_lanes.toInteger(), size: 1] - if (step == 'mapping') return [ meta, [ fastq_1, fastq_2 ] ] + if (step == 'mapping') return [ meta, [ spring_1, spring_2 ] ] + else { + error("Samplesheet contains fastq files but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") + } + + // start from ONE spring-file containing both R1 and R2 + } else if (meta.lane && spring_1 && !spring_2) { + meta = meta + [id: "${meta.sample}-${meta.lane}".toString(), data_type: "one_fastq_gz_spring", num_lanes: num_lanes.toInteger(), size: 1] + + if (step == 'mapping') return [ meta, [ spring_1 ] ] else { error("Samplesheet contains fastq files but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") } @@ -270,36 +281,3 @@ Joint germline variant calling also requires intervals in order to genotype the emit: input_sample } - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -// Parse first line of a FASTQ file, return the flowcell id and lane number. -def flowcellLaneFromFastq(path) { - // expected format: - // xx:yy:FLOWCELLID:LANE:... (seven fields) - // or - // FLOWCELLID:LANE:xx:... (five fields) - def line - path.withInputStream { - InputStream gzipStream = new java.util.zip.GZIPInputStream(it) - Reader decoder = new InputStreamReader(gzipStream, 'ASCII') - BufferedReader buffered = new BufferedReader(decoder) - line = buffered.readLine() - } - assert line.startsWith('@') - line = line.substring(1) - def fields = line.split(':') - String fcid - - if (fields.size() >= 7) { - // CASAVA 1.8+ format, from https://support.illumina.com/help/BaseSpace_OLH_009008/Content/Source/Informatics/BS/FileFormat_FASTQ-files_swBS.htm - // "@::::::: :::" - fcid = fields[2] - } else if (fields.size() == 5) { - fcid = fields[0] - } - return fcid -} diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 0f13d7e424..2511839125 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -20,6 +20,13 @@ include { CHANNEL_VARIANT_CALLING_CREATE_CSV } from '../../subworkflows include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools/main' include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows/local/bam_convert_samtools/main' +// Convert fastq.gz.spring files to fastq.gz files +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_ONE_OF_TWO } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TWO_OF_TWO } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_ONE_OF_ONE } from '../../modules/nf-core/spring/decompress/main' +// TO-DO: Come up with better names for those "instances" of SPRING_DECOMPRESS +// TO-DO: Fix indentation + // Run FASTQC include { FASTQC } from '../../modules/nf-core/fastqc/main' @@ -149,8 +156,59 @@ workflow SAREK { // Figure out if input is bam or fastq input_sample_type = input_sample.branch{ - bam: it[0].data_type == "bam" - fastq: it[0].data_type == "fastq" + bam: it[0].data_type == "bam" + fastq_gz: it[0].data_type == "fastq_gz" + one_fastq_gz_spring: it[0].data_type == "one_fastq_gz_spring" + two_fastq_gz_spring: it[0].data_type == "two_fastq_gz_spring" + } + + // Two fastq.gz-files + fastq_gz = input_sample_type.fastq_gz.map { meta, files -> + def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' + + // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: + def flowcell = flowcellLaneFromFastq(files[0]) + // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? + + // Don't use a random element for ID, it breaks resuming + def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" + meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] + return [ meta, files ] + } + + // Just one fastq.gz.spring-file with both R1 and R2 + one_of_one_fastq_gz_from_spring = SPRING_DECOMPRESS_ONE_OF_ONE(input_sample_type.one_fastq_gz_spring) + + one_fastq_gz_from_spring = one_of_one_fastq_gz_from_spring.fastq.map { meta, files -> + def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' + + // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: + def flowcell = flowcellLaneFromFastq(files[0]) + // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? + + // Don't use a random element for ID, it breaks resuming + def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" + meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] + return [ meta, files ] + } + + // Two fastq.gz.spring-files - one for R1 and one for R2 + one_of_two_fastq_gz_from_spring = SPRING_DECOMPRESS_ONE_OF_TWO(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) + two_of_two_fastq_gz_from_spring = SPRING_DECOMPRESS_TWO_OF_TWO(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) + + two_fastq_gz_from_spring = one_of_two_fastq_gz_from_spring.fastq.join(two_of_two_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} + + two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> + def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' + + // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: + def flowcell = flowcellLaneFromFastq(files[0]) + // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? + + // Don't use a random element for ID, it breaks resuming + def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" + meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] + return [ meta, files ] } // Convert any bam input to fastq @@ -167,7 +225,7 @@ workflow SAREK { // Theorically this could work on mixed input (fastq for one sample and bam for another) // But not sure how to handle that with the samplesheet // Or if we really want users to be able to do that - input_fastq = input_sample_type.fastq.mix(CONVERT_FASTQ_INPUT.out.reads) + input_fastq = fastq_gz.mix(CONVERT_FASTQ_INPUT.out.reads).mix(one_fastq_gz_from_spring).mix(two_fastq_gz_from_spring) // STEP 0: QC & TRIM // `--skip_tools fastqc` to skip fastqc @@ -897,6 +955,39 @@ workflow SAREK { versions // channel: [ path(versions.yml) ] } +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +// Parse first line of a FASTQ file, return the flowcell id and lane number. +def flowcellLaneFromFastq(path) { + // expected format: + // xx:yy:FLOWCELLID:LANE:... (seven fields) + // or + // FLOWCELLID:LANE:xx:... (five fields) + def line + path.withInputStream { + InputStream gzipStream = new java.util.zip.GZIPInputStream(it) + Reader decoder = new InputStreamReader(gzipStream, 'ASCII') + BufferedReader buffered = new BufferedReader(decoder) + line = buffered.readLine() + } + assert line.startsWith('@') + line = line.substring(1) + def fields = line.split(':') + String fcid + + if (fields.size() >= 7) { + // CASAVA 1.8+ format, from https://support.illumina.com/help/BaseSpace_OLH_009008/Content/Source/Informatics/BS/FileFormat_FASTQ-files_swBS.htm + // "@::::::: :::" + fcid = fields[2] + } else if (fields.size() == 5) { + fcid = fields[0] + } + return fcid +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END From 5e9a3df2d3b2e5cc0fc525d91eb99f6618f51ee9 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 21 May 2024 16:46:47 +0000 Subject: [PATCH 035/109] Improve error msg --- subworkflows/local/samplesheet_to_channel/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index 5ce00db54c..245bfaec1a 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -58,7 +58,7 @@ workflow SAMPLESHEET_TO_CHANNEL{ if (step == 'mapping') return [ meta, [ spring_1, spring_2 ] ] else { - error("Samplesheet contains fastq files but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") + error("Samplesheet contains spring files (in columns `spring_1` and `spring_2`) but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") } // start from ONE spring-file containing both R1 and R2 @@ -67,7 +67,7 @@ workflow SAMPLESHEET_TO_CHANNEL{ if (step == 'mapping') return [ meta, [ spring_1 ] ] else { - error("Samplesheet contains fastq files but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") + error("Samplesheet contains a spring file (in columns `spring_1`) but step is `$step`. Please check your samplesheet or adjust the step parameter.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") } // start from BAM From 4388c4dca4ce89af1aa491f83af2292ed984a45b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 22 May 2024 11:02:15 -0400 Subject: [PATCH 036/109] fix(schema): fix typo (strelka2 -> strelka) --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index c7deed7678..0cac3eb494 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -111,7 +111,7 @@ "type": "string", "fa_icon": "fas fa-toolbox", "description": "Tools to use for duplicate marking, variant calling and/or for annotation.", - "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, mpileup, Mutect2, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Strelka2\n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC\n- Microsatellite Instability: MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively), and bcftools annotate (needs `--bcftools_annotation`).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", + "help_text": "Multiple tools separated with commas.\n\n**Variant Calling:**\n\nGermline variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: DeepVariant, FreeBayes, GATK HaplotypeCaller, mpileup, Sentieon Haplotyper, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit\n\nTumor-only somatic variant calling can currently be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, mpileup, Mutect2, Strelka\n- Structural Variants: Manta, TIDDIT\n- Copy-number: CNVKit, ControlFREEC\n\nSomatic variant calling can currently only be performed with the following variant callers:\n- SNPs/Indels: FreeBayes, Mutect2, Strelka\n- Structural variants: Manta, TIDDIT\n- Copy-Number: ASCAT, CNVKit, Control-FREEC\n- Microsatellite Instability: MSIsensorpro\n\n> **NB** Mutect2 for somatic variant calling cannot be combined with `--no_intervals`\n\n**Annotation:**\n \n- snpEff, VEP, merge (both consecutively), and bcftools annotate (needs `--bcftools_annotation`).\n\n> **NB** As Sarek will use bgzip and tabix to compress and index VCF files annotated, it expects VCF files to be sorted when starting from `--step annotate`.", "pattern": "^((ascat|bcfann|cnvkit|controlfreec|deepvariant|freebayes|haplotypecaller|sentieon_dnascope|sentieon_haplotyper|manta|merge|mpileup|msisensorpro|mutect2|ngscheckmate|sentieon_dedup|snpeff|strelka|tiddit|vep)?,?)*(? Date: Wed, 22 May 2024 17:35:43 +0000 Subject: [PATCH 037/109] Adding test config --- conf/test/alignment_from_fastq_and_spring.config | 15 +++++++++++++++ nextflow.config | 1 + tests/csv/3.0/fastq_and_spring.csv | 4 ++++ 3 files changed, 20 insertions(+) create mode 100644 conf/test/alignment_from_fastq_and_spring.config create mode 100644 tests/csv/3.0/fastq_and_spring.csv diff --git a/conf/test/alignment_from_fastq_and_spring.config b/conf/test/alignment_from_fastq_and_spring.config new file mode 100644 index 0000000000..ed7d080c74 --- /dev/null +++ b/conf/test/alignment_from_fastq_and_spring.config @@ -0,0 +1,15 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple pipeline test. + + Use as follows: + nextflow run nf-core/sarek -profile test,, --outdir +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +params { + input = "${projectDir}/tests/csv/3.0/fastq_and_spring.csv" + tools = null +} diff --git a/nextflow.config b/nextflow.config index acf5355594..94121cdc45 100644 --- a/nextflow.config +++ b/nextflow.config @@ -296,6 +296,7 @@ profiles { } // Extra test profiles for more complete CI + alignment_from_spring { includeConfig 'conf/test/alignment_from_fastq_and_spring.config' } alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } markduplicates_bam { includeConfig 'conf/test/markduplicates_bam.config' } diff --git a/tests/csv/3.0/fastq_and_spring.csv b/tests/csv/3.0/fastq_and_spring.csv new file mode 100644 index 0000000000..07651dbb79 --- /dev/null +++ b/tests/csv/3.0/fastq_and_spring.csv @@ -0,0 +1,4 @@ +patient,sex,status,sample,lane,fastq_1,fastq_2,spring_1,spring_2 +test,XX,0,test,test_L1,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz,, +test2,XX,0,test2,test2_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_1.fastq.gz.spring,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_2.fastq.gz.spring +test3,XX,0,test3,test3_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_R1_R2.fastq.gz.spring, \ No newline at end of file From 37e2fa7705de70bc3203d18aa64cfdd47f6cd0e0 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 22 May 2024 17:44:16 +0000 Subject: [PATCH 038/109] Aligning profile-name and config-name for test alignment_from_fastq_and_spring --- nextflow.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 94121cdc45..ceab8056a0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -296,7 +296,8 @@ profiles { } // Extra test profiles for more complete CI - alignment_from_spring { includeConfig 'conf/test/alignment_from_fastq_and_spring.config' } + // TO-DO: Indentation! + alignment_from_fastq_and_spring { includeConfig 'conf/test/alignment_from_fastq_and_spring.config' } alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } markduplicates_bam { includeConfig 'conf/test/markduplicates_bam.config' } From c239c37dcf4a85bdde121312b1256947dc46a1a6 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 22 May 2024 17:56:52 +0000 Subject: [PATCH 039/109] Improving names of variables and module instances --- workflows/sarek/main.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 2511839125..898f0b7bd0 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -21,9 +21,9 @@ include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows/local/bam_convert_samtools/main' // Convert fastq.gz.spring files to fastq.gz files -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_ONE_OF_TWO } from '../../modules/nf-core/spring/decompress/main' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TWO_OF_TWO } from '../../modules/nf-core/spring/decompress/main' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_ONE_OF_ONE } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' // TO-DO: Come up with better names for those "instances" of SPRING_DECOMPRESS // TO-DO: Fix indentation @@ -177,9 +177,9 @@ workflow SAREK { } // Just one fastq.gz.spring-file with both R1 and R2 - one_of_one_fastq_gz_from_spring = SPRING_DECOMPRESS_ONE_OF_ONE(input_sample_type.one_fastq_gz_spring) + fastq_gz_pair_from_spring = SPRING_DECOMPRESS_TO_FQ_PAIR(input_sample_type.one_fastq_gz_spring) - one_fastq_gz_from_spring = one_of_one_fastq_gz_from_spring.fastq.map { meta, files -> + one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: @@ -193,10 +193,10 @@ workflow SAREK { } // Two fastq.gz.spring-files - one for R1 and one for R2 - one_of_two_fastq_gz_from_spring = SPRING_DECOMPRESS_ONE_OF_TWO(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) - two_of_two_fastq_gz_from_spring = SPRING_DECOMPRESS_TWO_OF_TWO(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) + R1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) + R2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) - two_fastq_gz_from_spring = one_of_two_fastq_gz_from_spring.fastq.join(two_of_two_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} + two_fastq_gz_from_spring = R1_fastq_gz_from_spring.fastq.join(R2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' From 2944812e577b2f56d30f47e8af86671bbea76255 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 22 May 2024 21:01:56 +0000 Subject: [PATCH 040/109] pleasing the linter --- tests/csv/3.0/fastq_and_spring.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/csv/3.0/fastq_and_spring.csv b/tests/csv/3.0/fastq_and_spring.csv index 07651dbb79..8294c58ed2 100644 --- a/tests/csv/3.0/fastq_and_spring.csv +++ b/tests/csv/3.0/fastq_and_spring.csv @@ -1,4 +1,4 @@ patient,sex,status,sample,lane,fastq_1,fastq_2,spring_1,spring_2 test,XX,0,test,test_L1,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz,, test2,XX,0,test2,test2_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_1.fastq.gz.spring,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_2.fastq.gz.spring -test3,XX,0,test3,test3_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_R1_R2.fastq.gz.spring, \ No newline at end of file +test3,XX,0,test3,test3_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_R1_R2.fastq.gz.spring, From 66ecfb2d388b215bb74f3cef54a8370d8ae98937 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 23 May 2024 15:59:23 +0000 Subject: [PATCH 041/109] Using meta.sample for meta.id in channel reads_for_alignment when meta.size * meta.num_lanes is one --- workflows/sarek/main.nf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 0f13d7e424..1d94174476 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -253,6 +253,12 @@ workflow SAREK { } .set { reads_grouping_key } + reads_for_alignment = reads_for_alignment.map{ meta, reads -> + // Update meta.id to meta.sample no multiple lanes or splitted fastqs + if (meta.size * meta.num_lanes == 1) [ meta + [ id:meta.sample ], reads ] + else [ meta, reads ] + } + // reads will be sorted sort_bam = true FASTQ_ALIGN_BWAMEM_MEM2_DRAGMAP_SENTIEON(reads_for_alignment, index_alignment, sort_bam, fasta, fasta_fai) From 6f3c4503c2874d34d332bdd4589976a8cda7260a Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 23 May 2024 17:20:16 +0000 Subject: [PATCH 042/109] Updating changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4270542362..5494c37c06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling ### Fixed +- [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder ### Removed From 8d1592c242fbb2bd2cc7da66377032d55afc7816 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 23 May 2024 17:52:41 +0000 Subject: [PATCH 043/109] prettier --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5494c37c06..60174b5516 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling ### Fixed + - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder ### Removed From d5f0b54159abba6f48dda8885797bab8deb19ad0 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Fri, 24 May 2024 12:03:48 +0000 Subject: [PATCH 044/109] Remove legacy configs of CUSTOM_DUMPSOFTWAREVERSIONS --- conf/base.config | 2 +- conf/modules/modules.config | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/conf/base.config b/conf/base.config index d371e9407f..cf19c7081c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,7 +54,7 @@ process { withLabel:process_high_memory { memory = { check_max( 200.GB * task.attempt, 'memory' ) } } - withName: 'UNZIP.*|UNTAR.*|TABIX.*|BUILD_INTERVALS|CREATE_INTERVALS_BED|CUSTOM_DUMPSOFTWAREVERSIONS|VCFTOOLS|BCFTOOLS.*|SAMTOOLS_INDEX' { + withName: 'UNZIP.*|UNTAR.*|TABIX.*|BUILD_INTERVALS|CREATE_INTERVALS_BED|VCFTOOLS|BCFTOOLS.*|SAMTOOLS_INDEX' { cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 1.GB * task.attempt, 'memory' ) } } diff --git a/conf/modules/modules.config b/conf/modules/modules.config index f24cb481b7..9acd13b11b 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -18,15 +18,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - publishDir = [ - mode: params.publish_dir_mode, - path: { "${params.outdir}/pipeline_info" }, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - // QC withName: 'FASTQC' { ext.args = { '--quiet' } From 8c82969b247595e72c4800b3422ae7efe78a21d2 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Fri, 24 May 2024 12:06:43 +0000 Subject: [PATCH 045/109] Updating changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4270542362..156f76aae3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` + ### Removed ### Dependencies From 01fe57d5a0f8ad0dfa21813a2943e6ff90f9aad3 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 27 May 2024 09:43:47 +0000 Subject: [PATCH 046/109] fixing changelog --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33788a0c05..261730d4a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,11 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -<<<<<<< fix_1540 - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder -======= - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` ->>>>>>> dev ### Removed From 623731c2359cae2cd0605057aa6d66f1eee09a07 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 13:30:18 +0200 Subject: [PATCH 047/109] fix(typo): strelka2 -> strelka --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4270542362..706d6388f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` + ### Removed ### Dependencies From f2cae492314ee2cf4b491bd08aa423b61af8b423 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 13:33:35 +0200 Subject: [PATCH 048/109] merge --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 938f432e6b..812bca8b5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,11 +23,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed <<<<<<< dev -- [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` -======= + +- # [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` ->>>>>>> dev + > > > > > > > dev ### Removed From 444a229a4e9d1d843419245f21647fbbbdff4e79 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 13:34:06 +0200 Subject: [PATCH 049/109] merge --- docs/output.md | 12 ++++++------ docs/usage.md | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/output.md b/docs/output.md index ff6445e89b..0f49c73eda 100644 --- a/docs/output.md +++ b/docs/output.md @@ -41,7 +41,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Sentieon DNAscope joint germline variant calling](#sentieon-dnascope-joint-germline-variant-calling) - [Sentieon Haplotyper](#sentieon-haplotyper) - [Sentieon Haplotyper joint germline variant calling](#sentieon-haplotyper-joint-germline-variant-calling) - - [Strelka2](#strelka2) + - [Strelka](#strelka) - [Structural Variants](#structural-variants) - [Manta](#manta) - [TIDDIT](#tiddit) @@ -542,9 +542,9 @@ In Sentieon's package DNAseq, joint germline variant calling is done by first ru -#### Strelka2 +#### Strelka -[Strelka2](https://github.com/Illumina/strelka) is a fast and accurate small variant caller optimized for analysis of germline variation in small cohorts and somatic variation in tumor/normal sample pairs. For further reading and documentation see the [Strelka2 user guide](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md). If [Strelka2](https://github.com/Illumina/strelka) is used for somatic variant calling and [Manta](https://github.com/Illumina/manta) is also specified in tools, the output candidate indels from [Manta](https://github.com/Illumina/manta) are used according to [Strelka Best Practices](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md#somatic-configuration-example). +[Strelka](https://github.com/Illumina/strelka) is a fast and accurate small variant caller optimized for analysis of germline variation in small cohorts and somatic variation in tumor/normal sample pairs. For further reading and documentation see the [Strelka user guide](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md). If [Strelka](https://github.com/Illumina/strelka) is used for somatic variant calling and [Manta](https://github.com/Illumina/manta) is also specified in tools, the output candidate indels from [Manta](https://github.com/Illumina/manta) are used according to [Strelka Best Practices](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md#somatic-configuration-example). For further downstream analysis, take a look [here](https://github.com/Illumina/strelka/blob/v2.9.x/docs/userGuide/README.md#interpreting-the-germline-multi-sample-variants-vcf).

    @@ -576,7 +576,7 @@ For further downstream analysis, take a look [here](https://github.com/Illumina/ [Manta](https://github.com/Illumina/manta) calls structural variants (SVs) and indels from mapped paired-end sequencing reads. It is optimized for analysis of germline variation in small sets of individuals and somatic variation in tumor/normal sample pairs. -[Manta](https://github.com/Illumina/manta) provides a candidate list for small indels that can be fed to [Strelka2](https://github.com/Illumina/strelka) following [Strelka Best Practices](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md#somatic-configuration-example). For further reading and documentation see the [Manta user guide](https://github.com/Illumina/manta/blob/master/docs/userGuide/README.md). +[Manta](https://github.com/Illumina/manta) provides a candidate list for small indels that can be fed to [Strelka](https://github.com/Illumina/strelka) following [Strelka Best Practices](https://github.com/Illumina/strelka/blob/master/docs/userGuide/README.md#somatic-configuration-example). For further reading and documentation see the [Manta user guide](https://github.com/Illumina/manta/blob/master/docs/userGuide/README.md).
    Output files for normal samples @@ -823,7 +823,7 @@ It requires a normal sample for each tumour to differentiate the somatic and ger ### Concatenation -Germline VCFs from `DeepVariant`, `FreeBayes`, `HaplotypeCaller`, `Haplotyper`, `Manta`, `bcftools mpileup`, `Strelka2`, or `Tiddit` are concatenated with `bcftools concat`. The field `SOURCE` is added to the VCF header to report the variant caller. +Germline VCFs from `DeepVariant`, `FreeBayes`, `HaplotypeCaller`, `Haplotyper`, `Manta`, `bcftools mpileup`, `Strelka`, or `Tiddit` are concatenated with `bcftools concat`. The field `SOURCE` is added to the VCF header to report the variant caller.
    Concatenated VCF-files for normal samples @@ -1067,7 +1067,7 @@ For further reading and documentation see the [bcftools stats manual](https://sa Plots will show: - Stats by non-reference allele frequency, depth distribution, stats by quality and per-sample counts, singleton stats, etc. -- Note: When using [Strelka2](https://github.com/Illumina/strelka), there will be no depth distribution plot, as Strelka2 does not report the INFO/DP field +- Note: When using [Strelka](https://github.com/Illumina/strelka), there will be no depth distribution plot, as Strelka does not report the INFO/DP field
    Output files for all samples diff --git a/docs/usage.md b/docs/usage.md index e54db35d32..f39e327bb1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -452,7 +452,7 @@ For a thorough list, please refer the [Azure Sizes for virtual machines in Azure ## How to test the pipeline -When using default parameters only, sarek runs preprocessing and `Strelka2`. +When using default parameters only, sarek runs preprocessing and `Strelka`. This is reflected in the default test profile: ```bash @@ -570,7 +570,7 @@ This list is by no means exhaustive and it will depend on the specific analysis | [GATK HaplotypeCaller](https://gatk.broadinstitute.org/hc/en-us/articles/5358864757787-HaplotypeCaller) | x | x | x | x | - | - | | [GATK Mutect2](https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2) | x | x | x | - | x | x | | [mpileup](https://www.htslib.org/doc/samtools-mpileup.html) | x | x | x | x | x | - | -| [Strelka2](https://github.com/Illumina/strelka) | x | x | x | x | x | x | +| [Strelka](https://github.com/Illumina/strelka) | x | x | x | x | x | x | | [Manta](https://github.com/Illumina/manta) | x | x | x | x | x | x | | [TIDDIT](https://github.com/SciLifeLab/TIDDIT) | x | x | x | x | x | x | | [ASCAT](https://github.com/VanLoo-lab/ascat) | x | x | - | - | - | x | From 7d6a0d63b28b1373bbaf395514d9ba8a77ec13a4 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 13:34:58 +0200 Subject: [PATCH 050/109] fix merge conflicts --- CHANGELOG.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812bca8b5c..dc77e76399 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,12 +22,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -<<<<<<< dev - -- # [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` +- [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` - > > > > > > > dev ### Removed From c11092f4579140f6016342d4ed237cbd6bf2023e Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 27 May 2024 14:36:43 +0000 Subject: [PATCH 051/109] setup test of alignment from bam,fastq and spring in one input-csv --- ..._spring.config => alignment_from_everything.config} | 2 +- nextflow.config | 2 +- ...stq_and_spring.csv => bam_and_fastq_and_spring.csv} | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) rename conf/test/{alignment_from_fastq_and_spring.config => alignment_from_everything.config} (88%) rename tests/csv/3.0/{fastq_and_spring.csv => bam_and_fastq_and_spring.csv} (63%) diff --git a/conf/test/alignment_from_fastq_and_spring.config b/conf/test/alignment_from_everything.config similarity index 88% rename from conf/test/alignment_from_fastq_and_spring.config rename to conf/test/alignment_from_everything.config index ed7d080c74..25abd66cdf 100644 --- a/conf/test/alignment_from_fastq_and_spring.config +++ b/conf/test/alignment_from_everything.config @@ -10,6 +10,6 @@ */ params { - input = "${projectDir}/tests/csv/3.0/fastq_and_spring.csv" + input = "${projectDir}/tests/csv/3.0/bam_and_fastq_and_spring.csv" tools = null } diff --git a/nextflow.config b/nextflow.config index ceab8056a0..40108f327d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -297,7 +297,7 @@ profiles { // Extra test profiles for more complete CI // TO-DO: Indentation! - alignment_from_fastq_and_spring { includeConfig 'conf/test/alignment_from_fastq_and_spring.config' } + alignment_from_everything { includeConfig 'conf/test/alignment_from_everything.config' } alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } markduplicates_bam { includeConfig 'conf/test/markduplicates_bam.config' } diff --git a/tests/csv/3.0/fastq_and_spring.csv b/tests/csv/3.0/bam_and_fastq_and_spring.csv similarity index 63% rename from tests/csv/3.0/fastq_and_spring.csv rename to tests/csv/3.0/bam_and_fastq_and_spring.csv index 8294c58ed2..fa49cea06c 100644 --- a/tests/csv/3.0/fastq_and_spring.csv +++ b/tests/csv/3.0/bam_and_fastq_and_spring.csv @@ -1,4 +1,6 @@ -patient,sex,status,sample,lane,fastq_1,fastq_2,spring_1,spring_2 -test,XX,0,test,test_L1,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz,, -test2,XX,0,test2,test2_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_1.fastq.gz.spring,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_2.fastq.gz.spring -test3,XX,0,test3,test3_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_R1_R2.fastq.gz.spring, +patient,sex,status,sample,lane,fastq_1,fastq_2,spring_1,spring_2,bam,bai +test,XX,0,test,test_L1,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz,,,, +test2,XX,0,test2,test2_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_1.fastq.gz.spring,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_2.fastq.gz.spring,, +test3,XX,0,test3,test3_L1,,,https://raw.githubusercontent.com/nf-core/test-datasets/sarek3/data/genomics/homo_sapiens/illumina/spring/test_R1_R2.fastq.gz.spring,,, +test_bam,XX,0,test_bam,test_bam_L1,,,,,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai + From 1863b6191671d6a9ab3c6bf89c2ef2f21e96e7cd Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 27 May 2024 14:56:36 +0000 Subject: [PATCH 052/109] Updating changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc77e76399..c894d57b06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` +- [#1534](https://github.com/nf-core/sarek/pull/1534) - Handling `.fastq.gz.spring` files as input ### Changed From 0ff288e8683dd467f39392dd44b0853200113f11 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 17:46:42 +0200 Subject: [PATCH 053/109] feat(modules): update all currently available modules --- modules.json | 26 +- modules/nf-core/bwa/index/environment.yml | 2 +- modules/nf-core/bwa/index/main.nf | 4 +- modules/nf-core/bwa/index/meta.yml | 1 + .../nf-core/bwa/index/tests/main.nf.test.snap | 10 +- modules/nf-core/bwa/mem/environment.yml | 6 +- modules/nf-core/bwa/mem/main.nf | 4 +- modules/nf-core/bwa/mem/tests/main.nf.test | 45 ++- .../nf-core/bwa/mem/tests/main.nf.test.snap | 303 +++++------------- modules/nf-core/cat/fastq/tests/main.nf.test | 2 + .../nf-core/cnvkit/antitarget/environment.yml | 2 +- modules/nf-core/cnvkit/antitarget/main.nf | 4 +- .../cnvkit/antitarget/tests/main.nf.test | 59 ++++ .../cnvkit/antitarget/tests/main.nf.test.snap | 64 ++++ .../nf-core/cnvkit/antitarget/tests/tags.yml | 2 + .../nf-core/cnvkit/reference/environment.yml | 2 +- modules/nf-core/cnvkit/reference/main.nf | 4 +- modules/nf-core/cnvkit/reference/meta.yml | 2 +- .../cnvkit/reference/tests/main.nf.test | 57 ++++ .../cnvkit/reference/tests/main.nf.test.snap | 47 +++ .../nf-core/cnvkit/reference/tests/tags.yml | 2 + modules/nf-core/gatk4/applyvqsr/main.nf | 2 +- .../applyvqsr/tests/allelspecificity.config | 5 + .../gatk4/applyvqsr/tests/main.nf.test | 106 ++++++ .../gatk4/applyvqsr/tests/main.nf.test.snap | 95 ++++++ .../tests/no-allelspecificity.config | 5 + .../nf-core/gatk4/applyvqsr/tests/tags.yml | 2 + .../gatk4/calculatecontamination/main.nf | 12 + .../calculatecontamination/tests/main.nf.test | 106 ++++++ .../tests/main.nf.test.snap | 127 ++++++++ .../tests/nextflow.config | 5 + .../calculatecontamination/tests/tags.yml | 2 + .../tests/main.nf.test | 56 ++++ .../tests/main.nf.test.snap | 68 ++++ .../createsequencedictionary/tests/tags.yml | 2 + .../nf-core/gatk4/filtermutectcalls/main.nf | 2 +- .../filtermutectcalls/tests/main.nf.test | 176 ++++++++++ .../filtermutectcalls/tests/main.nf.test.snap | 140 ++++++++ .../filtermutectcalls/tests/nextflow.config | 5 + .../gatk4/filtermutectcalls/tests/tags.yml | 2 + .../nf-core/gatk4/getpileupsummaries/main.nf | 11 + .../getpileupsummaries/tests/main.nf.test | 104 ++++++ .../tests/main.nf.test.snap | 101 ++++++ .../gatk4/getpileupsummaries/tests/tags.yml | 2 + .../nf-core/gatk4/mergemutectstats/main.nf | 11 + .../gatk4/mergemutectstats/tests/main.nf.test | 57 ++++ .../mergemutectstats/tests/main.nf.test.snap | 59 ++++ .../gatk4/mergemutectstats/tests/tags.yml | 2 + modules/nf-core/gawk/environment.yml | 2 +- modules/nf-core/gawk/main.nf | 4 +- modules/nf-core/gawk/tests/main.nf.test.snap | 16 +- modules/nf-core/ngscheckmate/ncm/main.nf | 1 + .../nf-core/ngscheckmate/ncm/tests/bam.config | 5 + .../ngscheckmate/ncm/tests/main.nf.test | 184 +++++++++++ .../ngscheckmate/ncm/tests/main.nf.test.snap | 249 ++++++++++++++ .../ngscheckmate/ncm/tests/nextflow.config | 15 + .../nf-core/ngscheckmate/ncm/tests/tags.yml | 2 + .../nf-core/ngscheckmate/ncm/tests/vcf.config | 5 + 58 files changed, 2118 insertions(+), 278 deletions(-) create mode 100644 modules/nf-core/cnvkit/antitarget/tests/main.nf.test create mode 100644 modules/nf-core/cnvkit/antitarget/tests/main.nf.test.snap create mode 100644 modules/nf-core/cnvkit/antitarget/tests/tags.yml create mode 100644 modules/nf-core/cnvkit/reference/tests/main.nf.test create mode 100644 modules/nf-core/cnvkit/reference/tests/main.nf.test.snap create mode 100644 modules/nf-core/cnvkit/reference/tests/tags.yml create mode 100644 modules/nf-core/gatk4/applyvqsr/tests/allelspecificity.config create mode 100644 modules/nf-core/gatk4/applyvqsr/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/applyvqsr/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/applyvqsr/tests/no-allelspecificity.config create mode 100644 modules/nf-core/gatk4/applyvqsr/tests/tags.yml create mode 100644 modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/calculatecontamination/tests/nextflow.config create mode 100644 modules/nf-core/gatk4/calculatecontamination/tests/tags.yml create mode 100644 modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/createsequencedictionary/tests/tags.yml create mode 100644 modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/filtermutectcalls/tests/nextflow.config create mode 100644 modules/nf-core/gatk4/filtermutectcalls/tests/tags.yml create mode 100644 modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/getpileupsummaries/tests/tags.yml create mode 100644 modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test create mode 100644 modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test.snap create mode 100644 modules/nf-core/gatk4/mergemutectstats/tests/tags.yml create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/bam.config create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/main.nf.test create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/main.nf.test.snap create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/nextflow.config create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/tags.yml create mode 100644 modules/nf-core/ngscheckmate/ncm/tests/vcf.config diff --git a/modules.json b/modules.json index dbcc044709..f93ff48540 100644 --- a/modules.json +++ b/modules.json @@ -38,12 +38,12 @@ }, "bwa/index": { "branch": "master", - "git_sha": "6278bf9afd4a4b2d00fa6052250e73da3d91546f", + "git_sha": "086fa66260595e123b0ea47a6512539b72a9afa3", "installed_by": ["modules"] }, "bwa/mem": { "branch": "master", - "git_sha": "b97197968ac12dde2463fa54541f6350c46f2035", + "git_sha": "0c34b8159f62cde451c4ff249629c9d0a4f3f9c3", "installed_by": ["modules"] }, "bwamem2/index": { @@ -63,12 +63,12 @@ }, "cat/fastq": { "branch": "master", - "git_sha": "0997b47c93c06b49aa7b3fefda87e728312cf2ca", + "git_sha": "4fc983ad0b30e6e32696fa7d980c76c7bfe1c03e", "installed_by": ["modules"] }, "cnvkit/antitarget": { "branch": "master", - "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", + "git_sha": "7d8eff8f0cbc20cb83ce624e86c58ede51397054", "installed_by": ["modules"] }, "cnvkit/batch": { @@ -93,7 +93,7 @@ }, "cnvkit/reference": { "branch": "master", - "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", + "git_sha": "f8693ff46b884892982d658271ed260380111c53", "installed_by": ["modules"] }, "controlfreec/assesssignificance": { @@ -186,7 +186,7 @@ }, "gatk4/applyvqsr": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "cee8fe33d3ef1a220dee67dac75a32f7c872f63f", "installed_by": ["modules"] }, "gatk4/baserecalibrator": { @@ -196,7 +196,7 @@ }, "gatk4/calculatecontamination": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "77ffba959bbe8b6e1d95d47688075d113e24f0d4", "installed_by": ["modules"] }, "gatk4/cnnscorevariants": { @@ -206,7 +206,7 @@ }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "e6fe277739f5894711405af3e717b2470bd956b5", "installed_by": ["modules"] }, "gatk4/estimatelibrarycomplexity": { @@ -216,7 +216,7 @@ }, "gatk4/filtermutectcalls": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "7d814815f638e1483995b24a23f5f23229036bbf", "installed_by": ["modules"] }, "gatk4/filtervarianttranches": { @@ -246,7 +246,7 @@ }, "gatk4/getpileupsummaries": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "b632dcbf8bd3d7b9cb22fd0b2416e9e6cb8f4045", "installed_by": ["modules"] }, "gatk4/haplotypecaller": { @@ -271,7 +271,7 @@ }, "gatk4/mergemutectstats": { "branch": "master", - "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", + "git_sha": "cafe91148ca110e52ceaa07f3e373b882800d04b", "installed_by": ["modules"] }, "gatk4/mergevcfs": { @@ -306,7 +306,7 @@ }, "gawk": { "branch": "master", - "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", + "git_sha": "cf3ed075695639b0a0924eb0901146df1996dc08", "installed_by": ["modules"] }, "manta/germline": { @@ -346,7 +346,7 @@ }, "ngscheckmate/ncm": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "0e04b949c90e686c8b07495576832d78ab9210cf", "installed_by": ["bam_ngscheckmate"] }, "samblaster": { diff --git a/modules/nf-core/bwa/index/environment.yml b/modules/nf-core/bwa/index/environment.yml index 5d3cb3231b..126e003448 100644 --- a/modules/nf-core/bwa/index/environment.yml +++ b/modules/nf-core/bwa/index/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::bwa=0.7.17 + - bioconda::bwa=0.7.18 diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index 24b5a2ea99..2e48b6caae 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -4,8 +4,8 @@ process BWA_INDEX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7' : - 'biocontainers/bwa:0.7.17--hed695b0_7' }" + 'https://depot.galaxyproject.org/singularity/bwa:0.7.18--he4a0461_0' : + 'biocontainers/bwa:0.7.18--he4a0461_0' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml index 730628d005..4c7d30f3aa 100644 --- a/modules/nf-core/bwa/index/meta.yml +++ b/modules/nf-core/bwa/index/meta.yml @@ -43,3 +43,4 @@ authors: maintainers: - "@drpatelh" - "@maxulysse" + - "@gallvp" diff --git a/modules/nf-core/bwa/index/tests/main.nf.test.snap b/modules/nf-core/bwa/index/tests/main.nf.test.snap index e51ad5bf2b..7c8f046578 100644 --- a/modules/nf-core/bwa/index/tests/main.nf.test.snap +++ b/modules/nf-core/bwa/index/tests/main.nf.test.snap @@ -17,7 +17,7 @@ ] ], "1": [ - "versions.yml:md5,0f20525da90e7489a7ebb02adca3265f" + "versions.yml:md5,a64462ac7dfb21f4ade9b02e7f65c5bb" ], "index": [ [ @@ -34,10 +34,14 @@ ] ], "versions": [ - "versions.yml:md5,0f20525da90e7489a7ebb02adca3265f" + "versions.yml:md5,a64462ac7dfb21f4ade9b02e7f65c5bb" ] } ], - "timestamp": "2023-10-17T17:20:20.180927714" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-16T11:40:09.925307" } } \ No newline at end of file diff --git a/modules/nf-core/bwa/mem/environment.yml b/modules/nf-core/bwa/mem/environment.yml index 3f136d0a3f..3aa9f0cca2 100644 --- a/modules/nf-core/bwa/mem/environment.yml +++ b/modules/nf-core/bwa/mem/environment.yml @@ -4,7 +4,7 @@ channels: - bioconda - defaults dependencies: - - bwa=0.7.17 + - bwa=0.7.18 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.19.2 - - htslib=1.19.1 + - samtools=1.20 + - htslib=1.20.0 diff --git a/modules/nf-core/bwa/mem/main.nf b/modules/nf-core/bwa/mem/main.nf index d8bd281519..9c815f0c8e 100644 --- a/modules/nf-core/bwa/mem/main.nf +++ b/modules/nf-core/bwa/mem/main.nf @@ -4,8 +4,8 @@ process BWA_MEM { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:a34558545ae1413d94bde4578787ebef08027945-0' : - 'biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:a34558545ae1413d94bde4578787ebef08027945-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:1bd8542a8a0b42e0981337910954371d0230828e-0' : + 'biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:1bd8542a8a0b42e0981337910954371d0230828e-0' }" input: tuple val(meta) , path(reads) diff --git a/modules/nf-core/bwa/mem/tests/main.nf.test b/modules/nf-core/bwa/mem/tests/main.nf.test index 1fa9b56dc7..463b76f81c 100644 --- a/modules/nf-core/bwa/mem/tests/main.nf.test +++ b/modules/nf-core/bwa/mem/tests/main.nf.test @@ -44,7 +44,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.cram, + process.out.csi, + process.out.crai, + process.out.versions, + file(process.out.bam[0][1]).name + ).match() + } ) } @@ -85,7 +92,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.cram, + process.out.csi, + process.out.crai, + process.out.versions, + file(process.out.bam[0][1]).name + ).match() + } ) } @@ -127,7 +141,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.cram, + process.out.csi, + process.out.crai, + process.out.versions, + file(process.out.bam[0][1]).name + ).match() + } ) } @@ -169,7 +190,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.cram, + process.out.csi, + process.out.crai, + process.out.versions, + file(process.out.bam[0][1]).name + ).match() + } ) } @@ -211,7 +239,14 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.cram, + process.out.csi, + process.out.crai, + process.out.versions, + file(process.out.bam[0][1]).name + ).match() + } ) } diff --git a/modules/nf-core/bwa/mem/tests/main.nf.test.snap b/modules/nf-core/bwa/mem/tests/main.nf.test.snap index 0d1bdb416d..038ee7b7a2 100644 --- a/modules/nf-core/bwa/mem/tests/main.nf.test.snap +++ b/modules/nf-core/bwa/mem/tests/main.nf.test.snap @@ -1,295 +1,140 @@ { "Single-End": { "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.bam:md5,a74710a0345b4717bb4431bf9c257120" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ], - "bam": [ - [ - { - "id": "test", - "single_end": true - }, - "test.bam:md5,a74710a0345b4717bb4431bf9c257120" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ] - } + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" + ], + "test.bam" ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-14T14:14:56.820798254" + "timestamp": "2024-05-20T08:44:32.953673185" }, "Single-End Sort": { "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.bam:md5,cb1e038bc4d990683fa485d632550b54" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ], - "bam": [ - [ - { - "id": "test", - "single_end": true - }, - "test.bam:md5,cb1e038bc4d990683fa485d632550b54" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ] - } + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" + ], + "test.bam" ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-14T14:15:20.271428534" + "timestamp": "2024-05-20T08:44:45.27066093" }, "Paired-End": { "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,aea123a3828a99da1906126355f15a12" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ], - "bam": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,aea123a3828a99da1906126355f15a12" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ] - } + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" + ], + "test.bam" ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-14T14:15:38.264256823" + "timestamp": "2024-05-20T08:44:57.706852274" }, "Paired-End Sort": { "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,4682087bcdc3617384b375093fecd8dd" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ], - "bam": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,4682087bcdc3617384b375093fecd8dd" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ] - } + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" + ], + "test.bam" ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-14T14:16:00.528642686" + "timestamp": "2024-05-20T08:45:10.376505036" }, "Single-end - stub": { "content": [ "test.bam", "test.csi", [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-15T09:50:33.238543011" + "timestamp": "2024-05-20T08:46:07.182072398" }, "Paired-End - no fasta": { "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,aea123a3828a99da1906126355f15a12" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ], - "bam": [ - [ - { - "id": "test", - "single_end": false - }, - "test.bam:md5,aea123a3828a99da1906126355f15a12" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" - ] - } + [ + + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" + ], + "test.bam" ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-14T14:40:16.345342005" + "timestamp": "2024-05-20T08:45:53.813076501" }, "Paired-end - stub": { "content": [ "test.bam", "test.csi", [ - "versions.yml:md5,c32f719a68bb2966c8511d808154d42d" + "versions.yml:md5,478b816fbd37871f5e8c617833d51d80" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-15T09:50:42.268673302" + "timestamp": "2024-05-20T08:46:18.412916364" } } \ No newline at end of file diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test b/modules/nf-core/cat/fastq/tests/main.nf.test index dab2e14c02..a71dcb8dfa 100644 --- a/modules/nf-core/cat/fastq/tests/main.nf.test +++ b/modules/nf-core/cat/fastq/tests/main.nf.test @@ -1,3 +1,5 @@ +// NOTE The version snaps may not be consistant +// https://github.com/nf-core/modules/pull/4087#issuecomment-1767948035 nextflow_process { name "Test Process CAT_FASTQ" diff --git a/modules/nf-core/cnvkit/antitarget/environment.yml b/modules/nf-core/cnvkit/antitarget/environment.yml index d40626a56e..a33a12e23c 100644 --- a/modules/nf-core/cnvkit/antitarget/environment.yml +++ b/modules/nf-core/cnvkit/antitarget/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::cnvkit=0.9.10 + - bioconda::cnvkit=0.9.11 diff --git a/modules/nf-core/cnvkit/antitarget/main.nf b/modules/nf-core/cnvkit/antitarget/main.nf index 795145451b..0c1f6674a4 100644 --- a/modules/nf-core/cnvkit/antitarget/main.nf +++ b/modules/nf-core/cnvkit/antitarget/main.nf @@ -4,8 +4,8 @@ process CNVKIT_ANTITARGET { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.10--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.11--pyhdfd78af_0': + 'biocontainers/cnvkit:0.9.11--pyhdfd78af_0' }" input: tuple val(meta), path(targets) diff --git a/modules/nf-core/cnvkit/antitarget/tests/main.nf.test b/modules/nf-core/cnvkit/antitarget/tests/main.nf.test new file mode 100644 index 0000000000..558abb6768 --- /dev/null +++ b/modules/nf-core/cnvkit/antitarget/tests/main.nf.test @@ -0,0 +1,59 @@ +nextflow_process { + + name "Test Process CNVKIT_ANTITARGET" + script "../main.nf" + process "CNVKIT_ANTITARGET" + + tag "modules" + tag "modules_nfcore" + tag "cnvkit" + tag "cnvkit/antitarget" + + test("human - bed") { + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("version") }, + { assert snapshot(file(process.out.bed.get(0).get(1)).readLines()[0..5]).match() } + ) + } + + } + + test("human - bed - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/cnvkit/antitarget/tests/main.nf.test.snap b/modules/nf-core/cnvkit/antitarget/tests/main.nf.test.snap new file mode 100644 index 0000000000..f793a5275f --- /dev/null +++ b/modules/nf-core/cnvkit/antitarget/tests/main.nf.test.snap @@ -0,0 +1,64 @@ +{ + "human - bed - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.antitarget.bed:md5,3d4d20f9f23b39970865d29ef239d20b" + ] + ], + "1": [ + "versions.yml:md5,b5e73ea85743cedc68ca6ef8006e5030" + ], + "bed": [ + [ + { + "id": "test" + }, + "test.antitarget.bed:md5,3d4d20f9f23b39970865d29ef239d20b" + ] + ], + "versions": [ + "versions.yml:md5,b5e73ea85743cedc68ca6ef8006e5030" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T13:58:45.758206" + }, + "human - bed": { + "content": [ + [ + "chr21\t23354500\t23509999\tAntitarget", + "chr21\t23509999\t23665499\tAntitarget", + "chr21\t23665499\t23820999\tAntitarget", + "chr21\t23820999\t23976499\tAntitarget", + "chr21\t23976499\t24131999\tAntitarget", + "chr21\t24911498\t25066997\tAntitarget" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T13:58:33.088665" + }, + "version": { + "content": [ + [ + "versions.yml:md5,b5e73ea85743cedc68ca6ef8006e5030" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T13:58:33.070317" + } +} \ No newline at end of file diff --git a/modules/nf-core/cnvkit/antitarget/tests/tags.yml b/modules/nf-core/cnvkit/antitarget/tests/tags.yml new file mode 100644 index 0000000000..9261ab536e --- /dev/null +++ b/modules/nf-core/cnvkit/antitarget/tests/tags.yml @@ -0,0 +1,2 @@ +cnvkit/antitarget: + - "modules/nf-core/cnvkit/antitarget/**" diff --git a/modules/nf-core/cnvkit/reference/environment.yml b/modules/nf-core/cnvkit/reference/environment.yml index 35e890e541..e3070044d0 100644 --- a/modules/nf-core/cnvkit/reference/environment.yml +++ b/modules/nf-core/cnvkit/reference/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::cnvkit=0.9.10 + - bioconda::cnvkit=0.9.11 diff --git a/modules/nf-core/cnvkit/reference/main.nf b/modules/nf-core/cnvkit/reference/main.nf index 0e0b20a01e..857996f111 100644 --- a/modules/nf-core/cnvkit/reference/main.nf +++ b/modules/nf-core/cnvkit/reference/main.nf @@ -4,8 +4,8 @@ process CNVKIT_REFERENCE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.10--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.11--pyhdfd78af_0': + 'biocontainers/cnvkit:0.9.11--pyhdfd78af_0' }" input: path fasta diff --git a/modules/nf-core/cnvkit/reference/meta.yml b/modules/nf-core/cnvkit/reference/meta.yml index 8c561c9953..8747893b6f 100644 --- a/modules/nf-core/cnvkit/reference/meta.yml +++ b/modules/nf-core/cnvkit/reference/meta.yml @@ -34,7 +34,7 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - reference: + - cnn: type: file description: File containing a copy-number reference (required for CNV calling in tumor_only mode) pattern: "*.{cnn}" diff --git a/modules/nf-core/cnvkit/reference/tests/main.nf.test b/modules/nf-core/cnvkit/reference/tests/main.nf.test new file mode 100644 index 0000000000..47039e3086 --- /dev/null +++ b/modules/nf-core/cnvkit/reference/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process CNVKIT_REFERENCE" + script "../main.nf" + process "CNVKIT_REFERENCE" + + tag "modules" + tag "modules_nfcore" + tag "cnvkit" + tag "cnvkit/reference" + + test("human - [fasta, bed]") { + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.antitarget.bed', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("version") }, + { assert snapshot(file(process.out.cnn.get(0)).readLines()[0]).match() } + ) + } + + } + + test("human - [fasta, bed] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.antitarget.bed', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/cnvkit/reference/tests/main.nf.test.snap b/modules/nf-core/cnvkit/reference/tests/main.nf.test.snap new file mode 100644 index 0000000000..353f6378a6 --- /dev/null +++ b/modules/nf-core/cnvkit/reference/tests/main.nf.test.snap @@ -0,0 +1,47 @@ +{ + "human - [fasta, bed]": { + "content": [ + "chromosome\tstart\tend\tgene\tlog2\tdepth\tgc\trmask\tspread" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T14:00:12.102517" + }, + "human - [fasta, bed] - stub": { + "content": [ + { + "0": [ + "multi_intervals.reference.cnn:md5,7c4a7902f5ab101b1f9d6038d331b3d9" + ], + "1": [ + "versions.yml:md5,85ff8911567b4e1245b883541ad3cc1e" + ], + "cnn": [ + "multi_intervals.reference.cnn:md5,7c4a7902f5ab101b1f9d6038d331b3d9" + ], + "versions": [ + "versions.yml:md5,85ff8911567b4e1245b883541ad3cc1e" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T14:00:30.095718" + }, + "version": { + "content": [ + [ + "versions.yml:md5,85ff8911567b4e1245b883541ad3cc1e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-13T14:00:12.090836" + } +} \ No newline at end of file diff --git a/modules/nf-core/cnvkit/reference/tests/tags.yml b/modules/nf-core/cnvkit/reference/tests/tags.yml new file mode 100644 index 0000000000..55e13dd0a8 --- /dev/null +++ b/modules/nf-core/cnvkit/reference/tests/tags.yml @@ -0,0 +1,2 @@ +cnvkit/reference: + - "modules/nf-core/cnvkit/reference/**" diff --git a/modules/nf-core/gatk4/applyvqsr/main.nf b/modules/nf-core/gatk4/applyvqsr/main.nf index 0506e28185..047321b8e9 100644 --- a/modules/nf-core/gatk4/applyvqsr/main.nf +++ b/modules/nf-core/gatk4/applyvqsr/main.nf @@ -52,7 +52,7 @@ process GATK4_APPLYVQSR { stub: prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf.gz + echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/gatk4/applyvqsr/tests/allelspecificity.config b/modules/nf-core/gatk4/applyvqsr/tests/allelspecificity.config new file mode 100644 index 0000000000..ac368bd058 --- /dev/null +++ b/modules/nf-core/gatk4/applyvqsr/tests/allelspecificity.config @@ -0,0 +1,5 @@ +process { + withName: GATK4_APPLYVQSR { + ext.args = '--mode SNP --truth-sensitivity-filter-level 99.0 -AS' + } +} diff --git a/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test b/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test new file mode 100644 index 0000000000..104eb7f01b --- /dev/null +++ b/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test @@ -0,0 +1,106 @@ +nextflow_process { + + name "Test Process GATK4_APPLYVQSR" + script "../main.nf" + process "GATK4_APPLYVQSR" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/applyvqsr" + + test("human - vcf") { + + config "./no-allelspecificity.config" + + when { + process { + """ + input[0] = [ [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal.idx', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.tranches', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + input[3] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions") }, + { assert path(process.out.vcf.get(0).get(1)).linesGzip.contains("##fileformat=VCFv4.2") }, + { assert snapshot(file(process.out.tbi.get(0).get(1)).name).match() } + ) + } + + } + + test("human - vcf - allele-specific") { + + config "./allelspecificity.config" + + when { + process { + """ + input[0] = [ [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.recal', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.recal.idx', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.tranches', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + input[3] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_allelspecific") }, + { assert path(process.out.vcf.get(0).get(1)).linesGzip.contains("##fileformat=VCFv4.2") }, + { assert snapshot(file(process.out.tbi.get(0).get(1)).name).match() } + ) + } + + } + + test("human - vcf - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal.idx', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.tranches', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + input[3] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test.snap b/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test.snap new file mode 100644 index 0000000000..ad2fe8be65 --- /dev/null +++ b/modules/nf-core/gatk4/applyvqsr/tests/main.nf.test.snap @@ -0,0 +1,95 @@ +{ + "human - vcf": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T13:31:50.727658" + }, + "human - vcf - allele-specific": { + "content": [ + "test.vcf.gz.tbi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T13:29:42.331816" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,4a6890d486a62ce6f2edfd2f8961da4f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T13:00:49.353138" + }, + "human - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,4a6890d486a62ce6f2edfd2f8961da4f" + ], + "tbi": [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,4a6890d486a62ce6f2edfd2f8961da4f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T13:01:24.370421" + }, + "versions_allelspecific": { + "content": [ + [ + "versions.yml:md5,4a6890d486a62ce6f2edfd2f8961da4f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T13:01:08.104194" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/applyvqsr/tests/no-allelspecificity.config b/modules/nf-core/gatk4/applyvqsr/tests/no-allelspecificity.config new file mode 100644 index 0000000000..c08c918e1a --- /dev/null +++ b/modules/nf-core/gatk4/applyvqsr/tests/no-allelspecificity.config @@ -0,0 +1,5 @@ +process { + withName: GATK4_APPLYVQSR { + ext.args = '--mode SNP --truth-sensitivity-filter-level 99.0' + } +} diff --git a/modules/nf-core/gatk4/applyvqsr/tests/tags.yml b/modules/nf-core/gatk4/applyvqsr/tests/tags.yml new file mode 100644 index 0000000000..c65706301a --- /dev/null +++ b/modules/nf-core/gatk4/applyvqsr/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/applyvqsr: + - "modules/nf-core/gatk4/applyvqsr/**" diff --git a/modules/nf-core/gatk4/calculatecontamination/main.nf b/modules/nf-core/gatk4/calculatecontamination/main.nf index 80070e5ff3..1ca3fd9d45 100644 --- a/modules/nf-core/gatk4/calculatecontamination/main.nf +++ b/modules/nf-core/gatk4/calculatecontamination/main.nf @@ -43,4 +43,16 @@ process GATK4_CALCULATECONTAMINATION { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.contamination.table + touch ${prefix}.segmentation.table + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test b/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test new file mode 100644 index 0000000000..81f048f67b --- /dev/null +++ b/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test @@ -0,0 +1,106 @@ +nextflow_process { + + name "Test Process GATK4_CALCULATECONTAMINATION" + script "../main.nf" + process "GATK4_CALCULATECONTAMINATION" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/calculatecontamination" + + test("human - pileup-table") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test2.pileups.table', checkIfExists: true), + [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions") }, + { assert snapshot(file(process.out.contamination.get(0).get(1)).readLines()[0]).match() } + ) + } + + } + + test("human - pileup-table - matched-pair") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test2.pileups.table', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test.pileups.table', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_pair") }, + { assert snapshot(file(process.out.contamination.get(0).get(1)).readLines()[0]).match() } + ) + } + + } + + test("human - pileup-table - segmentation") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test2.pileups.table', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test.pileups.table', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_segmentation") }, + { assert snapshot(file(process.out.contamination.get(0).get(1)).readLines()[0]).match("contamination") }, + { assert snapshot(file(process.out.segmentation.get(0).get(1)).readLines()[0]).match("segmentation") } + ) + } + + } + + test("human - pileup-table - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test2.pileups.table', checkIfExists: true), + [] ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test.snap b/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test.snap new file mode 100644 index 0000000000..5c2930f948 --- /dev/null +++ b/modules/nf-core/gatk4/calculatecontamination/tests/main.nf.test.snap @@ -0,0 +1,127 @@ +{ + "versions_pair": { + "content": [ + [ + "versions.yml:md5,4a72b1da18f7045d470225881e7266a6" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T11:08:17.057861" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,4a72b1da18f7045d470225881e7266a6" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T11:08:07.193762" + }, + "versions_segmentation": { + "content": [ + [ + "versions.yml:md5,4a72b1da18f7045d470225881e7266a6" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T11:08:26.99069" + }, + "segmentation": { + "content": [ + "#SAMPLE=tumour" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:57:38.845287" + }, + "human - pileup-table": { + "content": [ + "sample\tcontamination\terror" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T11:09:16.292509" + }, + "human - pileup-table - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.contamination.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.segmentation.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,4a72b1da18f7045d470225881e7266a6" + ], + "contamination": [ + [ + { + "id": "test" + }, + "test.contamination.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "segmentation": [ + [ + { + "id": "test" + }, + "test.segmentation.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,4a72b1da18f7045d470225881e7266a6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:56:14.817045" + }, + "human - pileup-table - matched-pair": { + "content": [ + "sample\tcontamination\terror" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T11:09:26.408848" + }, + "contamination": { + "content": [ + "sample\tcontamination\terror" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:57:38.840651" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/calculatecontamination/tests/nextflow.config b/modules/nf-core/gatk4/calculatecontamination/tests/nextflow.config new file mode 100644 index 0000000000..db836b7f80 --- /dev/null +++ b/modules/nf-core/gatk4/calculatecontamination/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GATK4_CALCULATECONTAMINATION { + ext.args = { "--tumor-segmentation ${meta.id}.segmentation.table" } + } +} diff --git a/modules/nf-core/gatk4/calculatecontamination/tests/tags.yml b/modules/nf-core/gatk4/calculatecontamination/tests/tags.yml new file mode 100644 index 0000000000..29acb20487 --- /dev/null +++ b/modules/nf-core/gatk4/calculatecontamination/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/calculatecontamination: + - "modules/nf-core/gatk4/calculatecontamination/**" diff --git a/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test b/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test new file mode 100644 index 0000000000..a8a9c6d2e8 --- /dev/null +++ b/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process GATK4_CREATESEQUENCEDICTIONARY" + script "../main.nf" + process "GATK4_CREATESEQUENCEDICTIONARY" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/createsequencedictionary" + + test("sarscov2 - fasta") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - fasta - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test.snap b/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test.snap new file mode 100644 index 0000000000..16735f9549 --- /dev/null +++ b/modules/nf-core/gatk4/createsequencedictionary/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "sarscov2 - fasta - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.dict:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,e60dd34a71fc2029d81dc67ccb5d6be6" + ], + "dict": [ + [ + { + "id": "test" + }, + "genome.dict:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e60dd34a71fc2029d81dc67ccb5d6be6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T10:16:16.34453" + }, + "sarscov2 - fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.dict:md5,7362679f176e0f52add03c08f457f646" + ] + ], + "1": [ + "versions.yml:md5,e60dd34a71fc2029d81dc67ccb5d6be6" + ], + "dict": [ + [ + { + "id": "test" + }, + "genome.dict:md5,7362679f176e0f52add03c08f457f646" + ] + ], + "versions": [ + "versions.yml:md5,e60dd34a71fc2029d81dc67ccb5d6be6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T13:58:25.822068" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/createsequencedictionary/tests/tags.yml b/modules/nf-core/gatk4/createsequencedictionary/tests/tags.yml new file mode 100644 index 0000000000..035c5e4c74 --- /dev/null +++ b/modules/nf-core/gatk4/createsequencedictionary/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/createsequencedictionary: + - "modules/nf-core/gatk4/createsequencedictionary/**" diff --git a/modules/nf-core/gatk4/filtermutectcalls/main.nf b/modules/nf-core/gatk4/filtermutectcalls/main.nf index 38dd44c786..0532ec0258 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/main.nf +++ b/modules/nf-core/gatk4/filtermutectcalls/main.nf @@ -59,7 +59,7 @@ process GATK4_FILTERMUTECTCALLS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf.gz + echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi touch ${prefix}.vcf.gz.filteringStats.tsv diff --git a/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test b/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test new file mode 100644 index 0000000000..83c3703fcb --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test @@ -0,0 +1,176 @@ +nextflow_process { + + name "Test Process GATK4_FILTERMUTECTCALLS" + script "../main.nf" + process "GATK4_FILTERMUTECTCALLS" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/filtermutectcalls" + + test("human - vcf - base") { + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true), + [], + [], + [], + [] + ] + + input[1] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[2] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_base") }, + { assert path(process.out.vcf.get(0).get(1)).linesGzip.contains("##fileformat=VCFv4.2") }, + { assert path(process.out.tbi.get(0).get(1)).linesGzip.toString().contains("TBI")}, + { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0]).match() } + ) + } + + } + + test("human - vcf - with-files") { + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test_test2_paired_mutect2_calls.artifact-prior.tar.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test_test2_paired.segmentation.table', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test_test2_paired.contamination.table', checkIfExists: true), + [] + ] + + input[1] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[2] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_with-files") }, + { assert path(process.out.vcf.get(0).get(1)).linesGzip.contains("##fileformat=VCFv4.2") }, + { assert path(process.out.tbi.get(0).get(1)).linesGzip.toString().contains("TBI")}, + { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() } + ) + } + + } + + test("human - vcf - use-val") { + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test_test2_paired_mutect2_calls.artifact-prior.tar.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/test_test2_paired.segmentation.table', checkIfExists: true), + [], + '20.0' + ] + + input[1] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[2] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions_use-val") }, + { assert path(process.out.vcf.get(0).get(1)).linesGzip.contains("##fileformat=VCFv4.2") }, + { assert path(process.out.tbi.get(0).get(1)).linesGzip.toString().contains("TBI")}, + { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0]).match() } + ) + } + + } + + test("human - vcf - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true), + [], + [], + [], + [] + ] + + input[1] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[2] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test.snap b/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test.snap new file mode 100644 index 0000000000..1c39e3b5d7 --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/tests/main.nf.test.snap @@ -0,0 +1,140 @@ +{ + "human - vcf - use-val": { + "content": [ + "#Ln prior of deletion of length 10=-20.72326583694641" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:46:03.887912" + }, + "versions_with-files": { + "content": [ + [ + "versions.yml:md5,1e86368bd682668a6777ccf2cfd90689" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:45:43.679571" + }, + "human - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz.filteringStats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,1e86368bd682668a6777ccf2cfd90689" + ], + "stats": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz.filteringStats.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test.filtered.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,1e86368bd682668a6777ccf2cfd90689" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:46:32.666273" + }, + "versions_use-val": { + "content": [ + [ + "versions.yml:md5,1e86368bd682668a6777ccf2cfd90689" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:46:03.876073" + }, + "versions_base": { + "content": [ + [ + "versions.yml:md5,1e86368bd682668a6777ccf2cfd90689" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:47:39.930795" + }, + "human - vcf - with-files": { + "content": [ + [ + "#Ln prior of deletion of length 10=-20.72326583694641", + "#Ln prior of deletion of length 9=-20.72326583694641", + "#Ln prior of deletion of length 8=-20.72326583694641", + "#Ln prior of deletion of length 7=-20.72326583694641", + "#Ln prior of deletion of length 6=-20.72326583694641", + "#Ln prior of deletion of length 5=-20.72326583694641" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:45:43.699286" + }, + "human - vcf - base": { + "content": [ + "#Ln prior of deletion of length 10=-20.72326583694641" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-15T12:47:39.949405" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/filtermutectcalls/tests/nextflow.config b/modules/nf-core/gatk4/filtermutectcalls/tests/nextflow.config new file mode 100644 index 0000000000..12fa58fb34 --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: GATK4_FILTERMUTECTCALLS { + ext.prefix = { "${meta.id}.filtered" } + } +} diff --git a/modules/nf-core/gatk4/filtermutectcalls/tests/tags.yml b/modules/nf-core/gatk4/filtermutectcalls/tests/tags.yml new file mode 100644 index 0000000000..4473103181 --- /dev/null +++ b/modules/nf-core/gatk4/filtermutectcalls/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/filtermutectcalls: + - "modules/nf-core/gatk4/filtermutectcalls/**" diff --git a/modules/nf-core/gatk4/getpileupsummaries/main.nf b/modules/nf-core/gatk4/getpileupsummaries/main.nf index 6006e8dd42..43611271e0 100644 --- a/modules/nf-core/gatk4/getpileupsummaries/main.nf +++ b/modules/nf-core/gatk4/getpileupsummaries/main.nf @@ -50,4 +50,15 @@ process GATK4_GETPILEUPSUMMARIES { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.pileups.table + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test b/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test new file mode 100644 index 0000000000..79cd6344cb --- /dev/null +++ b/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test @@ -0,0 +1,104 @@ +nextflow_process { + + name "Test Process GATK4_GETPILEUPSUMMARIES" + script "../main.nf" + process "GATK4_GETPILEUPSUMMARIES" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/getpileupsummaries" + + test("human - bam") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true) , + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.interval_list', checkIfExists: true) + ] + input[1] = [[],[]] // fasta + input[2] = [[],[]] // fai + input[3] = [[],[]] // dict + input[4] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz', checkIfExists: true) + input[5] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("human - cram") { + + when { + process { + """ + input[0] = [ [ id:'test' ], // 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), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.interval_list', checkIfExists: true) + ] + input[1] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[2] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.dict', checkIfExists: true) + ] + input[4] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz', checkIfExists: true) + input[5] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("human - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true) , + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.interval_list', checkIfExists: true) + ] + input[1] = [[],[]] // fasta + input[2] = [[],[]] // fai + input[3] = [[],[]] // dict + input[4] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz', checkIfExists: true) + input[5] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test.snap b/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test.snap new file mode 100644 index 0000000000..d9304bcdc5 --- /dev/null +++ b/modules/nf-core/gatk4/getpileupsummaries/tests/main.nf.test.snap @@ -0,0 +1,101 @@ +{ + "human - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ], + "table": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T10:18:25.186463" + }, + "human - bam": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,8e0ca6f66e112bd2f7ec1d31a2d62469" + ] + ], + "1": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ], + "table": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,8e0ca6f66e112bd2f7ec1d31a2d62469" + ] + ], + "versions": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T14:14:59.7414" + }, + "human - cram": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,8e0ca6f66e112bd2f7ec1d31a2d62469" + ] + ], + "1": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ], + "table": [ + [ + { + "id": "test" + }, + "test.pileups.table:md5,8e0ca6f66e112bd2f7ec1d31a2d62469" + ] + ], + "versions": [ + "versions.yml:md5,a243840d67560fd6de1209a0aa99401a" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T14:15:25.680928" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/getpileupsummaries/tests/tags.yml b/modules/nf-core/gatk4/getpileupsummaries/tests/tags.yml new file mode 100644 index 0000000000..bac8007d9e --- /dev/null +++ b/modules/nf-core/gatk4/getpileupsummaries/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/getpileupsummaries: + - "modules/nf-core/gatk4/getpileupsummaries/**" diff --git a/modules/nf-core/gatk4/mergemutectstats/main.nf b/modules/nf-core/gatk4/mergemutectstats/main.nf index af41d61507..06bce31e31 100644 --- a/modules/nf-core/gatk4/mergemutectstats/main.nf +++ b/modules/nf-core/gatk4/mergemutectstats/main.nf @@ -41,4 +41,15 @@ process GATK4_MERGEMUTECTSTATS { gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.vcf.gz.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test b/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test new file mode 100644 index 0000000000..5f5ab40233 --- /dev/null +++ b/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process GATK4_MERGEMUTECTSTATS" + script "../main.nf" + process "GATK4_MERGEMUTECTSTATS" + + tag "modules" + tag "modules_nfcore" + tag "gatk4" + tag "gatk4/mergemutectstats" + + test("human - stats, tsv") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions") }, + { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0]).match() } + ) + } + + } + + test("human - stats,tsv - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test.snap b/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test.snap new file mode 100644 index 0000000000..d0279f272e --- /dev/null +++ b/modules/nf-core/gatk4/mergemutectstats/tests/main.nf.test.snap @@ -0,0 +1,59 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,7298d6e6e18024f7c2ed0fe38d259a52" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T10:13:56.2195" + }, + "human - stats,tsv - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,7298d6e6e18024f7c2ed0fe38d259a52" + ], + "stats": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.stats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7298d6e6e18024f7c2ed0fe38d259a52" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T10:14:10.058769" + }, + "human - stats, tsv": { + "content": [ + "statistic\tvalue" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.0" + }, + "timestamp": "2024-05-16T10:13:56.262881" + } +} \ No newline at end of file diff --git a/modules/nf-core/gatk4/mergemutectstats/tests/tags.yml b/modules/nf-core/gatk4/mergemutectstats/tests/tags.yml new file mode 100644 index 0000000000..b750e551f9 --- /dev/null +++ b/modules/nf-core/gatk4/mergemutectstats/tests/tags.yml @@ -0,0 +1,2 @@ +gatk4/mergemutectstats: + - "modules/nf-core/gatk4/mergemutectstats/**" diff --git a/modules/nf-core/gawk/environment.yml b/modules/nf-core/gawk/environment.yml index 34513c7f4a..3d98a08b0c 100644 --- a/modules/nf-core/gawk/environment.yml +++ b/modules/nf-core/gawk/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - anaconda::gawk=5.1.0 + - conda-forge::gawk=5.3.0 diff --git a/modules/nf-core/gawk/main.nf b/modules/nf-core/gawk/main.nf index 578b448c4f..ca4689297c 100644 --- a/modules/nf-core/gawk/main.nf +++ b/modules/nf-core/gawk/main.nf @@ -4,8 +4,8 @@ process GAWK { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : - 'biocontainers/gawk:5.1.0' }" + 'https://depot.galaxyproject.org/singularity/gawk:5.3.0' : + 'biocontainers/gawk:5.3.0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/gawk/tests/main.nf.test.snap b/modules/nf-core/gawk/tests/main.nf.test.snap index ce20747890..4f3a759c62 100644 --- a/modules/nf-core/gawk/tests/main.nf.test.snap +++ b/modules/nf-core/gawk/tests/main.nf.test.snap @@ -11,7 +11,7 @@ ] ], "1": [ - "versions.yml:md5,4c320d8c98ca80690afd7651da1ba520" + "versions.yml:md5,842acc9870dc8ac280954047cb2aa23a" ], "output": [ [ @@ -22,15 +22,15 @@ ] ], "versions": [ - "versions.yml:md5,4c320d8c98ca80690afd7651da1ba520" + "versions.yml:md5,842acc9870dc8ac280954047cb2aa23a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.02.0" + "nextflow": "24.03.0" }, - "timestamp": "2024-04-05T11:00:28.097563" + "timestamp": "2024-05-17T15:20:02.495430346" }, "convert fasta to bed": { "content": [ @@ -44,7 +44,7 @@ ] ], "1": [ - "versions.yml:md5,4c320d8c98ca80690afd7651da1ba520" + "versions.yml:md5,842acc9870dc8ac280954047cb2aa23a" ], "output": [ [ @@ -55,14 +55,14 @@ ] ], "versions": [ - "versions.yml:md5,4c320d8c98ca80690afd7651da1ba520" + "versions.yml:md5,842acc9870dc8ac280954047cb2aa23a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.02.0" + "nextflow": "24.03.0" }, - "timestamp": "2024-04-05T10:28:15.625869" + "timestamp": "2024-05-17T15:19:53.291809648" } } \ No newline at end of file diff --git a/modules/nf-core/ngscheckmate/ncm/main.nf b/modules/nf-core/ngscheckmate/ncm/main.nf index 99921ddcc5..d5500a257c 100644 --- a/modules/nf-core/ngscheckmate/ncm/main.nf +++ b/modules/nf-core/ngscheckmate/ncm/main.nf @@ -48,6 +48,7 @@ process NGSCHECKMATE_NCM { """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "$meta.id" """ touch ${prefix}_output_corr_matrix.txt diff --git a/modules/nf-core/ngscheckmate/ncm/tests/bam.config b/modules/nf-core/ngscheckmate/ncm/tests/bam.config new file mode 100644 index 0000000000..09805c1614 --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/bam.config @@ -0,0 +1,5 @@ +process { + withName: NGSCHECKMATE_NCM { + ext.args = '-B' + } +} diff --git a/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test b/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test new file mode 100644 index 0000000000..9dafbdf6df --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test @@ -0,0 +1,184 @@ +nextflow_process { + + name "Test Process NGSCHECKMATE_NCM" + script "../main.nf" + process "NGSCHECKMATE_NCM" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "ngscheckmate" + tag "ngscheckmate/ncm" + tag "bedtools/makewindows" + tag "bcftools/mpileup" + + setup { + + run("BEDTOOLS_MAKEWINDOWS") { + script "../../../bedtools/makewindows/main.nf" + process { + """ + input[0] = [ [ id:'test' ], + file(params.test_data['sarscov2']['genome']['test_bed'], checkIfExists: true) + ] + """ + } + } + + run("BCFTOOLS_MPILEUP", alias: "BCFTOOLS_MPILEUP1") { + script "../../../bcftools/mpileup/main.nf" + process { + """ + input[0] = [ + [ id:'test1' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + file(params.test_data['sarscov2']['genome']['test_bed'], checkIfExists: true) + ] + input[1] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + run("BCFTOOLS_MPILEUP", alias: "BCFTOOLS_MPILEUP2") { + script "../../../bcftools/mpileup/main.nf" + process { + """ + input[0] = [ + [ id:'test2' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + file(params.test_data['sarscov2']['genome']['test_bed'], checkIfExists: true) + ] + input[1] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + } + + + test("sarscov2 - bam") { + config "./bam.config" + when { + process { + """ + input[0] = [ [ id: 'combined_bams' ], + [file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam_bai'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_methylated_sorted_bam'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_methylated_sorted_bam_bai'], checkIfExists: true ) + ] + ] + input[1] = BEDTOOLS_MAKEWINDOWS.out.bed + input[2] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.corr_matrix, + process.out.matched, + process.out.all, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - vcf") { + config "./vcf.config" + when { + process { + """ + input[0] = BCFTOOLS_MPILEUP1.out.vcf.combine(BCFTOOLS_MPILEUP2.out.vcf.map{it[1]}).map{meta, one, two -> [meta, [one, two]]}.map{meta, stuff -> [meta, stuff.flatten()]} + input[1] = BEDTOOLS_MAKEWINDOWS.out.bed + input[2] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.corr_matrix, + process.out.matched, + process.out.all, + file(process.out.pdf[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - bam - stub") { + + options "-stub" + config "./bam.config" + when { + process { + """ + input[0] = [ [ id: 'combined_bams' ], + [file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam_bai'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_methylated_sorted_bam'] , checkIfExists: true ), + file(params.test_data['sarscov2']['illumina']['test_paired_end_methylated_sorted_bam_bai'], checkIfExists: true ) + ] + ] + input[1] = BEDTOOLS_MAKEWINDOWS.out.bed + input[2] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - vcf - stub") { + + options "-stub" + config "./vcf.config" + when { + process { + """ + input[0] = BCFTOOLS_MPILEUP1.out.vcf.combine(BCFTOOLS_MPILEUP2.out.vcf.map{it[1]}) + input[1] = BEDTOOLS_MAKEWINDOWS.out.bed + input[2] = [ [ id:'sarscov2' ], + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test.snap b/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test.snap new file mode 100644 index 0000000000..46a98ccc98 --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/main.nf.test.snap @@ -0,0 +1,249 @@ +{ + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_output_corr_matrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_matched.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_all.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "combined_bams" + }, + "combined_bams.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ], + "all": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_all.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "corr_matrix": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_output_corr_matrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "matched": [ + [ + { + "id": "combined_bams" + }, + "combined_bams_matched.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "combined_bams" + }, + "combined_bams.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + + ], + "versions": [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.1" + }, + "timestamp": "2024-05-22T15:02:55.532427413" + }, + "sarscov2 - vcf": { + "content": [ + [ + [ + { + "id": "test1" + }, + "test1_output_corr_matrix.txt:md5,0c86bdad2721c470fe6be119f291c8e5" + ] + ], + [ + [ + { + "id": "test1" + }, + "test1_matched.txt:md5,fd74956dcac279b6f58e82ea73e344f8" + ] + ], + [ + [ + { + "id": "test1" + }, + "test1_all.txt:md5,fd74956dcac279b6f58e82ea73e344f8" + ] + ], + "test1.pdf", + [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.1" + }, + "timestamp": "2024-05-22T19:53:29.123160766" + }, + "sarscov2 - bam": { + "content": [ + [ + [ + { + "id": "combined_bams" + }, + "combined_bams_output_corr_matrix.txt:md5,b8bfd203232680b746ac91ccb290b5e3" + ] + ], + [ + [ + { + "id": "combined_bams" + }, + "combined_bams_matched.txt:md5,14d0b35765e127aab0ffa5ea5406b4ab" + ] + ], + [ + [ + { + "id": "combined_bams" + }, + "combined_bams_all.txt:md5,14d0b35765e127aab0ffa5ea5406b4ab" + ] + ], + [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.1" + }, + "timestamp": "2024-05-22T16:04:35.032277154" + }, + "sarscov2 - vcf - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test1" + }, + "test1_output_corr_matrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test1" + }, + "test1_matched.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test1" + }, + "test1_all.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test1" + }, + "test1.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ], + "all": [ + [ + { + "id": "test1" + }, + "test1_all.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "corr_matrix": [ + [ + { + "id": "test1" + }, + "test1_output_corr_matrix.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "matched": [ + [ + { + "id": "test1" + }, + "test1_matched.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "test1" + }, + "test1.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + + ], + "versions": [ + "versions.yml:md5,7ac92d9cbf4fc44b3253832f3a8b2a80" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.1" + }, + "timestamp": "2024-05-22T15:20:40.816531052" + } +} \ No newline at end of file diff --git a/modules/nf-core/ngscheckmate/ncm/tests/nextflow.config b/modules/nf-core/ngscheckmate/ncm/tests/nextflow.config new file mode 100644 index 0000000000..cf3d42a0e9 --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/nextflow.config @@ -0,0 +1,15 @@ +process { + withName: BEDTOOLS_MAKEWINDOWS { + ext.args = '-w 1' + ext.prefix = 'test_split' + } + withName: BCFTOOLS_MPILEUP1 { + ext.args2 = '--no-version --ploidy 1 --multiallelic-caller' + ext.args3 = '--no-version' + } + withName: BCFTOOLS_MPILEUP2 { + ext.args2 = '--no-version --ploidy 1 --multiallelic-caller' + ext.args3 = '--no-version' + } + +} diff --git a/modules/nf-core/ngscheckmate/ncm/tests/tags.yml b/modules/nf-core/ngscheckmate/ncm/tests/tags.yml new file mode 100644 index 0000000000..f9f6044516 --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/tags.yml @@ -0,0 +1,2 @@ +ngscheckmate/ncm: + - "modules/nf-core/ngscheckmate/ncm/**" diff --git a/modules/nf-core/ngscheckmate/ncm/tests/vcf.config b/modules/nf-core/ngscheckmate/ncm/tests/vcf.config new file mode 100644 index 0000000000..67053c14da --- /dev/null +++ b/modules/nf-core/ngscheckmate/ncm/tests/vcf.config @@ -0,0 +1,5 @@ + process { + withName: NGSCHECKMATE_NCM { + ext.args = '-V' + } + } From cd93a9b341ee9591d0c543953122e3f100680502 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 17:47:22 +0200 Subject: [PATCH 054/109] feat(.nf-core.yml): clean up file --- .nf-core.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 4abfaf5a37..e0b3aa1f76 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,16 +6,11 @@ lint: - .github/workflows/awsfulltest.yml - .github/workflows/awstest.yml - conf/modules.config - - lib/WorkflowMain.groovy - - lib/NfcoreTemplate.groovy - - lib/WorkflowSarek.groovy files_unchanged: - .gitignore - .github/PULL_REQUEST_TEMPLATE.md - assets/nf-core-sarek_logo_light.png - docs/images/nf-core-sarek_logo_dark.png - docs/images/nf-core-sarek_logo_light.png - - lib/NfcoreTemplate.groovy - - lib/NfcoreSchema.groovy modules_config: False template_strings: False From adf00db47fea063a6a70bfc6a54852bd89563c5e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 27 May 2024 17:53:52 +0200 Subject: [PATCH 055/109] feat(CHANGELOG.md): update with new pr and dependencies update --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc77e76399..dfb1a0fba9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev - [#1518](https://github.com/nf-core/sarek/pull/1518) - Sync `TEMPLATE` with `tools` `2.14.1` - [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling +- [#1545](https://github.com/nf-core/sarek/pull/1545) - Update modules ### Fixed @@ -30,6 +31,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `bwa` | 0.7.17 | 0.7.18 | +| `cnvkit` | 0.9.10 | 0.9.11 | +| `gawk` | 5.1.0 | 5.3.0 | +| `htslib` | 1.19.1 | 1.20 | +| `samtools` | 1.19.2 | 1.20 | + ### Modules / Subworkflows ### Parameters From b1b15b0502cf304d15faccfb3f6006ec24fa0a56 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 28 May 2024 17:50:05 +0200 Subject: [PATCH 056/109] Update nextflow_schema.json Fix Typo --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 0cac3eb494..1611d58f40 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -15,7 +15,7 @@ "properties": { "input": { "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "A design file with information about the samples in your experiment. Use this parameter to specify the location of the input files. It has to be a comma-separated file with a header row. See [usage docs](https://nf-co.re/sarek/usage#input).\n\nIf no input file is specified, sarek will attempt to locate one in the `{outdir}` directory. If no input should be supplied, i.e. when --step is supplied or --build_from_index, then set --input false", + "help_text": "A design file with information about the samples in your experiment. Use this parameter to specify the location of the input files. It has to be a comma-separated file with a header row. See [usage docs](https://nf-co.re/sarek/usage#input).\n\nIf no input file is specified, sarek will attempt to locate one in the `{outdir}` directory. If no input should be supplied, i.e. when --step is supplied or --build_only_index, then set --input false", "fa_icon": "fas fa-file-csv", "type": "string", "format": "file-path", From 85f03c17a42a296e3565de6c0cb55705e0b599f4 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 29 May 2024 14:30:58 +0000 Subject: [PATCH 057/109] Adding pytest alignment_from_everything --- nextflow.config | 3 +- tests/config/pytesttags.yml | 13 ++++++++ tests/test_alignment_from_everything.yml | 42 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 tests/test_alignment_from_everything.yml diff --git a/nextflow.config b/nextflow.config index 40108f327d..84c8a75297 100644 --- a/nextflow.config +++ b/nextflow.config @@ -296,8 +296,7 @@ profiles { } // Extra test profiles for more complete CI - // TO-DO: Indentation! - alignment_from_everything { includeConfig 'conf/test/alignment_from_everything.config' } + alignment_from_everything { includeConfig 'conf/test/alignment_from_everything.config' } alignment_to_fastq { includeConfig 'conf/test/alignment_to_fastq.config' } annotation { includeConfig 'conf/test/annotation.config' } markduplicates_bam { includeConfig 'conf/test/markduplicates_bam.config' } diff --git a/tests/config/pytesttags.yml b/tests/config/pytesttags.yml index ac74cb8931..4d584f1e28 100644 --- a/tests/config/pytesttags.yml +++ b/tests/config/pytesttags.yml @@ -72,6 +72,19 @@ validation_checks: # preprocessing +## alignment_from_everything +alignment_to_everything: + - conf/modules/** + - conf/test/alignment_from_everything.config + - main.nf + - modules/** + - nextflow.config + - nextflow_schema.json + - subworkflows/** + - tests/csv/3.0/bam_and_fastq_and_spring.csv + - tests/test_alignment_from_everything.yml + - workflows/** + ## alignment_to_fastq alignment_to_fastq: - conf/modules/alignment_to_fastq.config diff --git a/tests/test_alignment_from_everything.yml b/tests/test_alignment_from_everything.yml new file mode 100644 index 0000000000..8df8133adc --- /dev/null +++ b/tests/test_alignment_from_everything.yml @@ -0,0 +1,42 @@ +- name: Run alignment to bam fastq and spring files to bam files + command: nextflow run main.nf -profile test,alignment_from_everything --outdir results --save_mapped --save_output_as_bam + tags: + - alignment_from_everything + files: + - path: results/csv/mapped.csv + md5sum: 5a10f49a6a691c84e31e7dd8e91c8201 + - path: results/csv/markduplicates.csv + md5sum: 293ae6ec0286272470dd8d6edf4b4fc9 + - path: results/csv/markduplicates_no_table.csv + md5sum: e379af37e14b94c17465654f971bd23f + - path: results/csv/recalibrated.csv + md5sum: 976529de568cdf201e6b9dfb2da3f62f + - path: results/multiqc + - path: results/preprocessing/mapped/test/test.sorted.bam + - path: results/preprocessing/mapped/test/test.sorted.bam.bai + - path: results/preprocessing/mapped/test2/test2.sorted.bam + - path: results/preprocessing/mapped/test2/test2.sorted.bam.bai + - path: results/preprocessing/mapped/test3/test3.sorted.bam + - path: results/preprocessing/mapped/test3/test3.sorted.bam.bai + - path: results/preprocessing/mapped/test_bam/test_bam.sorted.bam + - path: results/preprocessing/mapped/test_bam/test_bam.sorted.bam.bai + - path: results/preprocessing/markduplicates/test/test.md.bam + - path: results/preprocessing/markduplicates/test/test.md.bam.bai + - path: results/preprocessing/markduplicates/test2/test2.md.bam + - path: results/preprocessing/markduplicates/test2/test2.md.bam.bai + - path: results/preprocessing/markduplicates/test3/test3.md.bam + - path: results/preprocessing/markduplicates/test3/test3.md.bam.bai + - path: results/preprocessing/markduplicates/test_bam/test_bam.md.bam + - path: results/preprocessing/markduplicates/test_bam/test_bam.md.bam.bai + - path: results/preprocessing/recal_table/test/test.recal.table + - path: results/preprocessing/recal_table/test2/test2.recal.table + - path: results/preprocessing/recal_table/test3/test3.recal.table + - path: results/preprocessing/recal_table/test_bam/test_bam.recal.table + - path: results/preprocessing/recalibrated/test/test.recal.bam + - path: results/preprocessing/recalibrated/test/test.recal.bam.bai + - path: results/preprocessing/recalibrated/test2/test2.recal.bam + - path: results/preprocessing/recalibrated/test2/test2.recal.bam.bai + - path: results/preprocessing/recalibrated/test3/test3.recal.bam + - path: results/preprocessing/recalibrated/test3/test3.recal.bam.bai + - path: results/preprocessing/recalibrated/test_bam/test_bam.recal.bam + - path: results/preprocessing/recalibrated/test_bam/test_bam.recal.bam.bai \ No newline at end of file From e434c1ce989f972f088a2f29c0afac9d74385404 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 29 May 2024 15:33:46 +0000 Subject: [PATCH 058/109] fix typo --- tests/config/pytesttags.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/config/pytesttags.yml b/tests/config/pytesttags.yml index 4d584f1e28..63c96d73a9 100644 --- a/tests/config/pytesttags.yml +++ b/tests/config/pytesttags.yml @@ -73,7 +73,7 @@ validation_checks: # preprocessing ## alignment_from_everything -alignment_to_everything: +alignment_from_everything: - conf/modules/** - conf/test/alignment_from_everything.config - main.nf From 8515a83c4a805e9c076eb3c7ed7dad394fb5aa50 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 29 May 2024 16:12:37 +0000 Subject: [PATCH 059/109] prettier --- tests/test_alignment_from_everything.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_alignment_from_everything.yml b/tests/test_alignment_from_everything.yml index 8df8133adc..cdbbb15b36 100644 --- a/tests/test_alignment_from_everything.yml +++ b/tests/test_alignment_from_everything.yml @@ -39,4 +39,4 @@ - path: results/preprocessing/recalibrated/test3/test3.recal.bam - path: results/preprocessing/recalibrated/test3/test3.recal.bam.bai - path: results/preprocessing/recalibrated/test_bam/test_bam.recal.bam - - path: results/preprocessing/recalibrated/test_bam/test_bam.recal.bam.bai \ No newline at end of file + - path: results/preprocessing/recalibrated/test_bam/test_bam.recal.bam.bai From 1a649a7fd4ead0c5d2555682c514daaa5f71a48e Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 30 May 2024 09:04:51 +0000 Subject: [PATCH 060/109] Disabling default publishing of fastq.gz-files from SPRING_DECOMPRESS --- conf/modules/modules.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 4cb87f2754..d87f97174f 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -52,6 +52,9 @@ process { withName: 'NFCORE_SAREK:SAREK:SPRING_DECOMPRESS_.*' { ext.prefix = { "${spring.simpleName}" } + publishDir = [ + enabled: false + ] } withName: 'MOSDEPTH' { From 831412591826b4465174e98564f09c88d3cb626e Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 31 May 2024 10:13:41 +0200 Subject: [PATCH 061/109] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc77e76399..8e347fc7cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1536](https://github.com/nf-core/sarek/pull/1536) - Correct typo `Strelka2` to `Strelka` - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` +- [#1547](https://github.com/nf-core/sarek/pull/1547) - Correct typo in help text in nextflow_schema.json ### Removed From a61ee28874059642a3d0162fc68a9431925b2cbb Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 4 Jun 2024 11:06:58 +0000 Subject: [PATCH 062/109] Update samtools to v1.20 --- modules.json | 18 +++++----- .../nf-core/samtools/bam2fq/environment.yml | 4 +-- modules/nf-core/samtools/bam2fq/main.nf | 4 +-- .../samtools/bam2fq/tests/main.nf.test.snap | 12 +++---- .../samtools/collatefastq/environment.yml | 4 +-- modules/nf-core/samtools/collatefastq/main.nf | 4 +-- .../nf-core/samtools/convert/environment.yml | 4 +-- modules/nf-core/samtools/convert/main.nf | 4 +-- .../samtools/convert/tests/main.nf.test.snap | 16 ++++----- .../nf-core/samtools/faidx/environment.yml | 4 +-- modules/nf-core/samtools/faidx/main.nf | 4 +-- .../samtools/faidx/tests/main.nf.test.snap | 30 ++++++++-------- .../nf-core/samtools/index/environment.yml | 4 +-- modules/nf-core/samtools/index/main.nf | 4 +-- .../samtools/index/tests/main.nf.test.snap | 18 +++++----- .../nf-core/samtools/merge/environment.yml | 4 +-- modules/nf-core/samtools/merge/main.nf | 4 +-- .../samtools/merge/tests/main.nf.test.snap | 24 ++++++------- .../nf-core/samtools/mpileup/environment.yml | 4 +-- modules/nf-core/samtools/mpileup/main.nf | 4 +-- .../samtools/mpileup/tests/main.nf.test.snap | 12 +++---- .../nf-core/samtools/stats/environment.yml | 4 +-- modules/nf-core/samtools/stats/main.nf | 4 +-- .../samtools/stats/tests/main.nf.test.snap | 24 ++++++------- modules/nf-core/samtools/view/environment.yml | 4 +-- modules/nf-core/samtools/view/main.nf | 4 +-- .../samtools/view/tests/main.nf.test.snap | 36 +++++++++---------- 27 files changed, 131 insertions(+), 131 deletions(-) diff --git a/modules.json b/modules.json index dbcc044709..a4d96614ba 100644 --- a/modules.json +++ b/modules.json @@ -356,47 +356,47 @@ }, "samtools/bam2fq": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/collatefastq": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/convert": { "branch": "master", - "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "f153f1f10e1083c49935565844cccb7453021682", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/index": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/mpileup": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "samtools/view": { "branch": "master", - "git_sha": "0bd7d2333a88483aa0476acea172e9f5f6dd83bb", + "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", "installed_by": ["modules"] }, "sentieon/applyvarcal": { diff --git a/modules/nf-core/samtools/bam2fq/environment.yml b/modules/nf-core/samtools/bam2fq/environment.yml index 6f3c6d8b1b..9c98946adc 100644 --- a/modules/nf-core/samtools/bam2fq/environment.yml +++ b/modules/nf-core/samtools/bam2fq/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/bam2fq/main.nf b/modules/nf-core/samtools/bam2fq/main.nf index 463c6ae20b..a34a13a984 100644 --- a/modules/nf-core/samtools/bam2fq/main.nf +++ b/modules/nf-core/samtools/bam2fq/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_BAM2FQ { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(inputbam) diff --git a/modules/nf-core/samtools/bam2fq/tests/main.nf.test.snap b/modules/nf-core/samtools/bam2fq/tests/main.nf.test.snap index 84da35bae4..aa0f8c34d1 100644 --- a/modules/nf-core/samtools/bam2fq/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/bam2fq/tests/main.nf.test.snap @@ -51,25 +51,25 @@ "bam_versions": { "content": [ [ - "versions.yml:md5,04115f386f1c3cb2e25edc02821da2fc" + "versions.yml:md5,90c1cf8971540ef05e330db5a560195c" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:13:56.124383258" + "timestamp": "2024-05-28T15:43:52.415053401" }, "bam_split_versions": { "content": [ [ - "versions.yml:md5,04115f386f1c3cb2e25edc02821da2fc" + "versions.yml:md5,90c1cf8971540ef05e330db5a560195c" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:14:03.828077257" + "timestamp": "2024-05-28T15:43:57.740193087" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/collatefastq/environment.yml b/modules/nf-core/samtools/collatefastq/environment.yml index d1ce1a8019..93734c5670 100644 --- a/modules/nf-core/samtools/collatefastq/environment.yml +++ b/modules/nf-core/samtools/collatefastq/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/collatefastq/main.nf b/modules/nf-core/samtools/collatefastq/main.nf index 1e431c6e5e..a75f56e8c6 100644 --- a/modules/nf-core/samtools/collatefastq/main.nf +++ b/modules/nf-core/samtools/collatefastq/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_COLLATEFASTQ { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/convert/environment.yml b/modules/nf-core/samtools/convert/environment.yml index cd4ee8c364..7a95ca614a 100644 --- a/modules/nf-core/samtools/convert/environment.yml +++ b/modules/nf-core/samtools/convert/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/convert/main.nf b/modules/nf-core/samtools/convert/main.nf index d61fbe2e3a..03b7b5259d 100644 --- a/modules/nf-core/samtools/convert/main.nf +++ b/modules/nf-core/samtools/convert/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_CONVERT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input), path(index) diff --git a/modules/nf-core/samtools/convert/tests/main.nf.test.snap b/modules/nf-core/samtools/convert/tests/main.nf.test.snap index 3d6f88c4dd..513629022b 100644 --- a/modules/nf-core/samtools/convert/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/convert/tests/main.nf.test.snap @@ -22,26 +22,26 @@ "cram_to_bam_versions": { "content": [ [ - "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + "versions.yml:md5,b1040cd80ce16abb9b2c2902b62d5fcd" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-06T11:14:51.308885706" + "timestamp": "2024-05-28T15:44:34.618037105" }, "bam_to_cram_versions": { "content": [ [ - "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + "versions.yml:md5,b1040cd80ce16abb9b2c2902b62d5fcd" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-06T11:14:36.643960504" + "timestamp": "2024-05-28T15:44:29.165839679" }, "stub": { "content": [ @@ -71,7 +71,7 @@ ] ], "4": [ - "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + "versions.yml:md5,b1040cd80ce16abb9b2c2902b62d5fcd" ], "bai": [ @@ -98,15 +98,15 @@ ] ], "versions": [ - "versions.yml:md5,dd0aaf61f39c9ce91c74090f3c7ce1d0" + "versions.yml:md5,b1040cd80ce16abb9b2c2902b62d5fcd" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T12:01:40.896170698" + "timestamp": "2024-05-28T15:44:40.258233921" }, "bam_to_cram_index": { "content": [ diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml index 9c24eb0ab3..f8450fa566 100644 --- a/modules/nf-core/samtools/faidx/environment.yml +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -6,5 +6,5 @@ channels: - defaults dependencies: - - bioconda::htslib=1.19.1 - - bioconda::samtools=1.19.2 + - bioconda::htslib=1.20 + - bioconda::samtools=1.20 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index cfe7ad95fa..bdcdbc954d 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_FAIDX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(fasta) 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 3e651ef680..3223b72bc6 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -18,7 +18,7 @@ ], "3": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ], "fa": [ @@ -36,7 +36,7 @@ ], "versions": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ] } ], @@ -44,7 +44,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-18T16:22:39.412601" + "timestamp": "2024-05-28T15:42:14.779784761" }, "test_samtools_faidx_bgzip": { "content": [ @@ -71,7 +71,7 @@ ] ], "3": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ], "fa": [ @@ -95,7 +95,7 @@ ] ], "versions": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ] } ], @@ -103,7 +103,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-18T16:23:22.427966" + "timestamp": "2024-05-28T15:42:20.256633877" }, "test_samtools_faidx_fasta": { "content": [ @@ -124,7 +124,7 @@ ], "3": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ], "fa": [ [ @@ -142,7 +142,7 @@ ], "versions": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ] } ], @@ -150,7 +150,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-18T16:24:04.107537" + "timestamp": "2024-05-28T15:42:25.632577273" }, "test_samtools_faidx_stub_fasta": { "content": [ @@ -171,7 +171,7 @@ ], "3": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ], "fa": [ [ @@ -189,7 +189,7 @@ ], "versions": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ] } ], @@ -197,7 +197,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-18T16:24:45.868463" + "timestamp": "2024-05-28T15:42:31.058424849" }, "test_samtools_faidx_stub_fai": { "content": [ @@ -218,7 +218,7 @@ ], "3": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ], "fa": [ @@ -236,7 +236,7 @@ ], "versions": [ - "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + "versions.yml:md5,2db78952923a61e05d50b95518b21856" ] } ], @@ -244,6 +244,6 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-18T16:25:27.550554" + "timestamp": "2024-05-28T15:42:36.479929617" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml index a5e5064986..260d516be9 100644 --- a/modules/nf-core/samtools/index/environment.yml +++ b/modules/nf-core/samtools/index/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index dc14f98d63..b523c21b43 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_INDEX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap index 3dc8e7de81..52756e85c6 100644 --- a/modules/nf-core/samtools/index/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -2,26 +2,26 @@ "crai_versions": { "content": [ [ - "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:00.324667957" + "timestamp": "2024-05-28T15:42:04.203740976" }, "csi_versions": { "content": [ [ - "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:07.885103162" + "timestamp": "2024-05-28T15:42:09.57475878" }, "crai": { "content": [ @@ -62,13 +62,13 @@ "bai_versions": { "content": [ [ - "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + "versions.yml:md5,802c9776d9c5e95314e888cf18e96d77" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:11:51.641425452" + "timestamp": "2024-05-28T15:41:57.929287369" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/merge/environment.yml b/modules/nf-core/samtools/merge/environment.yml index fc669b1b62..cd366d6de3 100644 --- a/modules/nf-core/samtools/merge/environment.yml +++ b/modules/nf-core/samtools/merge/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index a3048c2836..693b1d80f4 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_MERGE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input_files, stageAs: "?/*") diff --git a/modules/nf-core/samtools/merge/tests/main.nf.test.snap b/modules/nf-core/samtools/merge/tests/main.nf.test.snap index f7da7699b4..17bc846fa2 100644 --- a/modules/nf-core/samtools/merge/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/merge/tests/main.nf.test.snap @@ -80,14 +80,14 @@ "bam_versions": { "content": [ [ - "versions.yml:md5,52c62d4712f7af00eb962d090ca32fe4" + "versions.yml:md5,84dab54b9812780df48f5cecef690c34" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:16:33.782637377" + "timestamp": "2024-05-28T15:46:35.851936597" }, "bams_csi": { "content": [ @@ -124,14 +124,14 @@ "bams_stub_versions": { "content": [ [ - "versions.yml:md5,52c62d4712f7af00eb962d090ca32fe4" + "versions.yml:md5,84dab54b9812780df48f5cecef690c34" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:16:42.594476052" + "timestamp": "2024-05-28T15:46:41.405707643" }, "bam_cram": { "content": [ @@ -158,14 +158,14 @@ "bams_versions": { "content": [ [ - "versions.yml:md5,52c62d4712f7af00eb962d090ca32fe4" + "versions.yml:md5,84dab54b9812780df48f5cecef690c34" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:16:04.805335656" + "timestamp": "2024-05-28T15:45:51.695689923" }, "crams_bam": { "content": [ @@ -182,14 +182,14 @@ "crams_versions": { "content": [ [ - "versions.yml:md5,52c62d4712f7af00eb962d090ca32fe4" + "versions.yml:md5,84dab54b9812780df48f5cecef690c34" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:16:25.889394689" + "timestamp": "2024-05-28T15:46:30.185392319" }, "bam_csi": { "content": [ diff --git a/modules/nf-core/samtools/mpileup/environment.yml b/modules/nf-core/samtools/mpileup/environment.yml index 6628f5dc05..add717dafc 100644 --- a/modules/nf-core/samtools/mpileup/environment.yml +++ b/modules/nf-core/samtools/mpileup/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/mpileup/main.nf b/modules/nf-core/samtools/mpileup/main.nf index cb96181ff1..b51f96d369 100644 --- a/modules/nf-core/samtools/mpileup/main.nf +++ b/modules/nf-core/samtools/mpileup/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_MPILEUP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input), path(intervals) path fasta diff --git a/modules/nf-core/samtools/mpileup/tests/main.nf.test.snap b/modules/nf-core/samtools/mpileup/tests/main.nf.test.snap index fc891c1b74..76b2086b40 100644 --- a/modules/nf-core/samtools/mpileup/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/mpileup/tests/main.nf.test.snap @@ -2,26 +2,26 @@ "bam_bed_versions": { "content": [ [ - "versions.yml:md5,c617148132c6a529bdf506fd58ce6a9d" + "versions.yml:md5,449485eab74a465dc9023760be2c12a1" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:13:40.600861147" + "timestamp": "2024-05-28T15:43:41.535946155" }, "bam_bed_fasta_versions": { "content": [ [ - "versions.yml:md5,c617148132c6a529bdf506fd58ce6a9d" + "versions.yml:md5,449485eab74a465dc9023760be2c12a1" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:13:48.271482127" + "timestamp": "2024-05-28T15:43:46.787790118" }, "bam_bed_mpileup": { "content": [ diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml index 67bb0ca408..1cc83bd954 100644 --- a/modules/nf-core/samtools/stats/environment.yml +++ b/modules/nf-core/samtools/stats/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 52b00f4b6f..982bc28e7f 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_STATS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input), path(input_index) diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap index 1b7c9ba44e..2747fd6c61 100644 --- a/modules/nf-core/samtools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -8,11 +8,11 @@ "id": "test", "single_end": false }, - "test.stats:md5,01812900aa4027532906c5d431114233" + "test.stats:md5,c9d39b38c22de2057fc2f89949090975" ] ], "1": [ - "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" ], "stats": [ [ @@ -20,19 +20,19 @@ "id": "test", "single_end": false }, - "test.stats:md5,01812900aa4027532906c5d431114233" + "test.stats:md5,c9d39b38c22de2057fc2f89949090975" ] ], "versions": [ - "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:15:25.562429714" + "timestamp": "2024-05-28T15:45:24.403941966" }, "bam": { "content": [ @@ -43,11 +43,11 @@ "id": "test", "single_end": false }, - "test.stats:md5,5d8681bf541199898c042bf400391d59" + "test.stats:md5,d522a1fa016b259d6a55620ae53dcd63" ] ], "1": [ - "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" ], "stats": [ [ @@ -55,18 +55,18 @@ "id": "test", "single_end": false }, - "test.stats:md5,5d8681bf541199898c042bf400391d59" + "test.stats:md5,d522a1fa016b259d6a55620ae53dcd63" ] ], "versions": [ - "versions.yml:md5,0514ceb1769b2a88843e08c1f82624a9" + "versions.yml:md5,b3b70b126f867fdbb7dcea5e36e49d4a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:15:07.857611509" + "timestamp": "2024-05-28T15:45:06.711251947" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/view/environment.yml b/modules/nf-core/samtools/view/environment.yml index b0676f338e..150c377771 100644 --- a/modules/nf-core/samtools/view/environment.yml +++ b/modules/nf-core/samtools/view/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::samtools=1.19.2 - - bioconda::htslib=1.19.1 + - bioconda::samtools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index 5a8989d697..38df857604 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_VIEW { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : - 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.20--h50ea8bc_0' : + 'biocontainers/samtools:1.20--h50ea8bc_0' }" input: tuple val(meta), path(input), path(index) diff --git a/modules/nf-core/samtools/view/tests/main.nf.test.snap b/modules/nf-core/samtools/view/tests/main.nf.test.snap index f55943a7ae..eb0c577c90 100644 --- a/modules/nf-core/samtools/view/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/view/tests/main.nf.test.snap @@ -56,14 +56,14 @@ "bam_stub_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:13:09.713353823" + "timestamp": "2024-05-28T15:43:20.390692583" }, "cram_to_bam_index_cram": { "content": [ @@ -208,14 +208,14 @@ "cram_to_bam_index_qname_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:13:03.935041046" + "timestamp": "2024-05-28T15:43:15.007493874" }, "cram_to_bam_bam": { "content": [ @@ -240,14 +240,14 @@ "cram_to_bam_index_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:55.910685496" + "timestamp": "2024-05-28T15:43:09.472376824" }, "cram_to_bam_bai": { "content": [ @@ -264,14 +264,14 @@ "cram_to_bam_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:47.715221169" + "timestamp": "2024-05-28T15:43:04.080050906" }, "cram_bam": { "content": [ @@ -358,14 +358,14 @@ "bam_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:31.692607421" + "timestamp": "2024-05-28T15:42:52.978954857" }, "cram_to_bam_index_qname_cram": { "content": [ @@ -430,14 +430,14 @@ "cram_versions": { "content": [ [ - "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + "versions.yml:md5,6cd41a9a3b4a95271ec011ea990a2838" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.01.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-02-13T16:12:39.913411036" + "timestamp": "2024-05-28T15:42:58.400776109" }, "bam_sam": { "content": [ From 6ef9fd6536cd851fe95f5487f1bf2d4b5937374a Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 4 Jun 2024 11:49:43 +0000 Subject: [PATCH 063/109] Adding forward-slash at the end of string defining modules_testdata_base_path --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 9dd0bca957..81567aed43 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,7 +19,7 @@ params { max_time = '8.h' // Base directory for nf-core/modules test data - modules_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules' + modules_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules/' // Input data input = "${projectDir}/tests/csv/3.0/fastq_single.csv" From 59b0671c2b324158279523fcba3aa81fefbf79b7 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 4 Jun 2024 13:35:33 +0000 Subject: [PATCH 064/109] Removing checks of md5sums for certain output-files from controlfreec --- tests/test_controlfreec.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/test_controlfreec.yml b/tests/test_controlfreec.yml index d72b67ed27..5483c69469 100644 --- a/tests/test_controlfreec.yml +++ b/tests/test_controlfreec.yml @@ -19,11 +19,8 @@ "window = 10", ] - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.bed - md5sum: 833920178e4f40a296d8eab029caf086 - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.circos.txt - md5sum: 92ce5ce97b27a7214dfa9c2cb20cf854 - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.normal.mpileup.gz_control.cpn - md5sum: 508a003da85b186d9a60d867ef7cdf15 - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.p.value.txt # binary changes md5sums on reruns - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_BAF.txt @@ -31,13 +28,10 @@ - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_CNVs # binary changes md5sums on reruns - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_info.txt - md5sum: 271271719c576d9218bdc859850e54ee - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_ratio.BedGraph - md5sum: 5d3321af93678f16878d59e01d3a87d3 - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_ratio.txt # binary changes md5sums on reruns - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3.tumor.mpileup.gz_sample.cpn - md5sum: befe1706c61464635a76c7323a6bd2a2 - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3_BAF.png # binary changes md5sums on reruns - path: results/variant_calling/controlfreec/sample4_vs_sample3/sample4_vs_sample3_ratio.log2.png From 4c47673723cfe525b63bc5fd4754095e9f23fa1a Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 4 Jun 2024 13:55:00 +0000 Subject: [PATCH 065/109] Updating changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e347fc7cc..92ced5cc92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1513](https://github.com/nf-core/sarek/pull/1513) - Back to dev - [#1518](https://github.com/nf-core/sarek/pull/1518) - Sync `TEMPLATE` with `tools` `2.14.1` - [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling +- [#1552](https://github.com/nf-core/sarek/pull/1552) - Update samtools to v1.20 ### Fixed @@ -31,6 +32,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `samtools` | 1.19.2 | 1.20 | + ### Modules / Subworkflows ### Parameters From 5eabc20167ec4efd2ddb380ff6d0036952fa939f Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 5 Jun 2024 08:26:53 +0000 Subject: [PATCH 066/109] Updating bcftools/annotate to bcftools v1.20 --- modules.json | 420 +++++++++++++----- .../bcftools/annotate/bcftools-annotate.diff | 4 +- .../nf-core/bcftools/annotate/environment.yml | 2 +- modules/nf-core/bcftools/annotate/main.nf | 6 +- .../bcftools/annotate/tests/main.nf.test | 34 +- .../bcftools/annotate/tests/main.nf.test.snap | 22 +- 6 files changed, 349 insertions(+), 139 deletions(-) diff --git a/modules.json b/modules.json index a4d96614ba..a1b981cf1a 100644 --- a/modules.json +++ b/modules.json @@ -8,491 +8,689 @@ "ascat": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/annotate": { "branch": "master", - "git_sha": "2ad29c2aed06d815d9f68ad7ba20b3b1c574ce9c", - "installed_by": ["modules"], + "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/bcftools/annotate/bcftools-annotate.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/mpileup": { "branch": "master", "git_sha": "e7df38a545d7d72083eededabd8849f731a01502", - "installed_by": ["bam_ngscheckmate"] + "installed_by": [ + "bam_ngscheckmate" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/stats": { "branch": "master", "git_sha": "618364f55cb88f6c283f6c6c45c24d5f9f08f998", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwa/index": { "branch": "master", "git_sha": "6278bf9afd4a4b2d00fa6052250e73da3d91546f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwa/mem": { "branch": "master", "git_sha": "b97197968ac12dde2463fa54541f6350c46f2035", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "7081e04c18de9480948d34513a1c1e2d0fa9126d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/mem": { "branch": "master", "git_sha": "3afb95b2e15fc4a2347470255a7ef654f650c8ec", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "9437e6053dccf4aafa022bfd6e7e9de67e625af8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/fastq": { "branch": "master", "git_sha": "0997b47c93c06b49aa7b3fefda87e728312cf2ca", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/antitarget": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/batch": { "branch": "master", "git_sha": "f53b071421340e6fac0806c86ba030e578e94826", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/call": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/export": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/genemetrics": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cnvkit/reference": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "controlfreec/assesssignificance": { "branch": "master", "git_sha": "e6c5689c1d4c7f255a7cc042b0a2fa25a9b3c4fa", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/controlfreec/assesssignificance/controlfreec-assesssignificance.diff" }, "controlfreec/freec": { "branch": "master", "git_sha": "7b5827ac89358ad6dd3e8f328f6d1427d7f14a68", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "controlfreec/freec2bed": { "branch": "master", "git_sha": "0c7fd5488d43188ee801c800461d259389d34c19", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "controlfreec/freec2circos": { "branch": "master", "git_sha": "b626cd7bf99db4f42de314ee8b70d1c389a7b9f4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "controlfreec/makegraph2": { "branch": "master", "git_sha": "c3f338377c177a01847eeea2f77da33ce89f92e6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "deepvariant": { "branch": "master", "git_sha": "199ba086a259e1933d6e0ab7596e4a977bbd483a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "dragmap/align": { "branch": "master", "git_sha": "dd2757cc22c5de8943fa38ba7cd6f8cc1eb65ac1", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/dragmap/align/dragmap-align.diff" }, "dragmap/hashtable": { "branch": "master", "git_sha": "ae9e01cb5e77faada314047e78423b22b4f5bbc5", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/dragmap/hashtable/dragmap-hashtable.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "3db4f8488315cd7d7cf3fcb64251f6603210e831", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": ["modules", "vcf_annotate_ensemblvep"] + "installed_by": [ + "modules", + "vcf_annotate_ensemblvep" + ] }, "fastp": { "branch": "master", "git_sha": "95cf5fe0194c7bf5cb0e3027a2eb7e7c89385080", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fastqc": { "branch": "master", "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fgbio/callmolecularconsensusreads": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fgbio/fastqtobam": { "branch": "master", "git_sha": "19f81cab3b2a08f37c4f3727ddb30c01ebf07be6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "fgbio/groupreadsbyumi": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "freebayes": { "branch": "master", "git_sha": "77978839bef6d437f21edb900b49bcbc04f9f735", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/applybqsr": { "branch": "master", "git_sha": "af273ea6618c50e82c372abe18b0a225e84fe6f7", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/applyvqsr": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/baserecalibrator": { "branch": "master", "git_sha": "8a223e11d4e6deb36484e01891eae9c1cacb5f5d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/calculatecontamination": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/cnnscorevariants": { "branch": "master", "git_sha": "60a7dbae179bcfa24c10294cc9a07423a239c19a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/estimatelibrarycomplexity": { "branch": "master", "git_sha": "1943aa60f7490c3d6740e8872e6e69122ccc8087", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/filtervarianttranches": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/gatherbqsrreports": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/gatherpileupsummaries": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/genomicsdbimport": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/genotypegvcfs": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/getpileupsummaries": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/haplotypecaller": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/intervallisttobed": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/learnreadorientationmodel": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/markduplicates": { "branch": "master", "git_sha": "194fca815cf594646e638fa5476acbcc296f1850", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergemutectstats": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "194fca815cf594646e638fa5476acbcc296f1850", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/mutect2": { "branch": "master", "git_sha": "5fd04feb37b58caa6a54d41e38c80066bdf71056", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4/variantrecalibrator": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4spark/applybqsr": { "branch": "master", "git_sha": "3b928d02096f928ef224d89f2a502afaa6e06556", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4spark/baserecalibrator": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gatk4spark/markduplicates": { "branch": "master", "git_sha": "3b928d02096f928ef224d89f2a502afaa6e06556", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gawk": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "manta/germline": { "branch": "master", "git_sha": "ebc1733b77c702f19fe42076a5edfcbaa0d84f66", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "manta/somatic": { "branch": "master", "git_sha": "ab693fbb906b3a1151ad21e270129a9d48437ab6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "manta/tumoronly": { "branch": "master", "git_sha": "8731a6221dd10fd9039e18518b390b43e14ef9ae", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "e0616fba0919adb190bfe070d17fb12d76ba3a26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "msisensorpro/msisomatic": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "msisensorpro/scan": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ngscheckmate/ncm": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["bam_ngscheckmate"] + "installed_by": [ + "bam_ngscheckmate" + ] }, "samblaster": { "branch": "master", "git_sha": "310850152f3e1dec6ba28b28e1f1cb9ab8660a49", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/bam2fq": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/collatefastq": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/convert": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/index": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/mpileup": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/applyvarcal": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/bwamem": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/dedup": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/dnamodelapply": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/dnascope": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/gvcftyper": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/haplotyper": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "sentieon/varcal": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "snpeff/download": { "branch": "master", "git_sha": "214d575774c172062924ad3564b4f66655600730", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "snpeff/snpeff": { "branch": "master", "git_sha": "2f3db6f45147ebbb56b371536e31bdf622b5bfee", - "installed_by": ["modules", "vcf_annotate_snpeff"] + "installed_by": [ + "modules", + "vcf_annotate_snpeff" + ] }, "strelka/germline": { "branch": "master", "git_sha": "e8f2c77a6e4174ee0a48d073d4cc8ff06c44bb4c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "strelka/somatic": { "branch": "master", "git_sha": "a626d7c63cb0ee675686a2f47b26cdc53266e186", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "svdb/merge": { "branch": "master", "git_sha": "ba3f3df395d2719dcef5c67189042a1dc555c701", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "09d3c8c29b31a2dfd610305b10550f0e1dbcd4a9", - "installed_by": ["modules", "vcf_annotate_snpeff"] + "installed_by": [ + "modules", + "vcf_annotate_snpeff" + ] }, "tabix/tabix": { "branch": "master", "git_sha": "9502adb23c0b97ed8e616bbbdfa73b4585aec9a1", - "installed_by": ["modules", "vcf_annotate_ensemblvep"] + "installed_by": [ + "modules", + "vcf_annotate_ensemblvep" + ] }, "tiddit/sv": { "branch": "master", "git_sha": "6af4979ee1a57c986102175d9e1bb7ab834f3ae8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "untar": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "vcftools": { "branch": "master", "git_sha": "624ecdc43b72e0a45bf05d9b57215d18dcd538f8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -501,35 +699,47 @@ "bam_ngscheckmate": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "vcf_annotate_ensemblvep": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "vcf_annotate_snpeff": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/annotate/bcftools-annotate.diff b/modules/nf-core/bcftools/annotate/bcftools-annotate.diff index 34a9e2c381..d15bf86b54 100644 --- a/modules/nf-core/bcftools/annotate/bcftools-annotate.diff +++ b/modules/nf-core/bcftools/annotate/bcftools-annotate.diff @@ -2,13 +2,13 @@ Changes in module 'nf-core/bcftools/annotate' --- modules/nf-core/bcftools/annotate/main.nf +++ modules/nf-core/bcftools/annotate/main.nf @@ -8,7 +8,10 @@ - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: - tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(header_lines) + tuple val(meta), path(input) + path annotations -+ path annotations_index ++ path annotations_index + path header_lines output: diff --git a/modules/nf-core/bcftools/annotate/environment.yml b/modules/nf-core/bcftools/annotate/environment.yml index e0abc8d23c..3d4e337992 100644 --- a/modules/nf-core/bcftools/annotate/environment.yml +++ b/modules/nf-core/bcftools/annotate/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::bcftools=1.18 + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/annotate/main.nf b/modules/nf-core/bcftools/annotate/main.nf index f9437cccb4..39c86bbe43 100644 --- a/modules/nf-core/bcftools/annotate/main.nf +++ b/modules/nf-core/bcftools/annotate/main.nf @@ -4,13 +4,13 @@ process BCFTOOLS_ANNOTATE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: tuple val(meta), path(input) path annotations - path annotations_index + path annotations_index path header_lines output: diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test b/modules/nf-core/bcftools/annotate/tests/main.nf.test index 9abf9475eb..609102f836 100644 --- a/modules/nf-core/bcftools/annotate/tests/main.nf.test +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test @@ -16,12 +16,12 @@ nextflow_process { when { process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), - [] + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), + [] ] """ } @@ -47,11 +47,11 @@ nextflow_process { when { process { """ - vcf = Channel.of([ [ id:'test', single_end:false ], // meta map - file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + vcf = Channel.of([ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), [], [], - [] + [] ]) header = Channel.of( @@ -85,12 +85,12 @@ nextflow_process { when { process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), - file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), - [] + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test2_vcf_gz_tbi'], checkIfExists: true), + [] ] """ } @@ -99,10 +99,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match("stub") } + { assert snapshot(process.out).match() } ) } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap index 72b0687841..359ab38dc1 100644 --- a/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap @@ -11,14 +11,14 @@ ] ], [ - "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + "versions.yml:md5,ea53f98610d42597cf384ff1fa3eb204" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "24.04.2" }, - "timestamp": "2024-05-03T09:21:58.526449656" + "timestamp": "2024-06-03T11:39:40.696827933" }, "vcf": { "content": [ @@ -32,16 +32,16 @@ ] ], [ - "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + "versions.yml:md5,ea53f98610d42597cf384ff1fa3eb204" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "24.04.2" }, - "timestamp": "2024-05-02T16:47:47.127427579" + "timestamp": "2024-06-03T11:39:29.215629503" }, - "stub": { + "sarscov2 - [vcf, tbi, vcf2, tbi2, []] - stub": { "content": [ { "0": [ @@ -54,7 +54,7 @@ ] ], "1": [ - "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + "versions.yml:md5,ea53f98610d42597cf384ff1fa3eb204" ], "vcf": [ [ @@ -66,14 +66,14 @@ ] ], "versions": [ - "versions.yml:md5,ea2b798edb5c1c0d46938f313a97a901" + "versions.yml:md5,ea53f98610d42597cf384ff1fa3eb204" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "24.04.2" }, - "timestamp": "2024-05-02T16:43:43.707474961" + "timestamp": "2024-06-03T11:39:52.630055205" } } \ No newline at end of file From a0eee844c302b173b9bfefc5ac992a9fd46e9243 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 5 Jun 2024 08:46:26 +0000 Subject: [PATCH 067/109] prettier --- modules.json | 418 +++++++++++++-------------------------------------- 1 file changed, 104 insertions(+), 314 deletions(-) diff --git a/modules.json b/modules.json index a1b981cf1a..a6875ed999 100644 --- a/modules.json +++ b/modules.json @@ -8,689 +8,491 @@ "ascat": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/annotate": { "branch": "master", "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/bcftools/annotate/bcftools-annotate.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/mpileup": { "branch": "master", "git_sha": "e7df38a545d7d72083eededabd8849f731a01502", - "installed_by": [ - "bam_ngscheckmate" - ] + "installed_by": ["bam_ngscheckmate"] }, "bcftools/sort": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/stats": { "branch": "master", "git_sha": "618364f55cb88f6c283f6c6c45c24d5f9f08f998", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwa/index": { "branch": "master", "git_sha": "6278bf9afd4a4b2d00fa6052250e73da3d91546f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwa/mem": { "branch": "master", "git_sha": "b97197968ac12dde2463fa54541f6350c46f2035", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "7081e04c18de9480948d34513a1c1e2d0fa9126d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", "git_sha": "3afb95b2e15fc4a2347470255a7ef654f650c8ec", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "9437e6053dccf4aafa022bfd6e7e9de67e625af8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/fastq": { "branch": "master", "git_sha": "0997b47c93c06b49aa7b3fefda87e728312cf2ca", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/antitarget": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/batch": { "branch": "master", "git_sha": "f53b071421340e6fac0806c86ba030e578e94826", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/call": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/export": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/genemetrics": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cnvkit/reference": { "branch": "master", "git_sha": "a64788f5ad388f1d2ac5bd5f1f3f8fc81476148c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "controlfreec/assesssignificance": { "branch": "master", "git_sha": "e6c5689c1d4c7f255a7cc042b0a2fa25a9b3c4fa", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/controlfreec/assesssignificance/controlfreec-assesssignificance.diff" }, "controlfreec/freec": { "branch": "master", "git_sha": "7b5827ac89358ad6dd3e8f328f6d1427d7f14a68", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "controlfreec/freec2bed": { "branch": "master", "git_sha": "0c7fd5488d43188ee801c800461d259389d34c19", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "controlfreec/freec2circos": { "branch": "master", "git_sha": "b626cd7bf99db4f42de314ee8b70d1c389a7b9f4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "controlfreec/makegraph2": { "branch": "master", "git_sha": "c3f338377c177a01847eeea2f77da33ce89f92e6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "deepvariant": { "branch": "master", "git_sha": "199ba086a259e1933d6e0ab7596e4a977bbd483a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "dragmap/align": { "branch": "master", "git_sha": "dd2757cc22c5de8943fa38ba7cd6f8cc1eb65ac1", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/dragmap/align/dragmap-align.diff" }, "dragmap/hashtable": { "branch": "master", "git_sha": "ae9e01cb5e77faada314047e78423b22b4f5bbc5", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/dragmap/hashtable/dragmap-hashtable.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "3db4f8488315cd7d7cf3fcb64251f6603210e831", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": [ - "modules", - "vcf_annotate_ensemblvep" - ] + "installed_by": ["modules", "vcf_annotate_ensemblvep"] }, "fastp": { "branch": "master", "git_sha": "95cf5fe0194c7bf5cb0e3027a2eb7e7c89385080", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fastqc": { "branch": "master", "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fgbio/callmolecularconsensusreads": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fgbio/fastqtobam": { "branch": "master", "git_sha": "19f81cab3b2a08f37c4f3727ddb30c01ebf07be6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "fgbio/groupreadsbyumi": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "freebayes": { "branch": "master", "git_sha": "77978839bef6d437f21edb900b49bcbc04f9f735", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/applybqsr": { "branch": "master", "git_sha": "af273ea6618c50e82c372abe18b0a225e84fe6f7", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/applyvqsr": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/baserecalibrator": { "branch": "master", "git_sha": "8a223e11d4e6deb36484e01891eae9c1cacb5f5d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/calculatecontamination": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/cnnscorevariants": { "branch": "master", "git_sha": "60a7dbae179bcfa24c10294cc9a07423a239c19a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/estimatelibrarycomplexity": { "branch": "master", "git_sha": "1943aa60f7490c3d6740e8872e6e69122ccc8087", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/filtervarianttranches": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/gatherbqsrreports": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/gatherpileupsummaries": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/genomicsdbimport": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/genotypegvcfs": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/getpileupsummaries": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/haplotypecaller": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/intervallisttobed": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/learnreadorientationmodel": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/markduplicates": { "branch": "master", "git_sha": "194fca815cf594646e638fa5476acbcc296f1850", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergemutectstats": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mergevcfs": { "branch": "master", "git_sha": "194fca815cf594646e638fa5476acbcc296f1850", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/mutect2": { "branch": "master", "git_sha": "5fd04feb37b58caa6a54d41e38c80066bdf71056", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4/variantrecalibrator": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4spark/applybqsr": { "branch": "master", "git_sha": "3b928d02096f928ef224d89f2a502afaa6e06556", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4spark/baserecalibrator": { "branch": "master", "git_sha": "d742e3143f2ccb8853c29b35cfcf50b5e5026980", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gatk4spark/markduplicates": { "branch": "master", "git_sha": "3b928d02096f928ef224d89f2a502afaa6e06556", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gawk": { "branch": "master", "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "manta/germline": { "branch": "master", "git_sha": "ebc1733b77c702f19fe42076a5edfcbaa0d84f66", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "manta/somatic": { "branch": "master", "git_sha": "ab693fbb906b3a1151ad21e270129a9d48437ab6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "manta/tumoronly": { "branch": "master", "git_sha": "8731a6221dd10fd9039e18518b390b43e14ef9ae", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "e0616fba0919adb190bfe070d17fb12d76ba3a26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "msisensorpro/msisomatic": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "msisensorpro/scan": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ngscheckmate/ncm": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "bam_ngscheckmate" - ] + "installed_by": ["bam_ngscheckmate"] }, "samblaster": { "branch": "master", "git_sha": "310850152f3e1dec6ba28b28e1f1cb9ab8660a49", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/bam2fq": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/collatefastq": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/convert": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/index": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/mpileup": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "04fbbc7c43cebc0b95d5b126f6d9fe4effa33519", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/applyvarcal": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/bwamem": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/dedup": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/dnamodelapply": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/dnascope": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/gvcftyper": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/haplotyper": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "sentieon/varcal": { "branch": "master", "git_sha": "e809c6b078d5343bdf8b5b2b78483096a2b5a973", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "snpeff/download": { "branch": "master", "git_sha": "214d575774c172062924ad3564b4f66655600730", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "snpeff/snpeff": { "branch": "master", "git_sha": "2f3db6f45147ebbb56b371536e31bdf622b5bfee", - "installed_by": [ - "modules", - "vcf_annotate_snpeff" - ] + "installed_by": ["modules", "vcf_annotate_snpeff"] }, "strelka/germline": { "branch": "master", "git_sha": "e8f2c77a6e4174ee0a48d073d4cc8ff06c44bb4c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "strelka/somatic": { "branch": "master", "git_sha": "a626d7c63cb0ee675686a2f47b26cdc53266e186", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", "git_sha": "ba3f3df395d2719dcef5c67189042a1dc555c701", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "09d3c8c29b31a2dfd610305b10550f0e1dbcd4a9", - "installed_by": [ - "modules", - "vcf_annotate_snpeff" - ] + "installed_by": ["modules", "vcf_annotate_snpeff"] }, "tabix/tabix": { "branch": "master", "git_sha": "9502adb23c0b97ed8e616bbbdfa73b4585aec9a1", - "installed_by": [ - "modules", - "vcf_annotate_ensemblvep" - ] + "installed_by": ["modules", "vcf_annotate_ensemblvep"] }, "tiddit/sv": { "branch": "master", "git_sha": "6af4979ee1a57c986102175d9e1bb7ab834f3ae8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "untar": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "vcftools": { "branch": "master", "git_sha": "624ecdc43b72e0a45bf05d9b57215d18dcd538f8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -699,47 +501,35 @@ "bam_ngscheckmate": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "vcf_annotate_ensemblvep": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "vcf_annotate_snpeff": { "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 3ef090637fc56cba3dcc5d1aed288cd00212be2f Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 5 Jun 2024 09:18:57 +0000 Subject: [PATCH 068/109] Updating bcftools/concat and bcftools/mpileup to v1.20 --- modules.json | 4 +- .../nf-core/bcftools/concat/environment.yml | 2 +- modules/nf-core/bcftools/concat/main.nf | 4 +- .../bcftools/concat/tests/main.nf.test.snap | 24 +++---- .../nf-core/bcftools/mpileup/environment.yml | 2 +- modules/nf-core/bcftools/mpileup/main.nf | 4 +- .../bcftools/mpileup/tests/main.nf.test.snap | 72 +++++++++---------- 7 files changed, 56 insertions(+), 56 deletions(-) diff --git a/modules.json b/modules.json index a6875ed999..c5e4bd48af 100644 --- a/modules.json +++ b/modules.json @@ -18,12 +18,12 @@ }, "bcftools/concat": { "branch": "master", - "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", + "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", "installed_by": ["modules"] }, "bcftools/mpileup": { "branch": "master", - "git_sha": "e7df38a545d7d72083eededabd8849f731a01502", + "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", "installed_by": ["bam_ngscheckmate"] }, "bcftools/sort": { diff --git a/modules/nf-core/bcftools/concat/environment.yml b/modules/nf-core/bcftools/concat/environment.yml index ff0200dfab..6544e949c8 100644 --- a/modules/nf-core/bcftools/concat/environment.yml +++ b/modules/nf-core/bcftools/concat/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::bcftools=1.18 + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index d64640b32d..092d2c62e1 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -4,8 +4,8 @@ process BCFTOOLS_CONCAT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: tuple val(meta), path(vcfs), path(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 index 90d3fc068e..bef0ff05be 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -11,7 +11,7 @@ ] ], "1": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ], "vcf": [ [ @@ -22,15 +22,15 @@ ] ], "versions": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T13:22:49.766749302" + "timestamp": "2024-05-31T15:16:00.637917586" }, "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]]": { "content": [ @@ -44,7 +44,7 @@ ] ], "1": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ], "vcf": [ [ @@ -55,15 +55,15 @@ ] ], "versions": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T13:22:41.119912312" + "timestamp": "2024-05-31T15:15:55.750767959" }, "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { "content": [ @@ -77,7 +77,7 @@ ] ], "1": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ], "vcf": [ [ @@ -88,14 +88,14 @@ ] ], "versions": [ - "versions.yml:md5,24ae05eb858733b40fbd3f89743a6d09" + "versions.yml:md5,c6e19f105510a46af1c5da9064e2e659" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T13:22:59.90466392" + "timestamp": "2024-05-31T15:16:05.717072932" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/mpileup/environment.yml b/modules/nf-core/bcftools/mpileup/environment.yml index 114390be1f..7e479383ba 100644 --- a/modules/nf-core/bcftools/mpileup/environment.yml +++ b/modules/nf-core/bcftools/mpileup/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::bcftools=1.18 + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/mpileup/main.nf b/modules/nf-core/bcftools/mpileup/main.nf index 6bf8bc2dc2..82e14df7a7 100644 --- a/modules/nf-core/bcftools/mpileup/main.nf +++ b/modules/nf-core/bcftools/mpileup/main.nf @@ -4,8 +4,8 @@ process BCFTOOLS_MPILEUP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: tuple val(meta), path(bam), path(intervals) diff --git a/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap index 8b8d5eabbd..a772689882 100644 --- a/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap @@ -5,9 +5,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:45.172966" + "timestamp": "2024-06-03T11:45:32.654601222" }, "bam_bed_fasta_false_stub.vcf.gz": { "content": [ @@ -15,9 +15,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:57.815085" + "timestamp": "2024-06-03T11:46:19.532461322" }, "bam_fasta_false_stub.vcf.gz.tbi": { "content": [ @@ -25,9 +25,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:39:15.731277" + "timestamp": "2024-06-03T11:44:44.944919263" }, "bam_bed_fasta_false_stub.bcftools_stats.txt": { "content": [ @@ -55,9 +55,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:45.146525" + "timestamp": "2024-06-03T11:45:32.596363535" }, "bam_bed_fasta_true_stub.vcf.gz": { "content": [ @@ -65,21 +65,21 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:39.42754" + "timestamp": "2024-06-03T11:45:10.034842649" }, "bam_fasta_false_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:39:10.137483" + "timestamp": "2024-05-31T15:14:23.424052671" }, "bam_fasta_false_stub.bcftools_stats.txt": { "content": [ @@ -94,14 +94,14 @@ "bam_bed_fasta_false_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:37:51.772936" + "timestamp": "2024-05-31T15:14:44.101963218" }, "bam_bed_fasta_false.vcf.gz": { "content": [ @@ -109,21 +109,21 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:51.72798" + "timestamp": "2024-06-03T11:45:57.39416797" }, "bam_bed_fasta_true_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:37:45.20135" + "timestamp": "2024-05-31T15:14:38.630394619" }, "bam_fasta_false.vcf.gz": { "content": [ @@ -131,9 +131,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:39:10.051991" + "timestamp": "2024-06-03T11:44:21.337711533" }, "bam_fasta_false.bcftools_stats.txt": { "content": [ @@ -161,9 +161,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:57.832271" + "timestamp": "2024-06-03T11:46:19.593445488" }, "bam_bed_fasta_false.vcf.gz.tbi": { "content": [ @@ -171,9 +171,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:51.748389" + "timestamp": "2024-06-03T11:45:57.444615176" }, "bam_fasta_false_stub.vcf.gz": { "content": [ @@ -181,9 +181,9 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:39:15.709802" + "timestamp": "2024-06-03T11:44:44.888373837" }, "bam_bed_fasta_true_stub.bcftools_stats.txt": { "content": [ @@ -201,21 +201,21 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:39:10.108027" + "timestamp": "2024-06-03T11:44:21.401424919" }, "bam_fasta_false_stub_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:39:15.770612" + "timestamp": "2024-05-31T15:14:28.530439931" }, "bam_bed_fasta_true.bcftools_stats.txt": { "content": [ @@ -233,21 +233,21 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-04-22T18:37:39.442077" + "timestamp": "2024-06-03T11:45:10.101920455" }, "bam_bed_fasta_false_stub_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:37:57.868309" + "timestamp": "2024-05-31T15:14:49.139377519" }, "bam_bed_fasta_true.mpileup.gz": { "content": [ @@ -262,13 +262,13 @@ "bam_bed_fasta_true_stub_versions": { "content": [ [ - "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + "versions.yml:md5,6af9a67cd12c721ccc9702c17bc2f3a5" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-22T18:37:39.470988" + "timestamp": "2024-05-31T15:14:33.646218607" } } \ No newline at end of file From d630cb7adb1898c09d78a88ec9604496075002a6 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 5 Jun 2024 09:41:09 +0000 Subject: [PATCH 069/109] Updating bcftools/sort and bcftools/stats to v1.20 --- modules.json | 4 +- modules/nf-core/bcftools/sort/environment.yml | 2 +- modules/nf-core/bcftools/sort/main.nf | 4 +- .../bcftools/sort/tests/main.nf.test.snap | 16 ++-- .../nf-core/bcftools/stats/environment.yml | 4 +- modules/nf-core/bcftools/stats/main.nf | 4 +- .../nf-core/bcftools/stats/tests/main.nf.test | 10 +- .../bcftools/stats/tests/main.nf.test.snap | 96 +++++++++++-------- 8 files changed, 80 insertions(+), 60 deletions(-) diff --git a/modules.json b/modules.json index c5e4bd48af..bb5710bd7d 100644 --- a/modules.json +++ b/modules.json @@ -28,12 +28,12 @@ }, "bcftools/sort": { "branch": "master", - "git_sha": "b42fec6f7c6e5d0716685cabb825ef6bf6e386b5", + "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", "installed_by": ["modules"] }, "bcftools/stats": { "branch": "master", - "git_sha": "618364f55cb88f6c283f6c6c45c24d5f9f08f998", + "git_sha": "a5ba4d59c2b248c0379b0f8aeb4e7e754566cd1f", "installed_by": ["modules"] }, "bwa/index": { diff --git a/modules/nf-core/bcftools/sort/environment.yml b/modules/nf-core/bcftools/sort/environment.yml index 89cf911d61..2295ecfd17 100644 --- a/modules/nf-core/bcftools/sort/environment.yml +++ b/modules/nf-core/bcftools/sort/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::bcftools=1.18 + - bioconda::bcftools=1.20 diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 246148d613..d5e3ce9af7 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -4,8 +4,8 @@ process BCFTOOLS_SORT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: tuple val(meta), path(vcf) diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap index 6200cc42e0..3f478d19d6 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -11,7 +11,7 @@ ] ], "1": [ - "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + "versions.yml:md5,2c9f26ca356ef71199c3a7d1742974cb" ], "vcf": [ [ @@ -22,15 +22,15 @@ ] ], "versions": [ - "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + "versions.yml:md5,2c9f26ca356ef71199c3a7d1742974cb" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "24.04.2" }, - "timestamp": "2024-05-02T16:55:21.237927554" + "timestamp": "2024-06-03T11:54:39.200647026" }, "sarscov2 - vcf - stub": { "content": [ @@ -44,7 +44,7 @@ ] ], "1": [ - "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + "versions.yml:md5,2c9f26ca356ef71199c3a7d1742974cb" ], "vcf": [ [ @@ -55,14 +55,14 @@ ] ], "versions": [ - "versions.yml:md5,622bd32d4ff0fac3360cd534ae0f0168" + "versions.yml:md5,2c9f26ca356ef71199c3a7d1742974cb" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "24.03.0" + "nextflow": "24.04.2" }, - "timestamp": "2024-05-03T12:32:50.506309198" + "timestamp": "2024-06-03T11:54:55.594155692" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/stats/environment.yml b/modules/nf-core/bcftools/stats/environment.yml index 7bb40dc0be..128fe20422 100644 --- a/modules/nf-core/bcftools/stats/environment.yml +++ b/modules/nf-core/bcftools/stats/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::bcftools=1.18 - - bioconda::htslib=1.18 + - bioconda::bcftools=1.20 + - bioconda::htslib=1.20 diff --git a/modules/nf-core/bcftools/stats/main.nf b/modules/nf-core/bcftools/stats/main.nf index ffa1df6430..20e5da7713 100644 --- a/modules/nf-core/bcftools/stats/main.nf +++ b/modules/nf-core/bcftools/stats/main.nf @@ -4,8 +4,8 @@ process BCFTOOLS_STATS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': - 'biocontainers/bcftools:1.18--h8b25389_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.20--h8b25389_0': + 'biocontainers/bcftools:1.20--h8b25389_0' }" input: tuple val(meta), path(vcf), path(tbi) diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test b/modules/nf-core/bcftools/stats/tests/main.nf.test index f027f6b12f..be618b0b17 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test @@ -29,7 +29,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.version).match("version") }, + { assert snapshot(process.out.versions).match("versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } @@ -57,7 +57,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.version).match("regions_version") }, + { assert snapshot(process.out.versions).match("regions_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } @@ -86,7 +86,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.version).match("targets_version") }, + { assert snapshot(process.out.versions).match("targets_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } @@ -114,7 +114,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.version).match("exon_version") }, + { assert snapshot(process.out.versions).match("exon_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } @@ -143,7 +143,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.version).match("ref_version") }, + { assert snapshot(process.out.versions).match("ref_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap index 30691c32f0..cd8cff6d2b 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap @@ -2,7 +2,7 @@ "sarscov2 - vcf_gz - reference": { "content": [ [ - "# This file was produced by bcftools stats (1.18+htslib-1.18) and can be plotted using plot-vcfstats.", + "# This file was produced by bcftools stats (1.20+htslib-1.20) and can be plotted using plot-vcfstats.", "# The command line was:\tbcftools stats --fasta-ref genome.fasta test.vcf.gz", "#", "# Definition of sets:", @@ -12,14 +12,14 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T11:46:24.34147" + "timestamp": "2024-05-31T18:14:35.506777837" }, "sarscov2 - vcf_gz - exons": { "content": [ [ - "# This file was produced by bcftools stats (1.18+htslib-1.18) and can be plotted using plot-vcfstats.", + "# This file was produced by bcftools stats (1.20+htslib-1.20) and can be plotted using plot-vcfstats.", "# The command line was:\tbcftools stats --exons exons.tsv.gz test.vcf.gz", "#", "# Definition of sets:", @@ -27,32 +27,28 @@ "ID\t0\ttest.vcf.gz" ] ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.0" - }, - "timestamp": "2024-03-20T11:46:18.378716" - }, - "exon_version": { - "content": null, "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T10:02:02.530551189" + "timestamp": "2024-05-31T18:14:30.57486244" }, - "ref_version": { - "content": null, + "versions": { + "content": [ + [ + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" + ] + ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T10:02:06.885381764" + "timestamp": "2024-05-31T18:16:27.637515559" }, "sarscov2 - vcf_gz - targets": { "content": [ [ - "# This file was produced by bcftools stats (1.18+htslib-1.18) and can be plotted using plot-vcfstats.", + "# This file was produced by bcftools stats (1.20+htslib-1.20) and can be plotted using plot-vcfstats.", "# The command line was:\tbcftools stats --targets-file test2.targets.tsv.gz test.vcf.gz", "#", "# Definition of sets:", @@ -62,17 +58,33 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.0" + "nextflow": "23.10.1" + }, + "timestamp": "2024-05-31T18:14:25.732997442" + }, + "regions_versions": { + "content": [ + [ + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T11:46:12.48194" + "timestamp": "2024-05-31T18:16:32.559884458" }, - "targets_version": { - "content": null, + "targets_versions": { + "content": [ + [ + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" + ] + ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T10:01:58.412147664" + "timestamp": "2024-05-31T18:16:37.512009805" }, "sarscov2 - vcf_gz - stub": { "content": [ @@ -86,7 +98,7 @@ ] ], "1": [ - "versions.yml:md5,5909d472a49b0aa2bfbbb1094c129e48" + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" ], "stats": [ [ @@ -97,36 +109,44 @@ ] ], "versions": [ - "versions.yml:md5,5909d472a49b0aa2bfbbb1094c129e48" + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-03-19T16:26:21.450513562" + "timestamp": "2024-06-03T11:57:09.614976125" }, - "version": { - "content": null, + "exon_versions": { + "content": [ + [ + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" + ] + ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T09:57:04.317347424" + "timestamp": "2024-05-31T18:16:42.347397266" }, - "regions_version": { - "content": null, + "ref_versions": { + "content": [ + [ + "versions.yml:md5,17cdf9d1ad31f6b1f5935dfcc9fe7b9a" + ] + ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T10:01:54.349855366" + "timestamp": "2024-05-31T18:16:47.26823622" }, "sarscov2 - vcf_gz": { "content": [ [ - "# This file was produced by bcftools stats (1.18+htslib-1.18) and can be plotted using plot-vcfstats.", + "# This file was produced by bcftools stats (1.20+htslib-1.20) and can be plotted using plot-vcfstats.", "# The command line was:\tbcftools stats test.vcf.gz", "#", "# Definition of sets:", @@ -136,14 +156,14 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T11:46:01.862297" + "timestamp": "2024-05-31T18:16:27.670416598" }, "sarscov2 - vcf_gz - regions": { "content": [ [ - "# This file was produced by bcftools stats (1.18+htslib-1.18) and can be plotted using plot-vcfstats.", + "# This file was produced by bcftools stats (1.20+htslib-1.20) and can be plotted using plot-vcfstats.", "# The command line was:\tbcftools stats --regions-file test3.vcf.gz test.vcf.gz", "#", "# Definition of sets:", @@ -153,8 +173,8 @@ ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.0" + "nextflow": "23.10.1" }, - "timestamp": "2024-03-20T11:46:07.296109" + "timestamp": "2024-05-31T18:14:20.759094062" } } \ No newline at end of file From 4bc45f23bf9be6e6af53bd26116947b393ffa85c Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 5 Jun 2024 10:02:39 +0000 Subject: [PATCH 070/109] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92ced5cc92..0ea65ba007 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1518](https://github.com/nf-core/sarek/pull/1518) - Sync `TEMPLATE` with `tools` `2.14.1` - [#1521](https://github.com/nf-core/sarek/pull/1521) - Minor code refactoring to simplify syntax in args handling - [#1552](https://github.com/nf-core/sarek/pull/1552) - Update samtools to v1.20 +- [#1553](https://github.com/nf-core/sarek/pull/1553) - Update bcftools to v1.20 ### Fixed @@ -34,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ---------- | ----------- | ----------- | +| `bcftools` | 1.18 | 1.20 | | `samtools` | 1.19.2 | 1.20 | ### Modules / Subworkflows From 62011ed742cbfb1d72a47226ab3c2c48e706a78d Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 6 Jun 2024 14:24:15 +0000 Subject: [PATCH 071/109] Disabling nf-test for ngscheckmate/ncm --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3b9513e56..4da7a673e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -247,6 +247,7 @@ jobs: - tags: "gawk" - tags: "mosdepth" - tags: "multiqc" + - tags: "ngscheckmate/ncm" - tags: "samblaster" - tags: "samtools/convert" - tags: "samtools/mpileup" From 6cc5d19adb21618fd3dc7607b1305525135f25a4 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 7 Jun 2024 13:49:33 +0200 Subject: [PATCH 072/109] fix linting --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4da7a673e9..672abf89bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -247,7 +247,7 @@ jobs: - tags: "gawk" - tags: "mosdepth" - tags: "multiqc" - - tags: "ngscheckmate/ncm" + - tags: "ngscheckmate/ncm" - tags: "samblaster" - tags: "samtools/convert" - tags: "samtools/mpileup" From 219267a2dec42c3e1399e39c68375cf46c14a6a9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 7 Jun 2024 13:58:25 +0200 Subject: [PATCH 073/109] add test.tap and test.yml --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 9bd5a6ee00..c807bd5d3f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ testing* .nf-test* .nf-test/ test-datasets/ +test.tap +test.xml From 51390a321710940d7ffbf7dd1f572fd30190b21a Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 7 Jun 2024 13:59:36 +0200 Subject: [PATCH 074/109] disable tests with clashing configs --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 672abf89bb..c48d11e7c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -224,7 +224,9 @@ jobs: - tags: "bwamem2/mem" - tags: "cat/cat" - tags: "cat/fastq" + - tags: "cnvkit/antitarget" - tags: "cnvkit/batch" + - tags: "cnvkit/reference" - tags: "deepvariant" - tags: "dragmap/align" - tags: "dragmap/hashtable" From 7a8d4db030f5534c90bdf4be5f8a6c8238bc829d Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 10 Jun 2024 14:11:28 +0000 Subject: [PATCH 075/109] Adding some ticks around some commands --- docs/usage.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index f39e327bb1..d12361f9fb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -831,9 +831,9 @@ For GATK.GRCh38 the links for each reference file and the corresponding processe | ascat_loci | ASCAT | https://www.dropbox.com/s/80cq0qgao8l1inj/G1000_loci_hg38.zip | https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS | | ascat_loci_gc | ASCAT | https://www.dropbox.com/s/80cq0qgao8l1inj/G1000_loci_hg38.zip | https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS | | ascat_loci_rt | ASCAT | https://www.dropbox.com/s/xlp99uneqh6nh6p/RT_G1000_hg38.zip | https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS | -| bwa | bwa-mem | bwa index -p bwa/${fasta.baseName} $fasta | | -| bwamem2 | bwa-mem2 | bwa-mem2 index -p bwamem2/${fasta} $fasta | | -| dragmap | DragMap | dragen-os --build-hash-table true --ht-reference $fasta --output-directory dragmap | | +| bwa | bwa-mem | `bwa index -p bwa/${fasta.baseName} $fasta` | | +| bwamem2 | bwa-mem2 | `bwa-mem2 index -p bwamem2/${fasta} $fasta` | | +| dragmap | DragMap | `dragen-os --build-hash-table true --ht-reference $fasta --output-directory dragmap` | | | dbsnp | Baserecalibrator, ControlFREEC, GenotypeGVCF, HaplotypeCaller | [GATKBundle](https://console.cloud.google.com/storage/browser/_details/genomics-public-data/resources/broad/hg38/v0/) | https://gatk.broadinstitute.org/hc/en-us/articles/360035890811-Resource-bundle | | dbsnp_tbi | Baserecalibrator, ControlFREEC, GenotypeGVCF, HaplotypeCaller | [GATKBundle](https://console.cloud.google.com/storage/browser/_details/genomics-public-data/resources/broad/hg38/v0/) | | | dict | Baserecalibrator(Spark), CNNScoreVariant, EstimateLibraryComplexity, FilterMutectCalls, FilterVariantTranches, GatherPileupSummaries,GenotypeGVCF, GetPileupSummaries, HaplotypeCaller, MarkDulpicates(Spark), MergeVCFs, Mutect2, Variantrecalibrator | [GATKBundle](https://console.cloud.google.com/storage/browser/_details/genomics-public-data/resources/broad/hg38/v0/) | https://gatk.broadinstitute.org/hc/en-us/articles/360035890811-Resource-bundle | From a2ecdcb98c0c28f22ba45f369190614de3e1c473 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 10 Jun 2024 14:15:49 +0000 Subject: [PATCH 076/109] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c231616998..25b58f0f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1541](https://github.com/nf-core/sarek/pull/1541) - Getting bam and bai published in the same folder - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` - [#1547](https://github.com/nf-core/sarek/pull/1547) - Correct typo in help text in nextflow_schema.json +- [#1556](https://github.com/nf-core/sarek/pull/1556) - Fix display of some commands in `docs/usage.md` ### Removed From 9504c26bf049352a1713d9cfc81f07ba43a981a1 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 10 Jun 2024 14:47:16 +0000 Subject: [PATCH 077/109] Reduce code-duplication by introducing function addReadgroupToMeta --- workflows/sarek/main.nf | 52 +++++++++++++---------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 2f372f4f00..1d4cc8fb11 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -163,34 +163,12 @@ workflow SAREK { } // Two fastq.gz-files - fastq_gz = input_sample_type.fastq_gz.map { meta, files -> - def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' - - // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: - def flowcell = flowcellLaneFromFastq(files[0]) - // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? - - // Don't use a random element for ID, it breaks resuming - def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" - meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] - return [ meta, files ] - } + fastq_gz = input_sample_type.fastq_gz.map { meta, files -> addReadgroupToMeta(meta, files) } // Just one fastq.gz.spring-file with both R1 and R2 fastq_gz_pair_from_spring = SPRING_DECOMPRESS_TO_FQ_PAIR(input_sample_type.one_fastq_gz_spring) - one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> - def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' - - // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: - def flowcell = flowcellLaneFromFastq(files[0]) - // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? - - // Don't use a random element for ID, it breaks resuming - def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" - meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] - return [ meta, files ] - } + one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> addReadgroupToMeta(meta, files) } // Two fastq.gz.spring-files - one for R1 and one for R2 R1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) @@ -198,18 +176,7 @@ workflow SAREK { two_fastq_gz_from_spring = R1_fastq_gz_from_spring.fastq.join(R2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} - two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> - def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' - - // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: - def flowcell = flowcellLaneFromFastq(files[0]) - // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? - - // Don't use a random element for ID, it breaks resuming - def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" - meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] - return [ meta, files ] - } + two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> addReadgroupToMeta(meta, files) } // Convert any bam input to fastq // fasta are not needed when converting bam to fastq -> [ id:"fasta" ], [] @@ -966,6 +933,19 @@ workflow SAREK { FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +// Add readgroup to meta and remove lane +def addReadgroupToMeta(meta, files) { + def CN = params.seq_center ? "CN:${params.seq_center}\\t" : '' + + // Here we're assuming that fastq_1 and fastq_2 are from the same flowcell: + def flowcell = flowcellLaneFromFastq(files[0]) + // TO-DO: Would it perhaps be better to also call flowcellLaneFromFastq(files[1]) and check that we get the same flowcell-id? + + // Don't use a random element for ID, it breaks resuming + def read_group = "\"@RG\\tID:${flowcell}.${meta.sample}.${meta.lane}\\t${CN}PU:${meta.lane}\\tSM:${meta.patient}_${meta.sample}\\tLB:${meta.sample}\\tDS:${params.fasta}\\tPL:${params.seq_platform}\"" + meta = meta - meta.subMap('lane') + [read_group: read_group.toString()] + return [ meta, files ] +} // Parse first line of a FASTQ file, return the flowcell id and lane number. def flowcellLaneFromFastq(path) { // expected format: From 9b219c7c2a0a07283453b069f3895cb81555a01e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 10 Jun 2024 17:05:25 +0200 Subject: [PATCH 078/109] update version --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index a3f57e6d7e..759d72b51a 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -75,7 +75,7 @@ params { sentieon_dnascope_model = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/Sentieon/SentieonDNAscopeModel1.1.model" snpeff_db = '105' snpeff_genome = 'GRCh38' - vep_cache_version = '110' + vep_cache_version = '111' vep_genome = 'GRCh38' vep_species = 'homo_sapiens' } From 2e16ba158e43aeddada80117dfd60c8ecd1114b2 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 10 Jun 2024 16:53:23 +0000 Subject: [PATCH 079/109] Adding some docs on fastq.gz.spring-files as input --- docs/usage.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index f39e327bb1..a46b51a64e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -89,6 +89,8 @@ Output from Variant Calling and/or Annotation will be in a specific directory fo | `lane` | Lane ID, used when the `sample` is multiplexed on several lanes. Must be unique for each lane in the same sample (but does not need to be the original lane name), and must contain at least one character
    _Required for `--step mapping`_ | | `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`. | +| `spring_1` | Full path to spring-compressed, gzipped FastQ file for read 1 or for reads 1 and 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | +| `spring_2` | Full path to spring-compressed, gzipped FastQ file for read 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | | `bam` | Full path to (u)BAM file | | `bai` | Full path to BAM index file | | `cram` | Full path to CRAM file | @@ -100,7 +102,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p ### Start with mapping (`--step mapping` [default]) -This step can be started either from FastQ files or (u)BAMs. The CSV must contain at least the columns `patient`, `sample`, `lane`, and either `fastq_1/fastq_2` or `bam`. +This step can be started either from FastQ files (gzip-compressed or gzip+spring-compressed) or (u)BAMs. The CSV must contain at least the columns `patient`, `sample`, `lane`, and `fastq_1/fastq_2`, `spring_1/spring_2` or `bam`. #### Examples @@ -111,6 +113,16 @@ patient,sample,lane,fastq_1,fastq_2 patient1,test_sample,lane_1,test_1.fastq.gz,test_2.fastq.gz ``` +```bash +patient,sample,lane,spring_1 +patient1,test_sample,lane_1,test_R1_and_R2.fastq.gz.spring +``` + +```bash +patient,sample,lane,spring_1,spring_2 +patient1,test_sample,lane_1,test_R1.fastq.gz.spring,test_R2.fastq.gz.spring +``` + ```bash patient,sample,lane,bam patient1,test_sample,lane_1,test.bam From 5be6cd5e145495528ac08f9c187b97d38577a84f Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 10 Jun 2024 17:19:55 +0000 Subject: [PATCH 080/109] prettier --- docs/usage.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index a46b51a64e..27031a96c4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -80,23 +80,23 @@ Output from Variant Calling and/or Annotation will be in a specific directory fo ### Overview: Samplesheet Columns -| Column | Description | -| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `patient` | **Custom patient ID**; designates the patient/subject; must be unique for each patient, but one patient can have multiple samples (e.g. normal and tumor).
    _Required_ | -| `sex` | **Sex chromosomes of the patient**; i.e. XX, XY..., only used for Copy-Number Variation analysis in a tumor/pair
    _Optional, Default: `NA`_ | -| `status` | **Normal/tumor status of sample**; can be `0` (normal) or `1` (tumor).
    _Optional, Default: `0`_ | -| `sample` | **Custom sample ID** for each tumor and normal sample; more than one tumor sample for each subject is possible, i.e. a tumor and a relapse; samples can have multiple lanes for which the _same_ ID must be used to merge them later (see also `lane`). Sample IDs must be unique for unique biological samples
    _Required_ | -| `lane` | Lane ID, used when the `sample` is multiplexed on several lanes. Must be unique for each lane in the same sample (but does not need to be the original lane name), and must contain at least one character
    _Required for `--step mapping`_ | -| `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`. | -| `spring_1` | Full path to spring-compressed, gzipped FastQ file for read 1 or for reads 1 and 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | -| `spring_2` | Full path to spring-compressed, gzipped FastQ file for read 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | -| `bam` | Full path to (u)BAM file | -| `bai` | Full path to BAM index file | -| `cram` | Full path to CRAM file | -| `crai` | Full path to CRAM index file | -| `table` | Full path to recalibration table file | -| `vcf` | Full path to vcf file | +| Column | Description | +| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `patient` | **Custom patient ID**; designates the patient/subject; must be unique for each patient, but one patient can have multiple samples (e.g. normal and tumor).
    _Required_ | +| `sex` | **Sex chromosomes of the patient**; i.e. XX, XY..., only used for Copy-Number Variation analysis in a tumor/pair
    _Optional, Default: `NA`_ | +| `status` | **Normal/tumor status of sample**; can be `0` (normal) or `1` (tumor).
    _Optional, Default: `0`_ | +| `sample` | **Custom sample ID** for each tumor and normal sample; more than one tumor sample for each subject is possible, i.e. a tumor and a relapse; samples can have multiple lanes for which the _same_ ID must be used to merge them later (see also `lane`). Sample IDs must be unique for unique biological samples
    _Required_ | +| `lane` | Lane ID, used when the `sample` is multiplexed on several lanes. Must be unique for each lane in the same sample (but does not need to be the original lane name), and must contain at least one character
    _Required for `--step mapping`_ | +| `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`. | +| `spring_1` | Full path to spring-compressed, gzipped FastQ file for read 1 or for reads 1 and 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | +| `spring_2` | Full path to spring-compressed, gzipped FastQ file for read 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | +| `bam` | Full path to (u)BAM file | +| `bai` | Full path to BAM index file | +| `cram` | Full path to CRAM file | +| `crai` | Full path to CRAM index file | +| `table` | Full path to recalibration table file | +| `vcf` | Full path to vcf file | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. From 370219c4bab04e7669556082c366bb1fb59f49c8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 11 Jun 2024 18:27:42 +0200 Subject: [PATCH 081/109] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c231616998..127ba7e12e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1552](https://github.com/nf-core/sarek/pull/1552) - Update samtools to v1.20 - [#1545](https://github.com/nf-core/sarek/pull/1545) - Update modules - [#1553](https://github.com/nf-core/sarek/pull/1553) - Update bcftools to v1.20 +- [#1557](https://github.com/nf-core/sarek/pull/1557) - Update ENSEMBLVEP cache to 111 ### Fixed From cbb09a05a750ebb4c4e5f266a9127cf0f41613ec Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 11 Jun 2024 18:28:48 +0200 Subject: [PATCH 082/109] update vep_cache_version --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 759d72b51a..af199c5e6d 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -336,7 +336,7 @@ params { ngscheckmate_bed = "${params.igenomes_base}/genomics/homo_sapiens/genome/chr21/germlineresources/SNP_GRCh38_hg38_wChr.bed" snpeff_db = '105' snpeff_genome = 'WBcel235' - vep_cache_version = '110' + vep_cache_version = '111' vep_genome = 'WBcel235' vep_species = 'caenorhabditis_elegans' } From 08520f0697392c2563cffcb346f49f1e93745c3d Mon Sep 17 00:00:00 2001 From: Hongwei Ye Date: Wed, 12 Jun 2024 16:17:27 +0800 Subject: [PATCH 083/109] Fix: Correct vep_cache_path_full when refseq/merged option is present --- main.nf | 1 + subworkflows/local/annotation_cache_initialisation/main.nf | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 9c272624fb..92bcc47b2b 100755 --- a/main.nf +++ b/main.nf @@ -253,6 +253,7 @@ workflow NFCORE_SAREK { params.vep_species, params.vep_cache_version, params.vep_genome, + params.vep_custom_args, "Please refer to https://nf-co.re/sarek/docs/usage/#how-to-customise-snpeff-and-vep-annotation for more information.") snpeff_cache = ANNOTATION_CACHE_INITIALISATION.out.snpeff_cache diff --git a/subworkflows/local/annotation_cache_initialisation/main.nf b/subworkflows/local/annotation_cache_initialisation/main.nf index 6e35a68d50..81cc2d3fbb 100644 --- a/subworkflows/local/annotation_cache_initialisation/main.nf +++ b/subworkflows/local/annotation_cache_initialisation/main.nf @@ -39,7 +39,8 @@ workflow ANNOTATION_CACHE_INITIALISATION { if (vep_enabled) { def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" - def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}/${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 == "s3://annotation-cache/vep_cache/") { From dbb2a04050d0bb75b3b2ceac323cd98b5a2d6f9e Mon Sep 17 00:00:00 2001 From: Hongwei Ye Date: Wed, 12 Jun 2024 17:34:31 +0800 Subject: [PATCH 084/109] Fix: add vep_custom_args in ANNOTATION_CACHE_INITIALISATION's declare --- subworkflows/local/annotation_cache_initialisation/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/annotation_cache_initialisation/main.nf b/subworkflows/local/annotation_cache_initialisation/main.nf index 81cc2d3fbb..f4752b7a61 100644 --- a/subworkflows/local/annotation_cache_initialisation/main.nf +++ b/subworkflows/local/annotation_cache_initialisation/main.nf @@ -19,6 +19,7 @@ workflow ANNOTATION_CACHE_INITIALISATION { vep_species vep_cache_version vep_genome + vep_custom_args help_message main: From c051a5ed87bf234658c5486d9f7d5bb396a5b499 Mon Sep 17 00:00:00 2001 From: Hongwei Ye Date: Wed, 12 Jun 2024 17:35:29 +0800 Subject: [PATCH 085/109] Docs: update changelog and contributor --- CHANGELOG.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d0b8432c..36cb1c0cbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1542](https://github.com/nf-core/sarek/pull/1542) - Removing legacy configs of `CUSTOM_DUMPSOFTWAREVERSIONS` - [#1547](https://github.com/nf-core/sarek/pull/1547) - Correct typo in help text in nextflow_schema.json - [#1556](https://github.com/nf-core/sarek/pull/1556) - Fix display of some commands in `docs/usage.md` +- [#1563](https://github.com/nf-core/sarek/pull/1563) - Fix `vep_cache_path_full` so that `--refseq/--merged` will work for ENSEMBLVEP ### Removed diff --git a/README.md b/README.md index 2b88ec1d57..4afd61518c 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ We thank the following people for their extensive assistance in the development - [Grant Neilson](https://github.com/grantn5) - [gulfshores](https://github.com/gulfshores) - [Harshil Patel](https://github.com/drpatelh) +- [Hongwei Ye](https://github.com/YeHW) - [James A. Fellows Yates](https://github.com/jfy133) - [Jesper Eisfeldt](https://github.com/J35P312) - [Johannes Alneberg](https://github.com/alneberg) From 84abe8d80f3a43e5144e312e35d51f6915092b28 Mon Sep 17 00:00:00 2001 From: Anders Sune Pedersen <37172585+asp8200@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:54:14 +0200 Subject: [PATCH 086/109] Update workflows/sarek/main.nf Co-authored-by: Maxime U Garcia --- workflows/sarek/main.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 1d4cc8fb11..a14353803c 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -24,8 +24,6 @@ include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' -// TO-DO: Come up with better names for those "instances" of SPRING_DECOMPRESS -// TO-DO: Fix indentation // Run FASTQC include { FASTQC } from '../../modules/nf-core/fastqc/main' From b1a4ac072c6a6d09fda543c97d8bb15258e0e9cf Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 18 Jun 2024 13:06:17 +0000 Subject: [PATCH 087/109] Very minor update of usage.md --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 27031a96c4..f627ff297f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -102,7 +102,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p ### Start with mapping (`--step mapping` [default]) -This step can be started either from FastQ files (gzip-compressed or gzip+spring-compressed) or (u)BAMs. The CSV must contain at least the columns `patient`, `sample`, `lane`, and `fastq_1/fastq_2`, `spring_1/spring_2` or `bam`. +This step can be started either from FastQ files (gzip-compressed or gzip+spring-compressed) or (u)BAMs. The CSV must contain at least the columns `patient`, `sample`, `lane`, and `fastq_1/fastq_2`, `spring_1`, `spring_1/spring_2` or `bam`. #### Examples From 4a9b22ccbb4224ae3f3409f5a32b823e86846cad Mon Sep 17 00:00:00 2001 From: asp8200 Date: Tue, 18 Jun 2024 13:15:13 +0000 Subject: [PATCH 088/109] variable names all lowercase --- workflows/sarek/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 1d4cc8fb11..5330ace396 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -171,10 +171,10 @@ workflow SAREK { one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> addReadgroupToMeta(meta, files) } // Two fastq.gz.spring-files - one for R1 and one for R2 - R1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) - R2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) + r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) + r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) - two_fastq_gz_from_spring = R1_fastq_gz_from_spring.fastq.join(R2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} + two_fastq_gz_from_spring = r1_fastq_gz_from_spring.fastq.join(r2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> addReadgroupToMeta(meta, files) } From 932d6dcbe1d88cd0bcdcaa8a0386e7853f0d59c2 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 18 Jun 2024 18:59:10 +0200 Subject: [PATCH 089/109] Remove duplication --- docs/output.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/output.md b/docs/output.md index 0f49c73eda..7f8455f95d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -924,9 +924,6 @@ The plots display:
    Output files for all samples -:::note -The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. -::: **Output directory: `{outdir}/reports/fastqc/`** - `_fastqc.html` and `_fastqc.html` @@ -934,8 +931,10 @@ The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They m - `_fastqc.zip` and `_fastqc.zip` - Zip archive containing the [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) report, tab-delimited data file and plot images -> **NB:** The FastQC plots displayed in the [MultiQC](https://multiqc.info/) report shows _untrimmed_ reads. -> They may contain adapter sequence and potentially regions with low quality. +:::note +The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. +They may contain adapter sequence and potentially regions with low quality. +:::
    From feb775b01d09c62c5502de119d78da9f0c644e93 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 19 Jun 2024 11:22:08 +0200 Subject: [PATCH 090/109] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36cb1c0cbc..254ca8d763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1547](https://github.com/nf-core/sarek/pull/1547) - Correct typo in help text in nextflow_schema.json - [#1556](https://github.com/nf-core/sarek/pull/1556) - Fix display of some commands in `docs/usage.md` - [#1563](https://github.com/nf-core/sarek/pull/1563) - Fix `vep_cache_path_full` so that `--refseq/--merged` will work for ENSEMBLVEP +- [#1570](https://github.com/nf-core/sarek/pull/1570) - Remove duplicated notes in FASTQC output docs ### Removed From 7a63a852e21d7f52ea54d3e23a133bd91d06f51f Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 19 Jun 2024 16:09:01 +0000 Subject: [PATCH 091/109] Improved config of spring/decompress --- conf/modules/modules.config | 4 ++++ modules.json | 3 ++- modules/nf-core/spring/decompress/main.nf | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/conf/modules/modules.config b/conf/modules/modules.config index d87f97174f..2df2f84f49 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -57,6 +57,10 @@ process { ] } + withName: 'NFCORE_SAREK:SAREK:SPRING_DECOMPRESS_TO_R.*' { + ext.one_direction = true + } + withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { diff --git a/modules.json b/modules.json index 86afa8dabd..31b942aebc 100644 --- a/modules.json +++ b/modules.json @@ -452,7 +452,8 @@ "spring/decompress": { "branch": "master", "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/spring/decompress/spring-decompress.diff" }, "strelka/germline": { "branch": "master", diff --git a/modules/nf-core/spring/decompress/main.nf b/modules/nf-core/spring/decompress/main.nf index 94448bddbe..657ce32881 100644 --- a/modules/nf-core/spring/decompress/main.nf +++ b/modules/nf-core/spring/decompress/main.nf @@ -21,7 +21,7 @@ process SPRING_DECOMPRESS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def output = meta.single_end ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" + def output = task.ext.one_direction ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" """ spring \\ From f9638738e44531e3f852fb441557450181dfa7a8 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 19 Jun 2024 16:13:56 +0000 Subject: [PATCH 092/109] Added extension .spring to file-extension for spring-files --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index f5ec4e00a2..076cbfb04e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -89,8 +89,8 @@ Output from Variant Calling and/or Annotation will be in a specific directory fo | `lane` | Lane ID, used when the `sample` is multiplexed on several lanes. Must be unique for each lane in the same sample (but does not need to be the original lane name), and must contain at least one character
    _Required for `--step mapping`_ | | `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`. | -| `spring_1` | Full path to spring-compressed, gzipped FastQ file for read 1 or for reads 1 and 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | -| `spring_2` | Full path to spring-compressed, gzipped FastQ file for read 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz` or `.fq.gz`. | +| `spring_1` | Full path to spring-compressed, gzipped FastQ file for read 1 or for reads 1 and 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz.spring` or `.fq.gz.spring`. | +| `spring_2` | Full path to spring-compressed, gzipped FastQ file for read 2. The Fastq file has to be first gzipped, then spring-compressed, and it must have the extension `.fastq.gz.spring` or `.fq.gz.spring`. | | `bam` | Full path to (u)BAM file | | `bai` | Full path to BAM index file | | `cram` | Full path to CRAM file | From 60821474b93abc783326983dc6870bdfa010eabd Mon Sep 17 00:00:00 2001 From: asp8200 Date: Wed, 19 Jun 2024 16:34:55 +0000 Subject: [PATCH 093/109] patch for spring/decompress --- .../spring/decompress/spring-decompress.diff | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 modules/nf-core/spring/decompress/spring-decompress.diff diff --git a/modules/nf-core/spring/decompress/spring-decompress.diff b/modules/nf-core/spring/decompress/spring-decompress.diff new file mode 100644 index 0000000000..0dfadf5445 --- /dev/null +++ b/modules/nf-core/spring/decompress/spring-decompress.diff @@ -0,0 +1,14 @@ +Changes in module 'nf-core/spring/decompress' +--- modules/nf-core/spring/decompress/main.nf ++++ modules/nf-core/spring/decompress/main.nf +@@ -21,7 +21,7 @@ + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. +- def output = meta.single_end ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" ++ def output = task.ext.one_direction ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" + + """ + spring \\ + +************************************************************ From 7f3b4b64e14ab1c5db4c934dc9fc45eb47f49cf9 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 20 Jun 2024 06:06:08 +0000 Subject: [PATCH 094/109] Replace ext.one_direction with meta.one_strand --- conf/modules/modules.config | 4 ---- modules/nf-core/spring/decompress/main.nf | 2 +- workflows/sarek/main.nf | 10 ++++++++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 2df2f84f49..d87f97174f 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -57,10 +57,6 @@ process { ] } - withName: 'NFCORE_SAREK:SAREK:SPRING_DECOMPRESS_TO_R.*' { - ext.one_direction = true - } - withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { diff --git a/modules/nf-core/spring/decompress/main.nf b/modules/nf-core/spring/decompress/main.nf index 657ce32881..70bdde18c3 100644 --- a/modules/nf-core/spring/decompress/main.nf +++ b/modules/nf-core/spring/decompress/main.nf @@ -21,7 +21,7 @@ process SPRING_DECOMPRESS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def output = task.ext.one_direction ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" + def output = meta.one_strand ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" """ spring \\ diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index df6fa19384..7e33c1bf1b 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -169,8 +169,14 @@ workflow SAREK { one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> addReadgroupToMeta(meta, files) } // Two fastq.gz.spring-files - one for R1 and one for R2 - r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[0] ]}) - r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> [meta, files[1] ]}) + r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> + meta.one_strand = true + [meta, files[0] ]} + ) + r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> + meta.one_strand = true + [meta, files[1] ]} + ) two_fastq_gz_from_spring = r1_fastq_gz_from_spring.fastq.join(r2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} From 6c15d6ba40ae9bbf620e455d69806a1c90f235f4 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 20 Jun 2024 06:08:55 +0000 Subject: [PATCH 095/109] update patch of spring/decompress --- modules/nf-core/spring/decompress/spring-decompress.diff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/spring/decompress/spring-decompress.diff b/modules/nf-core/spring/decompress/spring-decompress.diff index 0dfadf5445..82e03ac7fb 100644 --- a/modules/nf-core/spring/decompress/spring-decompress.diff +++ b/modules/nf-core/spring/decompress/spring-decompress.diff @@ -6,7 +6,7 @@ Changes in module 'nf-core/spring/decompress' def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def output = meta.single_end ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" -+ def output = task.ext.one_direction ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" ++ def output = meta.one_strand ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" """ spring \\ From e6b2e5cb9e5af1ac52b39367e254ac95d545029c Mon Sep 17 00:00:00 2001 From: asp8200 Date: Thu, 20 Jun 2024 06:22:07 +0000 Subject: [PATCH 096/109] Changing SPRING_DECOMPRESS_TO_R1_FQ_PAIR to SPRING_DECOMPRESS_TO_R1_FQ etc --- workflows/sarek/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 7e33c1bf1b..2746a9dccc 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -21,9 +21,9 @@ include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows/local/bam_convert_samtools/main' // Convert fastq.gz.spring files to fastq.gz files -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../../modules/nf-core/spring/decompress/main' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' // Run FASTQC include { FASTQC } from '../../modules/nf-core/fastqc/main' @@ -169,11 +169,11 @@ workflow SAREK { one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> addReadgroupToMeta(meta, files) } // Two fastq.gz.spring-files - one for R1 and one for R2 - r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> + r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ(input_sample_type.two_fastq_gz_spring.map{ meta, files -> meta.one_strand = true [meta, files[0] ]} ) - r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ_PAIR(input_sample_type.two_fastq_gz_spring.map{ meta, files -> + r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ(input_sample_type.two_fastq_gz_spring.map{ meta, files -> meta.one_strand = true [meta, files[1] ]} ) From 77a9a0f32ec522e1497873654e87e5669b14c343 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 24 Jun 2024 09:35:41 +0000 Subject: [PATCH 097/109] Updating module for spring/decompress --- modules.json | 2 +- modules/nf-core/spring/decompress/main.nf | 3 ++- modules/nf-core/spring/decompress/meta.yml | 7 ++++++- .../spring/decompress/spring-decompress.diff | 14 -------------- workflows/sarek/main.nf | 10 +++++----- 5 files changed, 14 insertions(+), 22 deletions(-) delete mode 100644 modules/nf-core/spring/decompress/spring-decompress.diff diff --git a/modules.json b/modules.json index 31b942aebc..8cc02c4d6b 100644 --- a/modules.json +++ b/modules.json @@ -451,7 +451,7 @@ }, "spring/decompress": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "0a92fa8d17d9e3c411e01a0ce41a86eff02b1599", "installed_by": ["modules"], "patch": "modules/nf-core/spring/decompress/spring-decompress.diff" }, diff --git a/modules/nf-core/spring/decompress/main.nf b/modules/nf-core/spring/decompress/main.nf index 70bdde18c3..4cf7829917 100644 --- a/modules/nf-core/spring/decompress/main.nf +++ b/modules/nf-core/spring/decompress/main.nf @@ -9,6 +9,7 @@ process SPRING_DECOMPRESS { input: tuple val(meta), path(spring) + val(write_one_fastq_gz) output: tuple val(meta), path("*.fastq.gz"), emit: fastq @@ -21,7 +22,7 @@ process SPRING_DECOMPRESS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def output = meta.one_strand ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" + def output = write_one_fastq_gz ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" """ spring \\ diff --git a/modules/nf-core/spring/decompress/meta.yml b/modules/nf-core/spring/decompress/meta.yml index 8f43aa93d4..a3449b4fb3 100644 --- a/modules/nf-core/spring/decompress/meta.yml +++ b/modules/nf-core/spring/decompress/meta.yml @@ -11,7 +11,7 @@ tools: documentation: "https://github.com/shubhamchandak94/Spring/blob/master/README.md" tool_dev_url: "https://github.com/shubhamchandak94/Spring" doi: "10.1093/bioinformatics/bty1015" - licence: "['Free for non-commercial use']" + licence: ["Free for non-commercial use"] input: - meta: type: map @@ -22,6 +22,11 @@ input: type: file description: Spring file to decompress. pattern: "*.{spring}" + - write_one_fastq_gz: + type: boolean + description: | + Controls whether spring should write one fastq.gz file with reads from both directions or two fastq.gz files with reads from distinct directions + pattern: "true or false" output: - meta: type: map diff --git a/modules/nf-core/spring/decompress/spring-decompress.diff b/modules/nf-core/spring/decompress/spring-decompress.diff deleted file mode 100644 index 82e03ac7fb..0000000000 --- a/modules/nf-core/spring/decompress/spring-decompress.diff +++ /dev/null @@ -1,14 +0,0 @@ -Changes in module 'nf-core/spring/decompress' ---- modules/nf-core/spring/decompress/main.nf -+++ modules/nf-core/spring/decompress/main.nf -@@ -21,7 +21,7 @@ - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. -- def output = meta.single_end ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" -+ def output = meta.one_strand ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" - - """ - spring \\ - -************************************************************ diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 2746a9dccc..022c4d19f9 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -164,18 +164,18 @@ workflow SAREK { fastq_gz = input_sample_type.fastq_gz.map { meta, files -> addReadgroupToMeta(meta, files) } // Just one fastq.gz.spring-file with both R1 and R2 - fastq_gz_pair_from_spring = SPRING_DECOMPRESS_TO_FQ_PAIR(input_sample_type.one_fastq_gz_spring) + fastq_gz_pair_from_spring = SPRING_DECOMPRESS_TO_FQ_PAIR(input_sample_type.one_fastq_gz_spring, false) one_fastq_gz_from_spring = fastq_gz_pair_from_spring.fastq.map { meta, files -> addReadgroupToMeta(meta, files) } // Two fastq.gz.spring-files - one for R1 and one for R2 r1_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R1_FQ(input_sample_type.two_fastq_gz_spring.map{ meta, files -> - meta.one_strand = true - [meta, files[0] ]} + [meta, files[0] ]}, + true // write_one_fastq_gz ) r2_fastq_gz_from_spring = SPRING_DECOMPRESS_TO_R2_FQ(input_sample_type.two_fastq_gz_spring.map{ meta, files -> - meta.one_strand = true - [meta, files[1] ]} + [meta, files[1] ]}, + true // write_one_fastq_gz ) two_fastq_gz_from_spring = r1_fastq_gz_from_spring.fastq.join(r2_fastq_gz_from_spring.fastq).map{ meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]]} From b2503f0e30c32eec81d9d5626e56670d916b4a1e Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 24 Jun 2024 09:56:20 +0000 Subject: [PATCH 098/109] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c1a583a9..9c8f3a7e15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` -- [#1534](https://github.com/nf-core/sarek/pull/1534) - Handling `.fastq.gz.spring` files as input +- [#1534](https://github.com/nf-core/sarek/pull/1534), [#1573](https://github.com/nf-core/sarek/pull/1573) - Handling `.fastq.gz.spring` files as input ### Changed From e749a7e143f4cf001c0ce7c2c0d0e3a3202ac248 Mon Sep 17 00:00:00 2001 From: asp8200 Date: Mon, 24 Jun 2024 09:58:43 +0000 Subject: [PATCH 099/109] Fixing indentation --- workflows/sarek/main.nf | 72 ++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 022c4d19f9..d975360702 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -4,21 +4,21 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { paramsSummaryMap } from 'plugin/nf-validation' -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_sarek_pipeline' +include { paramsSummaryMap } from 'plugin/nf-validation' +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_sarek_pipeline' // Create samplesheets to restart from different steps -include { CHANNEL_ALIGN_CREATE_CSV } from '../../subworkflows/local/channel_align_create_csv/main' -include { CHANNEL_MARKDUPLICATES_CREATE_CSV } from '../../subworkflows/local/channel_markduplicates_create_csv/main' -include { CHANNEL_BASERECALIBRATOR_CREATE_CSV } from '../../subworkflows/local/channel_baserecalibrator_create_csv/main' -include { CHANNEL_APPLYBQSR_CREATE_CSV } from '../../subworkflows/local/channel_applybqsr_create_csv/main' -include { CHANNEL_VARIANT_CALLING_CREATE_CSV } from '../../subworkflows/local/channel_variant_calling_create_csv/main' +include { CHANNEL_ALIGN_CREATE_CSV } from '../../subworkflows/local/channel_align_create_csv/main' +include { CHANNEL_MARKDUPLICATES_CREATE_CSV } from '../../subworkflows/local/channel_markduplicates_create_csv/main' +include { CHANNEL_BASERECALIBRATOR_CREATE_CSV } from '../../subworkflows/local/channel_baserecalibrator_create_csv/main' +include { CHANNEL_APPLYBQSR_CREATE_CSV } from '../../subworkflows/local/channel_applybqsr_create_csv/main' +include { CHANNEL_VARIANT_CALLING_CREATE_CSV } from '../../subworkflows/local/channel_variant_calling_create_csv/main' // Convert BAM files to FASTQ files -include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools/main' -include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows/local/bam_convert_samtools/main' +include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools/main' +include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_UMI } from '../../subworkflows/local/bam_convert_samtools/main' // Convert fastq.gz.spring files to fastq.gz files include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../../modules/nf-core/spring/decompress/main' @@ -26,65 +26,65 @@ include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../../module include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress/main' // Run FASTQC -include { FASTQC } from '../../modules/nf-core/fastqc/main' +include { FASTQC } from '../../modules/nf-core/fastqc/main' // TRIM/SPLIT FASTQ Files -include { FASTP } from '../../modules/nf-core/fastp/main' +include { FASTP } from '../../modules/nf-core/fastp/main' // Create umi consensus bams from fastq -include { FASTQ_CREATE_UMI_CONSENSUS_FGBIO } from '../../subworkflows/local/fastq_create_umi_consensus_fgbio/main' +include { FASTQ_CREATE_UMI_CONSENSUS_FGBIO } from '../../subworkflows/local/fastq_create_umi_consensus_fgbio/main' // Map input reads to reference genome -include { FASTQ_ALIGN_BWAMEM_MEM2_DRAGMAP_SENTIEON } from '../../subworkflows/local/fastq_align_bwamem_mem2_dragmap_sentieon/main' +include { FASTQ_ALIGN_BWAMEM_MEM2_DRAGMAP_SENTIEON } from '../../subworkflows/local/fastq_align_bwamem_mem2_dragmap_sentieon/main' // Merge and index BAM files (optional) -include { BAM_MERGE_INDEX_SAMTOOLS } from '../../subworkflows/local/bam_merge_index_samtools/main' +include { BAM_MERGE_INDEX_SAMTOOLS } from '../../subworkflows/local/bam_merge_index_samtools/main' // Convert BAM files -include { SAMTOOLS_CONVERT as BAM_TO_CRAM } from '../../modules/nf-core/samtools/convert/main' -include { SAMTOOLS_CONVERT as BAM_TO_CRAM_MAPPING } from '../../modules/nf-core/samtools/convert/main' +include { SAMTOOLS_CONVERT as BAM_TO_CRAM } from '../../modules/nf-core/samtools/convert/main' +include { SAMTOOLS_CONVERT as BAM_TO_CRAM_MAPPING } from '../../modules/nf-core/samtools/convert/main' // Convert CRAM files (optional) -include { SAMTOOLS_CONVERT as CRAM_TO_BAM } from '../../modules/nf-core/samtools/convert/main' -include { SAMTOOLS_CONVERT as CRAM_TO_BAM_RECAL } from '../../modules/nf-core/samtools/convert/main' +include { SAMTOOLS_CONVERT as CRAM_TO_BAM } from '../../modules/nf-core/samtools/convert/main' +include { SAMTOOLS_CONVERT as CRAM_TO_BAM_RECAL } from '../../modules/nf-core/samtools/convert/main' // Mark Duplicates (+QC) -include { BAM_MARKDUPLICATES } from '../../subworkflows/local/bam_markduplicates/main' -include { BAM_MARKDUPLICATES_SPARK } from '../../subworkflows/local/bam_markduplicates_spark/main' -include { BAM_SENTIEON_DEDUP } from '../../subworkflows/local/bam_sentieon_dedup/main' +include { BAM_MARKDUPLICATES } from '../../subworkflows/local/bam_markduplicates/main' +include { BAM_MARKDUPLICATES_SPARK } from '../../subworkflows/local/bam_markduplicates_spark/main' +include { BAM_SENTIEON_DEDUP } from '../../subworkflows/local/bam_sentieon_dedup/main' // QC on CRAM -include { CRAM_QC_MOSDEPTH_SAMTOOLS as CRAM_QC_NO_MD } from '../../subworkflows/local/cram_qc_mosdepth_samtools/main' -include { CRAM_SAMPLEQC } from '../../subworkflows/local/cram_sampleqc/main' +include { CRAM_QC_MOSDEPTH_SAMTOOLS as CRAM_QC_NO_MD } from '../../subworkflows/local/cram_qc_mosdepth_samtools/main' +include { CRAM_SAMPLEQC } from '../../subworkflows/local/cram_sampleqc/main' // Create recalibration tables -include { BAM_BASERECALIBRATOR } from '../../subworkflows/local/bam_baserecalibrator/main' -include { BAM_BASERECALIBRATOR_SPARK } from '../../subworkflows/local/bam_baserecalibrator_spark/main' +include { BAM_BASERECALIBRATOR } from '../../subworkflows/local/bam_baserecalibrator/main' +include { BAM_BASERECALIBRATOR_SPARK } from '../../subworkflows/local/bam_baserecalibrator_spark/main' // Create recalibrated cram files to use for variant calling (+QC) -include { BAM_APPLYBQSR } from '../../subworkflows/local/bam_applybqsr/main' -include { BAM_APPLYBQSR_SPARK } from '../../subworkflows/local/bam_applybqsr_spark/main' +include { BAM_APPLYBQSR } from '../../subworkflows/local/bam_applybqsr/main' +include { BAM_APPLYBQSR_SPARK } from '../../subworkflows/local/bam_applybqsr_spark/main' // Variant calling on a single normal sample -include { BAM_VARIANT_CALLING_GERMLINE_ALL } from '../../subworkflows/local/bam_variant_calling_germline_all/main' +include { BAM_VARIANT_CALLING_GERMLINE_ALL } from '../../subworkflows/local/bam_variant_calling_germline_all/main' // Variant calling on a single tumor sample -include { BAM_VARIANT_CALLING_TUMOR_ONLY_ALL } from '../../subworkflows/local/bam_variant_calling_tumor_only_all/main' +include { BAM_VARIANT_CALLING_TUMOR_ONLY_ALL } from '../../subworkflows/local/bam_variant_calling_tumor_only_all/main' // Variant calling on tumor/normal pair -include { BAM_VARIANT_CALLING_SOMATIC_ALL } from '../../subworkflows/local/bam_variant_calling_somatic_all/main' +include { BAM_VARIANT_CALLING_SOMATIC_ALL } from '../../subworkflows/local/bam_variant_calling_somatic_all/main' // POST VARIANTCALLING: e.g. merging -include { POST_VARIANTCALLING } from '../../subworkflows/local/post_variantcalling/main' +include { POST_VARIANTCALLING } from '../../subworkflows/local/post_variantcalling/main' // QC on VCF files -include { VCF_QC_BCFTOOLS_VCFTOOLS } from '../../subworkflows/local/vcf_qc_bcftools_vcftools/main' +include { VCF_QC_BCFTOOLS_VCFTOOLS } from '../../subworkflows/local/vcf_qc_bcftools_vcftools/main' // Annotation -include { VCF_ANNOTATE_ALL } from '../../subworkflows/local/vcf_annotate_all/main' +include { VCF_ANNOTATE_ALL } from '../../subworkflows/local/vcf_annotate_all/main' // MULTIQC -include { MULTIQC } from '../../modules/nf-core/multiqc/main' +include { MULTIQC } from '../../modules/nf-core/multiqc/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 455b0a2dbf1c7c79c0bcb7c11b4ee8b6d4401ac9 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 1 Jul 2024 13:59:52 +0000 Subject: [PATCH 100/109] remove patch line --- modules.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules.json b/modules.json index 8cc02c4d6b..26d801647b 100644 --- a/modules.json +++ b/modules.json @@ -452,8 +452,7 @@ "spring/decompress": { "branch": "master", "git_sha": "0a92fa8d17d9e3c411e01a0ce41a86eff02b1599", - "installed_by": ["modules"], - "patch": "modules/nf-core/spring/decompress/spring-decompress.diff" + "installed_by": ["modules"] }, "strelka/germline": { "branch": "master", From 6a77b9ad24fa6189bb3c967049bb17df74c3f3f5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 15 Jul 2024 15:54:29 +0200 Subject: [PATCH 101/109] prepare RC 3.4.3 --- CHANGELOG.md | 4 +++- assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c1a583a9..84764e5225 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. 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). -## dev +## [3.4.3](https://github.com/nf-core/sarek/releases/tag/3.4.3) - Loametjåhkkå + +Loametjåhkkå is another one of the main peaks of the Pårte massif. ### Added diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index ce1a6e388e..ea1fbb0aae 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,9 +3,9 @@ custom_logo_url: https://github.com/nf-core/sarek/ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 84c8a75297..de95ae8c86 100644 --- a/nextflow.config +++ b/nextflow.config @@ -396,7 +396,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '3.5.0dev' + version = '3.4.3' doi = '10.12688/f1000research.16665.2, 10.1093/nargab/lqae031, 10.5281/zenodo.3476425' } From 1e87aca3f55220e2ecae6c5b8cad7a4a9d513f28 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 16 Jul 2024 09:48:33 +0200 Subject: [PATCH 102/109] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98d3e220e9..a6c75e5f09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Loametjåhkkå is another one of the main peaks of the Pårte massif. - [#1502](https://github.com/nf-core/sarek/pull/1502) - export CNVs into VCF format in `bam_variant_calling_cnvkit` - [#1534](https://github.com/nf-core/sarek/pull/1534), [#1573](https://github.com/nf-core/sarek/pull/1573) - Handling `.fastq.gz.spring` files as input +- [#1593](https://github.com/nf-core/sarek/pull/1593) - Prepare release `3.4.2` ### Changed From c9d7639454b4d5d4ac4489c5bf16085b0a5f7311 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 16 Jul 2024 11:07:51 +0200 Subject: [PATCH 103/109] FIX: drop snapshot from Haplotypecaller tests --- CHANGELOG.md | 1 + tests/test_haplotypecaller.yml | 4 ++-- tests/test_haplotypecaller_skip_filter.yml | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6c75e5f09..a5c7178feb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ Loametjåhkkå is another one of the main peaks of the Pårte massif. - [#1556](https://github.com/nf-core/sarek/pull/1556) - Fix display of some commands in `docs/usage.md` - [#1563](https://github.com/nf-core/sarek/pull/1563) - Fix `vep_cache_path_full` so that `--refseq/--merged` will work for ENSEMBLVEP - [#1570](https://github.com/nf-core/sarek/pull/1570) - Remove duplicated notes in FASTQC output docs +- [#1596](https://github.com/nf-core/sarek/pull/1596) - Fix haplotypecaller tests ### Removed diff --git a/tests/test_haplotypecaller.yml b/tests/test_haplotypecaller.yml index 7912e49909..43cfca38bc 100644 --- a/tests/test_haplotypecaller.yml +++ b/tests/test_haplotypecaller.yml @@ -17,7 +17,7 @@ - path: results/preprocessing/recalibrated/test/test.recal.cram.crai should_exist: false - path: results/reports/bcftools/haplotypecaller/test/test.haplotypecaller.filtered.bcftools_stats.txt - md5sum: 01941d63ff87fba208320b8041738179 + # md5sum: 01941d63ff87fba208320b8041738179 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.filtered.FILTER.summary md5sum: 4e2ceea7f3ff998004691fd71192d9ee - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.filtered.TsTv.count @@ -67,7 +67,7 @@ - path: results/preprocessing/recalibrated/test/test.recal.cram.crai should_exist: false - path: results/reports/bcftools/haplotypecaller/test/test.haplotypecaller.filtered.bcftools_stats.txt - md5sum: 01941d63ff87fba208320b8041738179 + # md5sum: 01941d63ff87fba208320b8041738179 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.filtered.FILTER.summary md5sum: 4e2ceea7f3ff998004691fd71192d9ee - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.filtered.TsTv.count diff --git a/tests/test_haplotypecaller_skip_filter.yml b/tests/test_haplotypecaller_skip_filter.yml index b96157f868..dd9faf7e42 100644 --- a/tests/test_haplotypecaller_skip_filter.yml +++ b/tests/test_haplotypecaller_skip_filter.yml @@ -21,7 +21,7 @@ - path: results/variant_calling/haplotypecaller/test/test.haplotypecaller.filtered.vcf.gz.tbi should_exist: false - path: results/reports/bcftools/haplotypecaller/test/test.haplotypecaller.bcftools_stats.txt - md5sum: 7fd9e6c0f677b83c7dda1f85360042d2 + # md5sum: 7fd9e6c0f677b83c7dda1f85360042d2 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.FILTER.summary md5sum: 87a84b5f8ac3d3cbeeef7d60afcdbfe7 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.TsTv.count @@ -70,7 +70,7 @@ - path: results/preprocessing/recalibrated/test/test.recal.cram.crai should_exist: false - path: results/reports/bcftools/haplotypecaller/test/test.haplotypecaller.bcftools_stats.txt - md5sum: 7fd9e6c0f677b83c7dda1f85360042d2 + # md5sum: 7fd9e6c0f677b83c7dda1f85360042d2 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.FILTER.summary md5sum: 87a84b5f8ac3d3cbeeef7d60afcdbfe7 - path: results/reports/vcftools/haplotypecaller/test/test.haplotypecaller.TsTv.count From fa9961da09f23687d81d3c568b1dcc9432178e73 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 16 Jul 2024 17:30:48 +0200 Subject: [PATCH 104/109] FIX: drop snapshot from Deepvariant tests --- CHANGELOG.md | 1 + tests/test_deepvariant.yml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c7178feb..de3f559584 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Loametjåhkkå is another one of the main peaks of the Pårte massif. - [#1563](https://github.com/nf-core/sarek/pull/1563) - Fix `vep_cache_path_full` so that `--refseq/--merged` will work for ENSEMBLVEP - [#1570](https://github.com/nf-core/sarek/pull/1570) - Remove duplicated notes in FASTQC output docs - [#1596](https://github.com/nf-core/sarek/pull/1596) - Fix haplotypecaller tests +- [#1597](https://github.com/nf-core/sarek/pull/1597) - Fix deepvariant tests ### Removed diff --git a/tests/test_deepvariant.yml b/tests/test_deepvariant.yml index d66f2e1aef..e79be5e2f6 100644 --- a/tests/test_deepvariant.yml +++ b/tests/test_deepvariant.yml @@ -7,7 +7,7 @@ files: - path: results/multiqc - path: results/reports/bcftools/deepvariant/sample1/sample1.deepvariant.bcftools_stats.txt - md5sum: a6634ceb1c712de14009b05d273713a7 + # md5sum: a6634ceb1c712de14009b05d273713a7 - path: results/reports/vcftools/deepvariant/sample1/sample1.deepvariant.FILTER.summary md5sum: acce7a163f4070226429f9d6bc3fbd2c - path: results/reports/vcftools/deepvariant/sample1/sample1.deepvariant.TsTv.count @@ -46,7 +46,7 @@ - path: results/no_intervals.bed.gz.tbi md5sum: f3dac01ea66b95fe477446fde2d31489 - path: results/reports/bcftools/deepvariant/sample1/sample1.deepvariant.bcftools_stats.txt - md5sum: 0c48d8e315ca23c5dc2e7bf71ea0b6a6 + # md5sum: 0c48d8e315ca23c5dc2e7bf71ea0b6a6 - path: results/reports/vcftools/deepvariant/sample1/sample1.deepvariant.FILTER.summary md5sum: 7b17bd18c2d4bf129561c7c6a419a889 - path: results/reports/vcftools/deepvariant/sample1/sample1.deepvariant.TsTv.count From 425fb914dd4a9e0863bcf2a386f5ede54d910a60 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Tue, 30 Jul 2024 09:34:54 +0200 Subject: [PATCH 105/109] Update workflows/sarek/main.nf --- workflows/sarek/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index d975360702..90307f19c2 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -152,7 +152,7 @@ workflow SAREK { if (params.step == 'mapping') { - // Figure out if input is bam or fastq + // Figure out if input is bam, fastq, or spring input_sample_type = input_sample.branch{ bam: it[0].data_type == "bam" fastq_gz: it[0].data_type == "fastq_gz" From b7d79bf7088c704ec14365486d673ebcc65328f0 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Tue, 30 Jul 2024 09:35:02 +0200 Subject: [PATCH 106/109] Update subworkflows/local/bam_variant_calling_cnvkit/main.nf --- subworkflows/local/bam_variant_calling_cnvkit/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index 58051d5fa6..800d4b60d6 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -37,7 +37,8 @@ workflow BAM_VARIANT_CALLING_CNVKIT { versions = versions.mix(CNVKIT_BATCH.out.versions) versions = versions.mix(CNVKIT_GENEMETRICS.out.versions) - + versions = versions.mix( CNVKIT_CALL.out.versions) + versions = versions.mix( CNVKIT_EXPORT.out.versions) emit: cnv_calls_raw = CNVKIT_CALL.out.cns // channel: [ meta, cns ] cnv_calls_export = CNVKIT_EXPORT.out.output // channel: [ meta, export_format ] From 56828b991776e859c7f3f684e7aa91a9193e26d5 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 5 Aug 2024 12:27:05 +0000 Subject: [PATCH 107/109] remove empty output directories --- CHANGELOG.md | 1 + conf/modules/prepare_genome.config | 8 ++++---- conf/modules/prepare_intervals.config | 12 ++++++------ conf/modules/trimming.config | 4 ++-- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de3f559584..9c43b577b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Loametjåhkkå is another one of the main peaks of the Pårte massif. - [#1570](https://github.com/nf-core/sarek/pull/1570) - Remove duplicated notes in FASTQC output docs - [#1596](https://github.com/nf-core/sarek/pull/1596) - Fix haplotypecaller tests - [#1597](https://github.com/nf-core/sarek/pull/1597) - Fix deepvariant tests +- [#](https://github.com/nf-core/sarek/pull/) - Remove empty output directories ### Removed diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index e54138538c..1f57237be7 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -39,9 +39,9 @@ process { ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/reference/cnvkit" }, + path: { "${params.outdir}/reference" }, pattern: "*{bed}", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { params.save_reference || params.build_only_index ? "cnvkit/${it}" : null } ] } @@ -50,9 +50,9 @@ process { ext.when = { params.tools && params.tools.split(',').contains('cnvkit') && !params.cnvkit_reference } publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/reference/cnvkit" }, + path: { "${params.outdir}/reference" }, pattern: "*{cnn}", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { params.save_reference || params.build_only_index ? "cnvkit/${it}" : null } ] } diff --git a/conf/modules/prepare_intervals.config b/conf/modules/prepare_intervals.config index 77814b5d42..815903b996 100644 --- a/conf/modules/prepare_intervals.config +++ b/conf/modules/prepare_intervals.config @@ -23,18 +23,18 @@ process { withName: 'CREATE_INTERVALS_BED' { publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/reference/intervals" }, + path: { "${params.outdir}/reference" }, pattern: "*bed", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } ] } withName: 'GATK4_INTERVALLISTTOBED' { publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/reference/intervals" }, + path: { "${params.outdir}/reference" }, pattern: "*bed", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } ] } @@ -42,9 +42,9 @@ process { ext.prefix = {"${meta.id}"} publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/reference/intervals" }, + path: { "${params.outdir}/reference" }, pattern: "*bed.gz", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } ] } } diff --git a/conf/modules/trimming.config b/conf/modules/trimming.config index d58fa57b67..5fc6f7646b 100644 --- a/conf/modules/trimming.config +++ b/conf/modules/trimming.config @@ -32,10 +32,10 @@ process { pattern: "*.{html,json,log}" ], [ - path: { "${params.outdir}/preprocessing/fastp/${meta.sample}/" }, + path: { "${params.outdir}/preprocessing/" }, mode: params.publish_dir_mode, pattern: "*.fastp.fastq.gz", - saveAs: { params.save_trimmed || params.save_split_fastqs ? it : null } + saveAs: { params.save_trimmed || params.save_split_fastqs ? "fastp/${meta.sample}/${it}" : null } ] ] } From 96b4a879c656af47887899bc433e5aee9d1a23e0 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Mon, 5 Aug 2024 14:29:14 +0200 Subject: [PATCH 108/109] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c43b577b7..f3e00d0863 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ Loametjåhkkå is another one of the main peaks of the Pårte massif. - [#1570](https://github.com/nf-core/sarek/pull/1570) - Remove duplicated notes in FASTQC output docs - [#1596](https://github.com/nf-core/sarek/pull/1596) - Fix haplotypecaller tests - [#1597](https://github.com/nf-core/sarek/pull/1597) - Fix deepvariant tests -- [#](https://github.com/nf-core/sarek/pull/) - Remove empty output directories +- [#1612](https://github.com/nf-core/sarek/pull/1612) - Remove empty output directories ### Removed From e48d9bdb25f0f70f3c2c3943cdddfe35abf05838 Mon Sep 17 00:00:00 2001 From: FriederikeHanssen Date: Mon, 5 Aug 2024 13:07:26 +0000 Subject: [PATCH 109/109] fix linting --- subworkflows/local/bam_variant_calling_cnvkit/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index 800d4b60d6..20d0fe3fd1 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -37,8 +37,8 @@ workflow BAM_VARIANT_CALLING_CNVKIT { versions = versions.mix(CNVKIT_BATCH.out.versions) versions = versions.mix(CNVKIT_GENEMETRICS.out.versions) - versions = versions.mix( CNVKIT_CALL.out.versions) - versions = versions.mix( CNVKIT_EXPORT.out.versions) + versions = versions.mix(CNVKIT_CALL.out.versions) + versions = versions.mix(CNVKIT_EXPORT.out.versions) emit: cnv_calls_raw = CNVKIT_CALL.out.cns // channel: [ meta, cns ] cnv_calls_export = CNVKIT_EXPORT.out.output // channel: [ meta, export_format ]