From 3b70073e03b8a7d97d0856c77a29a8897f075b73 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 18 Aug 2023 13:20:55 +0000 Subject: [PATCH 01/21] Added: --tools now case insensitive Fixes #1187 --- CHANGELOG.md | 1 + conf/modules/aligner.config | 6 +++--- conf/modules/markduplicates.config | 10 +++++----- conf/modules/modules.config | 16 ++++++++-------- conf/modules/recalibrate.config | 2 +- conf/modules/sentieon_dedup.config | 4 ++-- workflows/sarek.nf | 20 ++++++++++---------- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46d21ec73c..a89661df9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1159](https://github.com/nf-core/sarek/pull/1159) - ISMB Poster - [#1173](https://github.com/nf-core/sarek/pull/1173) - CI tests for VQSR track with stub runs - [#1122](https://github.com/nf-core/sarek/pull/1122) - Add `annotation cache` functionality +- `--tools` is now case insensitive ### Changed diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index 931f18d6af..f7093ff9e1 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -46,7 +46,7 @@ process { if (params.save_output_as_bam && ( params.save_mapped || - (params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) && + (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && !(params.tools && params.tools.split(',').contains('sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) ) { "mapped/${meta.id}/${it}" } @@ -60,7 +60,7 @@ process { // However if it's skipped, reads need to be coordinate-sorted // Only name sort if Spark for Markduplicates + duplicate marking is not skipped // Currently SENTIEON_BWAMEM only supports coordinate sorting the reads. - ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').contains('markduplicates'))) ? '-n' : '' } + ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').toLowerCase().contains('markduplicates'))) ? '-n' : '' } } withName: "BWAMEM.*_MEM|SENTIEON_BWAMEM" { @@ -75,7 +75,7 @@ process { path: { "${params.outdir}/preprocessing/" }, pattern: "*{bam,bai}", // Only save if (save_output_as_bam AND (no_markduplicates OR save_mapped )) - saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && params.skip_tools.split(',').contains('markduplicates'))) ? "mapped/${meta.id}/${it}" : null } + saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates'))) ? "mapped/${meta.id}/${it}" : null } ] } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index 702b9b721b..404ca4e9fd 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -34,7 +34,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:(BAM_MARKDUPLICATES|BAM_MARKDUPLICATES_SPARK):CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('samtools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } ext.prefix = { "${meta.id}.md.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -47,7 +47,7 @@ process { // Run only when mapping should be saved as CRAM or when no MD is done ext.when = (params.save_mapped && !params.save_output_as_bam) || ( - (params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) && + (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && !(params.tools && params.tools.split(',').contains('sentieon_dedup')) ) ext.prefix = { "${meta.id}.sorted" } @@ -62,7 +62,7 @@ process { withName: 'GATK4_ESTIMATELIBRARYCOMPLEXITY' { ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('markduplicates_report')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates_report')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/markduplicates/${meta.id}" }, @@ -73,7 +73,7 @@ process { withName: 'GATK4_MARKDUPLICATES' { ext.args = '-REMOVE_DUPLICATES false -VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -85,7 +85,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*metrics", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').contains('markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} ] ] } diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 356d0768ac..6cf017b02b 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -30,7 +30,7 @@ process { // QC withName: 'FASTQC' { ext.args = '--quiet' - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('fastqc')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('fastqc')) } publishDir = [ [ path: { "${params.outdir}/reports/fastqc/${meta.id}" }, @@ -41,7 +41,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_NO_MD:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('samtools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } ext.prefix = { "${meta.id}.sorted.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -55,13 +55,13 @@ process { ext.prefix = { if (params.tools && params.tools.split(',').contains('sentieon_dedup')) { "${meta.id}.dedup" - } else if (params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) { + } else if (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) { "${meta.id}.sorted" } else { "${meta.id}.md" } } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('mosdepth')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('mosdepth')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/mosdepth/${meta.id}" }, @@ -69,14 +69,14 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:MOSDEPTH' { ext.prefix = { "${meta.id}.recal" } } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:SAMTOOLS_STATS' { ext.prefix = { "${meta.id}.recal.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('samtools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/samtools/${meta.id}" }, @@ -87,7 +87,7 @@ process { // VCF withName: 'BCFTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('bcftools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('bcftools')) } ext.prefix = { vcf.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, @@ -97,7 +97,7 @@ process { } withName: 'VCFTOOLS_.*' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('vcftools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('vcftools')) } ext.prefix = { variant_file.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/recalibrate.config b/conf/modules/recalibrate.config index 9602e33caf..8ae077854d 100644 --- a/conf/modules/recalibrate.config +++ b/conf/modules/recalibrate.config @@ -26,7 +26,7 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:(BAM_APPLYBQSR|BAM_APPLYBQSR_SPARK):CRAM_MERGE_INDEX_SAMTOOLS:MERGE_CRAM' { ext.prefix = { "${meta.id}.recal" } ext.when = { meta.num_intervals > 1 } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index 1bbf81b25a..58633725b2 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -29,14 +29,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*{metrics,metrics.multiqc.tsv}", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').contains('sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} ] ] } if (params.tools && params.tools.contains('sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').contains('samtools')) } + ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } publishDir = [ mode: params.publish_dir_mode, diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 8bb11326b3..d771c1866c 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -206,7 +206,7 @@ if (params.wes && !params.step == 'annotate') { else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") -if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').contains("baserecalibrator"))) { +if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains("baserecalibrator"))) { log.warn("DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap\nhttps://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode") } @@ -250,7 +250,7 @@ if (params.tools && params.tools.split(',').contains('mutect2')) { // Fails when missing resources for baserecalibrator // Warns when missing resources for haplotypecaller if (!params.dbsnp && !params.known_indels) { - if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').contains('baserecalibrator')))) { + if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { error("Base quality score recalibration requires at least one resource file. Please provide at least one of `--dbsnp` or `--known_indels`\nYou can skip this step in the workflow by adding `--skip_tools baserecalibrator` to the command.") } if (params.tools && (params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper'))) { @@ -596,7 +596,7 @@ workflow SAREK { // Additional options to be set up // QC - if (!(params.skip_tools && params.skip_tools.split(',').contains('fastqc'))) { + if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('fastqc'))) { FASTQC(input_fastq) reports = reports.mix(FASTQC.out.zip.collect{ meta, logs -> logs }) @@ -696,7 +696,7 @@ workflow SAREK { if ( params.save_mapped || ( - (params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) && + (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && !(params.tools && params.tools.split(',').contains('sentieon_dedup')) ) ) { @@ -738,7 +738,7 @@ workflow SAREK { if ( params.skip_tools && - params.skip_tools.split(',').contains('markduplicates') && + params.skip_tools.split(',').toLowerCase().contains('markduplicates') && !(params.tools && params.tools.split(',').contains('sentieon_dedup')) ) { if (params.step == 'mapping') { @@ -865,7 +865,7 @@ workflow SAREK { } // STEP 3: Create recalibration tables - if (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator'))) { + if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator'))) { ch_table_bqsr_no_spark = Channel.empty() ch_table_bqsr_spark = Channel.empty() @@ -944,7 +944,7 @@ workflow SAREK { .map{ meta, cram, crai, table -> [ meta + [data_type: "cram"], cram, crai, table ]} } - if (!(params.skip_tools && params.skip_tools.split(',').contains('baserecalibrator'))) { + if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator'))) { cram_variant_calling_no_spark = Channel.empty() cram_variant_calling_spark = Channel.empty() @@ -1121,7 +1121,7 @@ workflow SAREK { known_sites_snps_tbi, known_snps_vqsr, params.joint_germline, - params.skip_tools && params.skip_tools.split(',').contains('haplotypecaller_filter'), // true if filtering should be skipped + params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('haplotypecaller_filter'), // true if filtering should be skipped params.sentieon_haplotyper_emit_mode) // TUMOR ONLY VARIANT CALLING @@ -1238,12 +1238,12 @@ workflow SAREK { } version_yaml = Channel.empty() - if (!(params.skip_tools && params.skip_tools.split(',').contains('versions'))) { + if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('versions'))) { CUSTOM_DUMPSOFTWAREVERSIONS(versions.unique().collectFile(name: 'collated_versions.yml')) version_yaml = CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect() } - if (!(params.skip_tools && params.skip_tools.split(',').contains('multiqc'))) { + if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('multiqc'))) { workflow_summary = WorkflowSarek.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) From fa07a79455aa00d6e2e2794bd5989a1210670d3c Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 18 Aug 2023 13:27:44 +0000 Subject: [PATCH 02/21] Made a few tests use random case --- tests/test_freebayes.yml | 2 +- tests/test_haplotypecaller.yml | 2 +- tests/test_msisensorpro.yml | 2 +- tests/test_prepare_recalibration_from_bam.yml | 2 +- tests/test_sentieon_haplotyper_skip_filter.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_freebayes.yml b/tests/test_freebayes.yml index 0808b7ee7d..9591c7f1e3 100644 --- a/tests/test_freebayes.yml +++ b/tests/test_freebayes.yml @@ -393,7 +393,7 @@ - path: results/freebayes should_exist: false - name: Run variant calling on tumor_only sample with freebayes - command: nextflow run main.nf -profile test_cache,tools_tumoronly --tools freebayes --outdir results + command: nextflow run main.nf -profile test_cache,tools_tumoronly --tools Freebayes --outdir results tags: - freebayes - tumor_only diff --git a/tests/test_haplotypecaller.yml b/tests/test_haplotypecaller.yml index 4ec225367b..fa5fffc4b8 100644 --- a/tests/test_haplotypecaller.yml +++ b/tests/test_haplotypecaller.yml @@ -1,5 +1,5 @@ - name: Run variant calling on germline sample with haplotypecaller - command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools haplotypecaller --step variant_calling --outdir results + command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools Haplotypecaller --step variant_calling --outdir results tags: - germline - haplotypecaller diff --git a/tests/test_msisensorpro.yml b/tests/test_msisensorpro.yml index 700187e0a4..b799cc7092 100644 --- a/tests/test_msisensorpro.yml +++ b/tests/test_msisensorpro.yml @@ -1,5 +1,5 @@ - name: Run variant calling on somatic sample with msisensor-pro - command: nextflow run main.nf -profile test_cache,tools_somatic --tools msisensorpro --outdir results + command: nextflow run main.nf -profile test_cache,tools_somatic --tools Msisensorpro --outdir results tags: - msisensorpro - somatic diff --git a/tests/test_prepare_recalibration_from_bam.yml b/tests/test_prepare_recalibration_from_bam.yml index 3d2560058c..147698c246 100644 --- a/tests/test_prepare_recalibration_from_bam.yml +++ b/tests/test_prepare_recalibration_from_bam.yml @@ -37,7 +37,7 @@ - path: results/preprocessing/markduplicates/ should_exist: false - name: Run prepare_recalibration starting from bam and skip baserecalibration - command: nextflow run main.nf -profile test_cache,prepare_recalibration_bam,skip_bqsr --tools strelka --outdir results + command: nextflow run main.nf -profile test_cache,prepare_recalibration_bam,skip_bqsr --tools STRELKA --outdir results tags: - input_bam - prepare_recalibration diff --git a/tests/test_sentieon_haplotyper_skip_filter.yml b/tests/test_sentieon_haplotyper_skip_filter.yml index 8972c06738..7ee3d2d91f 100644 --- a/tests/test_sentieon_haplotyper_skip_filter.yml +++ b/tests/test_sentieon_haplotyper_skip_filter.yml @@ -1,5 +1,5 @@ - name: Run variant calling on germline sample with sentieon haplotyper and skip filter - command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools sentieon_haplotyper --step variant_calling --skip_tools haplotyper_filter --outdir results + command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools sentieon_Haplotyper --step variant_calling --skip_tools haplotyper_filter --outdir results tags: - germline - sentieon_haplotyper_skip_filter From fcb458d291154ce4a6c4d0286e98ab524d736826 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 18 Aug 2023 13:35:44 +0000 Subject: [PATCH 03/21] make --tools case insensitive --- conf/modules/aligner.config | 2 +- conf/modules/annotate.config | 14 +++++------ conf/modules/ascat.config | 2 +- conf/modules/cnvkit.config | 6 ++--- conf/modules/controlfreec.config | 2 +- conf/modules/deepvariant.config | 2 +- conf/modules/freebayes.config | 4 ++-- conf/modules/haplotypecaller.config | 4 ++-- conf/modules/manta.config | 2 +- conf/modules/markduplicates.config | 4 ++-- conf/modules/modules.config | 2 +- conf/modules/mpileup.config | 6 ++--- conf/modules/mutect2.config | 4 ++-- conf/modules/prepare_cache.config | 4 ++-- conf/modules/prepare_genome.config | 16 ++++++------- conf/modules/sentieon_dedup.config | 2 +- conf/modules/sentieon_haplotyper.config | 2 +- conf/modules/strelka.config | 2 +- conf/modules/tiddit.config | 4 ++-- nextflow.config | 6 +++++ tests/test_gatk4_spark.yml | 2 +- tests/test_haplotypecaller_skip_filter.yml | 2 +- tests/test_skip_all_qc.yml | 2 +- workflows/sarek.nf | 28 +++++++++++----------- 24 files changed, 65 insertions(+), 59 deletions(-) diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index f7093ff9e1..4d0c3c011b 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -47,7 +47,7 @@ process { ( params.save_mapped || (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').contains('sentieon_dedup')) + !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) ) { "mapped/${meta.id}/${it}" } else { null } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index bf92ecf7b8..70352bb3e0 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -16,7 +16,7 @@ process { // SNPEFF - if (params.tools && (params.tools.split(',').contains('snpeff') || params.tools.split(',').contains('merge'))) { + if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge'))) { withName: 'SNPEFF_SNPEFF' { ext.prefix = { vcf.baseName - ".vcf" + "_snpEff" } ext.args = '-nodownload -canon -v' @@ -25,14 +25,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/snpeff/${meta.variantcaller}/${meta.id}/" }, pattern: "*{csv,html,genes.txt}", - saveAs: { params.tools.split(',').contains('snpeff') ? it : null } + saveAs: { params.tools.split(',').toLowerCase().contains('snpeff') ? it : null } ] ] } } // VEP - if (params.tools && (params.tools.split(',').contains('vep') || params.tools.split(',').contains('merge'))) { + if (params.tools && (params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge'))) { withName: 'ENSEMBLVEP_VEP' { ext.args = { [ (params.vep_dbnsfp && params.dbnsfp && !params.dbnsfp_consequence) ? "--plugin dbNSFP,${params.dbnsfp.split("/")[-1]},${params.dbnsfp_fields}" : '', @@ -61,7 +61,7 @@ process { } // SNPEFF THEN VEP - if (params.tools && params.tools.split(',').contains('merge')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('merge')) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_MERGE:ENSEMBLVEP_VEP" { // If merge: Output file will have format *_snpEff_VEP.ann.vcf, *_snpEff_VEP.ann.json or *_snpEff_VEP.ann.tab ext.prefix = { vcf.baseName - ".ann.vcf" + "_VEP.ann" } @@ -69,7 +69,7 @@ process { } // ALL ANNOTATION TOOLS - if (params.tools && (params.tools.split(',').contains('snpeff') || params.tools.split(',').contains('vep') || params.tools.split(',').contains('merge'))) { + if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge'))) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:.*:(TABIX_BGZIPTABIX|TABIX_TABIX)" { ext.prefix = { input.name - ".vcf" } publishDir = [ @@ -80,13 +80,13 @@ process { } } - if (params.tools && (params.tools.split(',').contains('snpeff') || params.tools.split(',').contains('merge'))) { + if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge'))) { withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_SNPEFF:TABIX_BGZIPTABIX' { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, pattern: "*{gz,gz.tbi}", - saveAs: { params.tools.split(',').contains('snpeff') ? it : null } + saveAs: { params.tools.split(',').toLowerCase().contains('snpeff') ? it : null } ] } } diff --git a/conf/modules/ascat.config b/conf/modules/ascat.config index 8a8cf79999..a020b6de96 100644 --- a/conf/modules/ascat.config +++ b/conf/modules/ascat.config @@ -26,7 +26,7 @@ process { "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual ]} - ext.when = { params.tools && params.tools.split(',').contains('ascat') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('ascat') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/ascat/${meta.id}/" }, diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index f77c6ef446..93c3c6e1cb 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -17,7 +17,7 @@ process { // PREPARE REFERENCE CNVKIT withName: 'CNVKIT_ANTITARGET' { - ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -28,7 +28,7 @@ process { withName: 'CNVKIT_REFERENCE' { ext.prefix = "cnvkit" - ext.when = { params.tools && params.tools.split(',').contains('cnvkit') && !params.cnvkit_reference } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') && !params.cnvkit_reference } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -40,7 +40,7 @@ process { // CNVKIT withName: 'CNVKIT_BATCH' { ext.args = { params.wes ? "--method hybrid --diagram --scatter" : "--method wgs --diagram --scatter" } - ext.when = { params.tools && params.tools.split(',').contains('cnvkit') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, diff --git a/conf/modules/controlfreec.config b/conf/modules/controlfreec.config index 3945756957..554d8f9bfe 100644 --- a/conf/modules/controlfreec.config +++ b/conf/modules/controlfreec.config @@ -24,7 +24,7 @@ process { } withName: 'FREEC_.*' { - ext.when = { params.tools && params.tools.split(',').contains('controlfreec') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/controlfreec/${meta.id}/" }, diff --git a/conf/modules/deepvariant.config b/conf/modules/deepvariant.config index 65ed591c4d..662268ac3a 100644 --- a/conf/modules/deepvariant.config +++ b/conf/modules/deepvariant.config @@ -18,7 +18,7 @@ process { withName: 'DEEPVARIANT' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.deepvariant" : "${meta.id}.deepvariant.${intervals.simpleName}" } ext.args = { params.wes ? "--model_type WES" : "--model_type WGS" } - ext.when = { params.tools && params.tools.split(',').contains('deepvariant') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('deepvariant') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 35064a36a3..070feac7b6 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -28,7 +28,7 @@ process { ext.args = '--min-alternate-fraction 0.1 --min-mapping-quality 1' //To make sure no naming conflicts ensure with module BCFTOOLS_SORT & the naming being correct in the output folder ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}" : "${meta.id}.${target_bed.simpleName}" } - ext.when = { params.tools && params.tools.split(',').contains('freebayes') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('freebayes') } publishDir = [ enabled: false ] @@ -53,7 +53,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').contains('freebayes')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('freebayes')) { withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_FREEBAYES:FREEBAYES' { ext.args = "--pooled-continuous \ --pooled-discrete \ diff --git a/conf/modules/haplotypecaller.config b/conf/modules/haplotypecaller.config index be159c4152..6030585e7a 100644 --- a/conf/modules/haplotypecaller.config +++ b/conf/modules/haplotypecaller.config @@ -18,7 +18,7 @@ process { withName: 'GATK4_HAPLOTYPECALLER' { ext.args = { params.joint_germline ? "-ERC GVCF" : "" } ext.prefix = { meta.num_intervals <= 1 ? ( params.joint_germline ? "${meta.id}.haplotypecaller.g" : "${meta.id}.haplotypecaller" ) : ( params.joint_germline ? "${meta.id}.haplotypecaller.${intervals.simpleName}.g" :"${meta.id}.haplotypecaller.${intervals.simpleName}" ) } - ext.when = { params.tools && params.tools.split(',').contains('haplotypecaller') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('haplotypecaller') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, @@ -53,7 +53,7 @@ process { ] } - if (params.tools && params.tools.split(',').contains('haplotypecaller')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('haplotypecaller')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_HAPLOTYPECALLER:BAM_MERGE_INDEX_SAMTOOLS:(MERGE_BAM|INDEX_MERGE_BAM)' { ext.prefix = { "${meta.id}.realigned" } publishDir = [ diff --git a/conf/modules/manta.config b/conf/modules/manta.config index 7049970af3..0663994a6b 100644 --- a/conf/modules/manta.config +++ b/conf/modules/manta.config @@ -14,7 +14,7 @@ // MANTA process { - if (params.tools && params.tools.split(',').contains('manta')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('manta')) { withName: 'MANTA_GERMLINE|MANTA_TUMORONLY|MANTA_SOMATIC' { ext.args = { params.wes ? "--exome" : "" } ext.prefix = { "${meta.id}.manta" } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index 404ca4e9fd..35b78921e0 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -48,7 +48,7 @@ process { ext.when = (params.save_mapped && !params.save_output_as_bam) || ( (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').contains('sentieon_dedup')) + !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ) ext.prefix = { "${meta.id}.sorted" } publishDir = [ @@ -112,7 +112,7 @@ process { withName: 'NFCORE_SAREK:SAREK:CRAM_TO_BAM' { ext.when = { params.save_output_as_bam } - if (params.tools && params.tools.split(',').contains('sentieon_dedup')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { ext.prefix = { "${meta.id}.dedup" } publishDir = [ enabled: params.save_output_as_bam, diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 6cf017b02b..4c8a32e3f9 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -53,7 +53,7 @@ process { withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { - if (params.tools && params.tools.split(',').contains('sentieon_dedup')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { "${meta.id}.dedup" } else if (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) { "${meta.id}.sorted" diff --git a/conf/modules/mpileup.config b/conf/modules/mpileup.config index 9ef259daaf..ade2b80743 100644 --- a/conf/modules/mpileup.config +++ b/conf/modules/mpileup.config @@ -23,7 +23,7 @@ process { withName: 'BCFTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.bcftools" : "${meta.id}_${intervals.simpleName}.bcftools" } - ext.when = { params.tools && params.tools.split(',').contains('mpileup') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('mpileup') } ext.args2 = "--multiallelic-caller" ext.args3 = "-i 'count(GT==\"RR\")==0'" // only report non homozygous reference variants publishDir = [ @@ -44,7 +44,7 @@ process { } withName: 'SAMTOOLS_MPILEUP' { - ext.when = { params.tools && params.tools.split(',').contains('controlfreec') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec') } publishDir = [ enabled: false ] @@ -52,7 +52,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').contains('controlfreec')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('controlfreec')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_MPILEUP:SAMTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } } diff --git a/conf/modules/mutect2.config b/conf/modules/mutect2.config index 210edde641..763680f6b4 100644 --- a/conf/modules/mutect2.config +++ b/conf/modules/mutect2.config @@ -14,11 +14,11 @@ // MUTECT2 process { - if (params.tools && params.tools.split(',').contains('mutect2')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('mutect2')) { withName: 'GATK4_MUTECT2' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.mutect2" : "${meta.id}.mutect2.${intervals.simpleName}" } - ext.when = { params.tools && params.tools.split(',').contains('mutect2') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } ext.args = { params.ignore_soft_clipped_bases ? "--dont-use-soft-clipped-bases true --f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" : "--f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_cache.config b/conf/modules/prepare_cache.config index fd13b10cfd..39e2ed2df6 100644 --- a/conf/modules/prepare_cache.config +++ b/conf/modules/prepare_cache.config @@ -17,7 +17,7 @@ process { // SNPEFF withName: 'SNPEFF_DOWNLOAD' { - ext.when = { params.tools && (params.tools.split(',').contains('snpeff') || params.tools.split(',').contains('merge')) } + ext.when = { params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge')) } publishDir = [ mode: params.publish_dir_mode, path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } @@ -26,7 +26,7 @@ process { // VEP withName: 'ENSEMBLVEP_DOWNLOAD' { - ext.when = { params.tools && (params.tools.split(',').contains('vep') || params.tools.split(',').contains('merge')) } + ext.when = { params.tools && (params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge')) } ext.args = '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 66eb2041d2..90e6449126 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -56,7 +56,7 @@ process { } withName: 'MSISENSORPRO_SCAN' { - ext.when = { params.tools && params.tools.split(',').contains('msisensorpro') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('msisensorpro') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -76,7 +76,7 @@ process { } withName: 'TABIX_DBSNP' { - ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (params.tools.split(',').contains('controlfreec') || params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper') || params.tools.split(',').contains('mutect2'))) } + ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (params.tools.split(',').toLowerCase().contains('controlfreec') || params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper') || params.tools.split(',').toLowerCase().contains('mutect2'))) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -86,7 +86,7 @@ process { } withName: 'TABIX_GERMLINE_RESOURCE' { - ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && params.tools.split(',').contains('mutect2') } + ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -96,7 +96,7 @@ process { } withName: 'TABIX_KNOWN_INDELS' { - ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper'))) ) } + ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -106,7 +106,7 @@ process { } withName: 'TABIX_KNOWN_SNPS' { - ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper'))) ) } + ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -116,7 +116,7 @@ process { } withName: 'TABIX_PON' { - ext.when = { !params.pon_tbi && params.pon && params.tools && params.tools.split(',').contains('mutect2') } + ext.when = { !params.pon_tbi && params.pon && params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -126,13 +126,13 @@ process { } withName: 'UNZIP_ALLELES|UNZIP_LOCI|UNZIP_GC|UNZIP_RT' { - ext.when = { params.tools && params.tools.split(',').contains('ascat')} + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('ascat')} publishDir = [ enabled: false ] } withName: 'UNTAR_CHR_DIR' { - ext.when = { params.tools && params.tools.split(',').contains('controlfreec')} + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec')} } } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index 58633725b2..e43cad1320 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_DEDUP' { ext.prefix = { "${meta.id}.dedup" } - ext.when = { params.tools && params.tools.split(',').contains('sentieon_dedup') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup') } publishDir = [ [ enabled: !params.save_output_as_bam, diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index 26f1300498..686e0e2977 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_HAPLOTYPER' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.haplotyper" : "${meta.id}.haplotyper.${intervals.simpleName}" } - ext.when = { params.tools && params.tools.split(',').contains('sentieon_haplotyper') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('sentieon_haplotyper') } publishDir = [ enabled: !params.joint_germline, mode: params.publish_dir_mode, diff --git a/conf/modules/strelka.config b/conf/modules/strelka.config index e4fb6663db..a57570c5a4 100644 --- a/conf/modules/strelka.config +++ b/conf/modules/strelka.config @@ -18,7 +18,7 @@ process { withName: 'STRELKA_.*' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.strelka" : "${meta.id}.strelka.${target_bed.simpleName}" } ext.args = { params.wes ? "--exome" : "" } - ext.when = { params.tools && params.tools.split(',').contains('strelka') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('strelka') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/tiddit.config b/conf/modules/tiddit.config index 3ed371927c..89b54a07ae 100644 --- a/conf/modules/tiddit.config +++ b/conf/modules/tiddit.config @@ -18,7 +18,7 @@ process { withName: 'TIDDIT_SV' { ext.args = { bwa_index ? "" : "--skip_assembly" } ext.prefix = { "${meta.id}.tiddit" } - ext.when = { params.tools && params.tools.split(',').contains('tiddit') } + ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('tiddit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/tiddit/${meta.id}/" }, @@ -36,7 +36,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').contains('tiddit')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('tiddit')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_SOMATIC_TIDDIT:TIDDIT_NORMAL:TABIX_BGZIP_TIDDIT_SV' { ext.prefix = {"${meta.id}.tiddit.normal"} } diff --git a/nextflow.config b/nextflow.config index 1351f768f9..398570fd02 100644 --- a/nextflow.config +++ b/nextflow.config @@ -389,6 +389,12 @@ includeConfig 'conf/modules/post_variant_calling.config' //annotate includeConfig 'conf/modules/annotate.config' +// Function to check if a string appears in `--params.tools` +def checkTools(tool) { + def use_tool = !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains(tool)) + return use_tool +} + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/tests/test_gatk4_spark.yml b/tests/test_gatk4_spark.yml index e7632b3d92..330464492a 100644 --- a/tests/test_gatk4_spark.yml +++ b/tests/test_gatk4_spark.yml @@ -49,7 +49,7 @@ - path: results/preprocessing/mapped/ should_exist: false - name: Run default pipeline with gatk4_spark & skipping all QC steps - command: nextflow run main.nf -profile test_cache,use_gatk_spark --skip_tools fastqc,markduplicates_report,mosdepth,multiqc,samtools --outdir results + command: nextflow run main.nf -profile test_cache,use_gatk_spark --skip_tools Fastqc,markduplicates_report,mosdepth,multiqc,samtools --outdir results tags: - gatk4_spark - preprocessing diff --git a/tests/test_haplotypecaller_skip_filter.yml b/tests/test_haplotypecaller_skip_filter.yml index def69fbbf3..c7efab61a6 100644 --- a/tests/test_haplotypecaller_skip_filter.yml +++ b/tests/test_haplotypecaller_skip_filter.yml @@ -39,7 +39,7 @@ - path: results/haplotypecaller should_exist: false - name: Run variant calling on germline sample with haplotypecaller without intervals and skip filter - command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools haplotypecaller --step variant_calling --skip_tools haplotypecaller_filter --no_intervals --outdir results + command: nextflow run main.nf -profile test_cache,targeted --input ./tests/csv/3.0/mapped_single_bam.csv --tools haplotypecaller --step variant_calling --skip_tools HaplotypeCaller_filter --no_intervals --outdir results tags: - germline - haplotypecaller_skip_filter diff --git a/tests/test_skip_all_qc.yml b/tests/test_skip_all_qc.yml index aa8a62ba4c..d1cc28cc46 100644 --- a/tests/test_skip_all_qc.yml +++ b/tests/test_skip_all_qc.yml @@ -1,5 +1,5 @@ - name: Run default pipeline with skipping all QC steps - command: nextflow run main.nf -profile test_cache --skip_tools fastqc,markduplicates_report,mosdepth,multiqc,samtools --outdir results + command: nextflow run main.nf -profile test_cache --skip_tools fastqc,markduplicates_report,MOSDEPTH,MultiQC,samtools --outdir results tags: - default_extended - preprocessing diff --git a/workflows/sarek.nf b/workflows/sarek.nf index d771c1866c..d157ac04ec 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -181,7 +181,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_tumor = ['ascat', 'controlfreec', 'mutect2', 'msisensorpro'] def tools_tumor_asked = [] tools_tumor.each{ tool -> - if (params.tools.split(',').contains(tool)) tools_tumor_asked.add(tool) + if (params.tools.split(',').toLowerCase().contains(tool)) tools_tumor_asked.add(tool) } if (!tools_tumor_asked.isEmpty()) { error('The sample-sheet only contains normal-samples, but the following tools, which were requested with "--tools", expect at least one tumor-sample : ' + tools_tumor_asked.join(", ")) @@ -192,7 +192,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] def requested_tools_requiring_normal_samples = [] tools_requiring_normal_samples.each{ tool_requiring_normal_samples -> - if (params.tools.split(',').contains(tool_requiring_normal_samples)) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) + if (params.tools.split(',').toLowerCase().contains(tool_requiring_normal_samples)) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) } if (!requested_tools_requiring_normal_samples.isEmpty()) { error('The sample-sheet only contains tumor-samples, but the following tools, which were requested by the option "tools", expect at least one normal-sample : ' + requested_tools_requiring_normal_samples.join(", ")) @@ -219,7 +219,7 @@ if (params.tools && params.tools.contains("sentieon_haplotyper") && params.joint } // Fails or warns when missing files or params for ascat -if (params.tools && params.tools.split(',').contains('ascat')) { +if (params.tools && params.tools.split(',').toLowerCase().contains('ascat')) { if (!params.ascat_alleles) { error("No allele files were provided for running ASCAT. Please provide a zip folder with allele files.") } @@ -235,7 +235,7 @@ if (params.tools && params.tools.split(',').contains('ascat')) { } // Warns when missing files or params for mutect2 -if (params.tools && params.tools.split(',').contains('mutect2')) { +if (params.tools && params.tools.split(',').toLowerCase().contains('mutect2')) { if (!params.pon) { log.warn("No Panel-of-normal was specified for Mutect2.\nIt is highly recommended to use one: https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2\nFor more information on how to create one: https://gatk.broadinstitute.org/hc/en-us/articles/5358921041947-CreateSomaticPanelOfNormals-BETA-") } @@ -253,11 +253,11 @@ if (!params.dbsnp && !params.known_indels) { if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { error("Base quality score recalibration requires at least one resource file. Please provide at least one of `--dbsnp` or `--known_indels`\nYou can skip this step in the workflow by adding `--skip_tools baserecalibrator` to the command.") } - if (params.tools && (params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper'))) { + if (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) { log.warn "If GATK's Haplotypecaller or Sentieon's Haplotyper is specified, without `--dbsnp` or `--known_indels no filtering will be done. For filtering, please provide at least one of `--dbsnp` or `--known_indels`.\nFor more information see FilterVariantTranches (single-sample, default): https://gatk.broadinstitute.org/hc/en-us/articles/5358928898971-FilterVariantTranches\nFor more information see VariantRecalibration (--joint_germline): https://gatk.broadinstitute.org/hc/en-us/articles/5358906115227-VariantRecalibrator\nFor more information on GATK Best practice germline variant calling: https://gatk.broadinstitute.org/hc/en-us/articles/360035535932-Germline-short-variant-discovery-SNPs-Indels-" } } -if (params.joint_germline && (!params.tools || !(params.tools.split(',').contains('haplotypecaller') || params.tools.split(',').contains('sentieon_haplotyper')))) { +if (params.joint_germline && (!params.tools || !(params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper')))) { error("The GATK's Haplotypecaller or Sentieon's Haplotyper should be specified as one of the tools when doing joint germline variant calling.) ") } @@ -266,7 +266,7 @@ if (params.joint_germline && (!params.dbsnp || !params.known_indels || !params.k } // Fails when --joint_mutect2 is used without enabling mutect2 -if (params.joint_mutect2 && (!params.tools || !params.tools.split(',').contains('mutect2'))) { +if (params.joint_mutect2 && (!params.tools || !params.tools.split(',').toLowerCase().contains('mutect2'))) { error("The mutect2 should be specified as one of the tools when doing joint somatic variant calling with Mutect2. (The mutect2 could be specified by adding `--tools mutect2` to the nextflow command.)") } @@ -276,7 +276,7 @@ if ((params.step == 'variant_calling' || params.step == 'annotate') && !params.t } // Fails when missing sex information for CNV tools -if (params.tools && (params.tools.split(',').contains('ascat') || params.tools.split(',').contains('controlfreec'))) { +if (params.tools && (params.tools.split(',').toLowerCase().contains('ascat') || params.tools.split(',').toLowerCase().contains('controlfreec'))) { input_sample.map{ if (it[0].sex == 'NA' ) { error("Please specify sex information for each sample in your samplesheet when using '--tools' with 'ascat' or 'controlfreec'.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") @@ -547,7 +547,7 @@ workflow SAREK { else [ intervals[0], intervals[1], num_intervals ] } - if (params.tools && params.tools.split(',').contains('cnvkit')) { + if (params.tools && params.tools.split(',').toLowerCase().contains('cnvkit')) { if (params.cnvkit_reference) { cnvkit_reference = Channel.fromPath(params.cnvkit_reference).collect() } else { @@ -697,7 +697,7 @@ workflow SAREK { params.save_mapped || ( (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').contains('sentieon_dedup')) + !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ) ) { // bams are merged (when multiple lanes from the same sample), indexed and then converted to cram @@ -739,7 +739,7 @@ workflow SAREK { if ( params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates') && - !(params.tools && params.tools.split(',').contains('sentieon_dedup')) + !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ) { if (params.step == 'mapping') { cram_skip_markduplicates = BAM_TO_CRAM_MAPPING.out.alignment_index @@ -777,7 +777,7 @@ workflow SAREK { // Gather used softwares versions versions = versions.mix(BAM_MARKDUPLICATES_SPARK.out.versions) - } else if (params.tools && params.tools.split(',').contains('sentieon_dedup')) { + } else if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { crai_for_markduplicates = params.step == 'mapping' ? bai_mapped : input_sample.map{ meta, input, index -> [ meta, index ] } BAM_SENTIEON_DEDUP( cram_for_markduplicates, @@ -824,7 +824,7 @@ workflow SAREK { // CSV should be written for the file actually out, either CRAM or BAM // Create CSV to restart from this step - csv_subfolder = (params.tools && params.tools.split(',').contains('sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' + csv_subfolder = (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' params.save_output_as_bam ? CHANNEL_MARKDUPLICATES_CREATE_CSV(CRAM_TO_BAM.out.alignment_index, csv_subfolder, params.outdir, params.save_output_as_bam) : CHANNEL_MARKDUPLICATES_CREATE_CSV(ch_md_cram_for_restart, csv_subfolder, params.outdir, params.save_output_as_bam) } @@ -1215,7 +1215,7 @@ workflow SAREK { // ANNOTATE if (params.step == 'annotate') vcf_to_annotate = input_sample - if (params.tools.split(',').contains('merge') || params.tools.split(',').contains('snpeff') || params.tools.split(',').contains('vep')) { + if (params.tools.split(',').toLowerCase().contains('merge') || params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('vep')) { vep_fasta = (params.vep_include_fasta) ? fasta.map{ fasta -> [ [ id:fasta.baseName ], fasta ] } : [[id: 'null'], []] From 08398c41a09aca24f70b0b786c174ec7b4aa36cb Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:10:11 +0000 Subject: [PATCH 04/21] CI tests pull repo before checking for diff --- .github/workflows/pytest-workflow.yml | 1 + .github/workflows/pytest-workflow_release.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/pytest-workflow.yml b/.github/workflows/pytest-workflow.yml index fba7e2866e..a33f8075aa 100644 --- a/.github/workflows/pytest-workflow.yml +++ b/.github/workflows/pytest-workflow.yml @@ -22,6 +22,7 @@ jobs: id: filter with: filters: "tests/config/tags.yml" + token: "" test: name: ${{ matrix.tags }} ${{ matrix.profile }} NF ${{ matrix.NXF_VER }} diff --git a/.github/workflows/pytest-workflow_release.yml b/.github/workflows/pytest-workflow_release.yml index 3c02664cd7..39e6cef514 100644 --- a/.github/workflows/pytest-workflow_release.yml +++ b/.github/workflows/pytest-workflow_release.yml @@ -24,6 +24,7 @@ jobs: id: filter with: filters: "tests/config/tags.yml" + token: "" test: name: ${{ matrix.tags }} ${{ matrix.profile }} NF ${{ matrix.NXF_VER }} From 5cb3acd915579aa63a968b53b83bab8209c966ed Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Sat, 19 Aug 2023 11:08:28 +0100 Subject: [PATCH 05/21] Update CHANGELOG.md Co-authored-by: Friederike Hanssen --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a89661df9c..7444b1b839 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1159](https://github.com/nf-core/sarek/pull/1159) - ISMB Poster - [#1173](https://github.com/nf-core/sarek/pull/1173) - CI tests for VQSR track with stub runs - [#1122](https://github.com/nf-core/sarek/pull/1122) - Add `annotation cache` functionality -- `--tools` is now case insensitive +- [#1188](https://github.com/nf-core/sarek/pull/1188) - `--tools` is now case insensitive ### Changed From 31608dd736c1270fe8bb551bf864919d0e91fcb9 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 22 Aug 2023 16:50:17 +0000 Subject: [PATCH 06/21] Use function for all config --- conf/modules/aligner.config | 8 ++--- conf/modules/annotate.config | 14 ++++----- conf/modules/ascat.config | 2 +- conf/modules/cnvkit.config | 6 ++-- conf/modules/controlfreec.config | 2 +- conf/modules/deepvariant.config | 2 +- conf/modules/freebayes.config | 4 +-- conf/modules/haplotypecaller.config | 4 +-- conf/modules/manta.config | 2 +- conf/modules/markduplicates.config | 14 ++++----- conf/modules/modules.config | 18 +++++------ conf/modules/mpileup.config | 6 ++-- conf/modules/mutect2.config | 4 +-- conf/modules/prepare_cache.config | 4 +-- conf/modules/prepare_genome.config | 16 +++++----- conf/modules/recalibrate.config | 2 +- conf/modules/sentieon_dedup.config | 6 ++-- conf/modules/sentieon_haplotyper.config | 2 +- conf/modules/strelka.config | 2 +- conf/modules/tiddit.config | 4 +-- nextflow.config | 6 ++-- workflows/sarek.nf | 42 ++++++++++++------------- 22 files changed, 84 insertions(+), 86 deletions(-) diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index 4d0c3c011b..9667c0d832 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -46,8 +46,8 @@ process { if (params.save_output_as_bam && ( params.save_mapped || - (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) + (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && + !(params.tools && checkTools(params.tools, 'sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) ) { "mapped/${meta.id}/${it}" } else { null } @@ -60,7 +60,7 @@ process { // However if it's skipped, reads need to be coordinate-sorted // Only name sort if Spark for Markduplicates + duplicate marking is not skipped // Currently SENTIEON_BWAMEM only supports coordinate sorting the reads. - ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').toLowerCase().contains('markduplicates'))) ? '-n' : '' } + ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !checkTools(params.skip_tools, 'markduplicates'))) ? '-n' : '' } } withName: "BWAMEM.*_MEM|SENTIEON_BWAMEM" { @@ -75,7 +75,7 @@ process { path: { "${params.outdir}/preprocessing/" }, pattern: "*{bam,bai}", // Only save if (save_output_as_bam AND (no_markduplicates OR save_mapped )) - saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates'))) ? "mapped/${meta.id}/${it}" : null } + saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && checkTools(params.skip_tools, 'markduplicates'))) ? "mapped/${meta.id}/${it}" : null } ] } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index 70352bb3e0..a3d3132866 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -16,7 +16,7 @@ process { // SNPEFF - if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge'))) { + if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge'))) { withName: 'SNPEFF_SNPEFF' { ext.prefix = { vcf.baseName - ".vcf" + "_snpEff" } ext.args = '-nodownload -canon -v' @@ -25,14 +25,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/snpeff/${meta.variantcaller}/${meta.id}/" }, pattern: "*{csv,html,genes.txt}", - saveAs: { params.tools.split(',').toLowerCase().contains('snpeff') ? it : null } + saveAs: { checkTools(params.tools, 'snpeff') ? it : null } ] ] } } // VEP - if (params.tools && (params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge'))) { + if (params.tools && (checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge'))) { withName: 'ENSEMBLVEP_VEP' { ext.args = { [ (params.vep_dbnsfp && params.dbnsfp && !params.dbnsfp_consequence) ? "--plugin dbNSFP,${params.dbnsfp.split("/")[-1]},${params.dbnsfp_fields}" : '', @@ -61,7 +61,7 @@ process { } // SNPEFF THEN VEP - if (params.tools && params.tools.split(',').toLowerCase().contains('merge')) { + if (params.tools && checkTools(params.tools, 'merge')) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_MERGE:ENSEMBLVEP_VEP" { // If merge: Output file will have format *_snpEff_VEP.ann.vcf, *_snpEff_VEP.ann.json or *_snpEff_VEP.ann.tab ext.prefix = { vcf.baseName - ".ann.vcf" + "_VEP.ann" } @@ -69,7 +69,7 @@ process { } // ALL ANNOTATION TOOLS - if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge'))) { + if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge'))) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:.*:(TABIX_BGZIPTABIX|TABIX_TABIX)" { ext.prefix = { input.name - ".vcf" } publishDir = [ @@ -80,13 +80,13 @@ process { } } - if (params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge'))) { + if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge'))) { withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_SNPEFF:TABIX_BGZIPTABIX' { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, pattern: "*{gz,gz.tbi}", - saveAs: { params.tools.split(',').toLowerCase().contains('snpeff') ? it : null } + saveAs: { checkTools(params.tools, 'snpeff') ? it : null } ] } } diff --git a/conf/modules/ascat.config b/conf/modules/ascat.config index a020b6de96..080f47da85 100644 --- a/conf/modules/ascat.config +++ b/conf/modules/ascat.config @@ -26,7 +26,7 @@ process { "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual ]} - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('ascat') } + ext.when = { params.tools && checkTools(params.tools, 'ascat') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/ascat/${meta.id}/" }, diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index 93c3c6e1cb..85143e727a 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -17,7 +17,7 @@ process { // PREPARE REFERENCE CNVKIT withName: 'CNVKIT_ANTITARGET' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') } + ext.when = { params.tools && checkTools(params.tools, 'cnvkit') } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -28,7 +28,7 @@ process { withName: 'CNVKIT_REFERENCE' { ext.prefix = "cnvkit" - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') && !params.cnvkit_reference } + ext.when = { params.tools && checkTools(params.tools, 'cnvkit') && !params.cnvkit_reference } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -40,7 +40,7 @@ process { // CNVKIT withName: 'CNVKIT_BATCH' { ext.args = { params.wes ? "--method hybrid --diagram --scatter" : "--method wgs --diagram --scatter" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('cnvkit') } + ext.when = { params.tools && checkTools(params.tools, 'cnvkit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, diff --git a/conf/modules/controlfreec.config b/conf/modules/controlfreec.config index 554d8f9bfe..254eef8d27 100644 --- a/conf/modules/controlfreec.config +++ b/conf/modules/controlfreec.config @@ -24,7 +24,7 @@ process { } withName: 'FREEC_.*' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec') } + ext.when = { params.tools && checkTools(params.tools, 'controlfreec') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/controlfreec/${meta.id}/" }, diff --git a/conf/modules/deepvariant.config b/conf/modules/deepvariant.config index 662268ac3a..3520f6fcab 100644 --- a/conf/modules/deepvariant.config +++ b/conf/modules/deepvariant.config @@ -18,7 +18,7 @@ process { withName: 'DEEPVARIANT' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.deepvariant" : "${meta.id}.deepvariant.${intervals.simpleName}" } ext.args = { params.wes ? "--model_type WES" : "--model_type WGS" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('deepvariant') } + ext.when = { params.tools && checkTools(params.tools, 'deepvariant') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 070feac7b6..41960b3111 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -28,7 +28,7 @@ process { ext.args = '--min-alternate-fraction 0.1 --min-mapping-quality 1' //To make sure no naming conflicts ensure with module BCFTOOLS_SORT & the naming being correct in the output folder ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}" : "${meta.id}.${target_bed.simpleName}" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('freebayes') } + ext.when = { params.tools && checkTools(params.tools, 'freebayes') } publishDir = [ enabled: false ] @@ -53,7 +53,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').toLowerCase().contains('freebayes')) { + if (params.tools && checkTools(params.tools, 'freebayes')) { withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_FREEBAYES:FREEBAYES' { ext.args = "--pooled-continuous \ --pooled-discrete \ diff --git a/conf/modules/haplotypecaller.config b/conf/modules/haplotypecaller.config index 6030585e7a..f17853ced6 100644 --- a/conf/modules/haplotypecaller.config +++ b/conf/modules/haplotypecaller.config @@ -18,7 +18,7 @@ process { withName: 'GATK4_HAPLOTYPECALLER' { ext.args = { params.joint_germline ? "-ERC GVCF" : "" } ext.prefix = { meta.num_intervals <= 1 ? ( params.joint_germline ? "${meta.id}.haplotypecaller.g" : "${meta.id}.haplotypecaller" ) : ( params.joint_germline ? "${meta.id}.haplotypecaller.${intervals.simpleName}.g" :"${meta.id}.haplotypecaller.${intervals.simpleName}" ) } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('haplotypecaller') } + ext.when = { params.tools && checkTools(params.tools, 'haplotypecaller') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, @@ -53,7 +53,7 @@ process { ] } - if (params.tools && params.tools.split(',').toLowerCase().contains('haplotypecaller')) { + if (params.tools && checkTools(params.tools, 'haplotypecaller')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_HAPLOTYPECALLER:BAM_MERGE_INDEX_SAMTOOLS:(MERGE_BAM|INDEX_MERGE_BAM)' { ext.prefix = { "${meta.id}.realigned" } publishDir = [ diff --git a/conf/modules/manta.config b/conf/modules/manta.config index 0663994a6b..3bee4b7bef 100644 --- a/conf/modules/manta.config +++ b/conf/modules/manta.config @@ -14,7 +14,7 @@ // MANTA process { - if (params.tools && params.tools.split(',').toLowerCase().contains('manta')) { + if (params.tools && checkTools(params.tools, 'manta')) { withName: 'MANTA_GERMLINE|MANTA_TUMORONLY|MANTA_SOMATIC' { ext.args = { params.wes ? "--exome" : "" } ext.prefix = { "${meta.id}.manta" } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index 35b78921e0..0f35f9a51d 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -34,7 +34,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:(BAM_MARKDUPLICATES|BAM_MARKDUPLICATES_SPARK):CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.md.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -47,8 +47,8 @@ process { // Run only when mapping should be saved as CRAM or when no MD is done ext.when = (params.save_mapped && !params.save_output_as_bam) || ( - (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) + (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && + !(params.tools && checkTools(params.tools, 'sentieon_dedup')) ) ext.prefix = { "${meta.id}.sorted" } publishDir = [ @@ -62,7 +62,7 @@ process { withName: 'GATK4_ESTIMATELIBRARYCOMPLEXITY' { ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates_report')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates_report')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/markduplicates/${meta.id}" }, @@ -73,7 +73,7 @@ process { withName: 'GATK4_MARKDUPLICATES' { ext.args = '-REMOVE_DUPLICATES false -VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -85,7 +85,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*metrics", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} ] ] } @@ -112,7 +112,7 @@ process { withName: 'NFCORE_SAREK:SAREK:CRAM_TO_BAM' { ext.when = { params.save_output_as_bam } - if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { + if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { ext.prefix = { "${meta.id}.dedup" } publishDir = [ enabled: params.save_output_as_bam, diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 4c8a32e3f9..5c35b8bdbc 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -30,7 +30,7 @@ process { // QC withName: 'FASTQC' { ext.args = '--quiet' - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('fastqc')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'fastqc')) } publishDir = [ [ path: { "${params.outdir}/reports/fastqc/${meta.id}" }, @@ -41,7 +41,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_NO_MD:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.sorted.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -53,15 +53,15 @@ process { withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { - if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { + if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { "${meta.id}.dedup" - } else if (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) { + } else if (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) { "${meta.id}.sorted" } else { "${meta.id}.md" } } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('mosdepth')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'mosdepth')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/mosdepth/${meta.id}" }, @@ -69,14 +69,14 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:MOSDEPTH' { ext.prefix = { "${meta.id}.recal" } } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:SAMTOOLS_STATS' { ext.prefix = { "${meta.id}.recal.cram" } - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/samtools/${meta.id}" }, @@ -87,7 +87,7 @@ process { // VCF withName: 'BCFTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('bcftools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'bcftools')) } ext.prefix = { vcf.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, @@ -97,7 +97,7 @@ process { } withName: 'VCFTOOLS_.*' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('vcftools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'vcftools')) } ext.prefix = { variant_file.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/mpileup.config b/conf/modules/mpileup.config index ade2b80743..e8cc547ea6 100644 --- a/conf/modules/mpileup.config +++ b/conf/modules/mpileup.config @@ -23,7 +23,7 @@ process { withName: 'BCFTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.bcftools" : "${meta.id}_${intervals.simpleName}.bcftools" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('mpileup') } + ext.when = { params.tools && checkTools(params.tools, 'mpileup') } ext.args2 = "--multiallelic-caller" ext.args3 = "-i 'count(GT==\"RR\")==0'" // only report non homozygous reference variants publishDir = [ @@ -44,7 +44,7 @@ process { } withName: 'SAMTOOLS_MPILEUP' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec') } + ext.when = { params.tools && checkTools(params.tools, 'controlfreec') } publishDir = [ enabled: false ] @@ -52,7 +52,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').toLowerCase().contains('controlfreec')) { + if (params.tools && checkTools(params.tools, 'controlfreec')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_MPILEUP:SAMTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } } diff --git a/conf/modules/mutect2.config b/conf/modules/mutect2.config index 763680f6b4..b0c3767d05 100644 --- a/conf/modules/mutect2.config +++ b/conf/modules/mutect2.config @@ -14,11 +14,11 @@ // MUTECT2 process { - if (params.tools && params.tools.split(',').toLowerCase().contains('mutect2')) { + if (params.tools && checkTools(params.tools, 'mutect2')) { withName: 'GATK4_MUTECT2' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.mutect2" : "${meta.id}.mutect2.${intervals.simpleName}" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } + ext.when = { params.tools && checkTools(params.tools, 'mutect2') } ext.args = { params.ignore_soft_clipped_bases ? "--dont-use-soft-clipped-bases true --f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" : "--f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_cache.config b/conf/modules/prepare_cache.config index 39e2ed2df6..382f1f4f63 100644 --- a/conf/modules/prepare_cache.config +++ b/conf/modules/prepare_cache.config @@ -17,7 +17,7 @@ process { // SNPEFF withName: 'SNPEFF_DOWNLOAD' { - ext.when = { params.tools && (params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('merge')) } + ext.when = { params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge')) } publishDir = [ mode: params.publish_dir_mode, path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } @@ -26,7 +26,7 @@ process { // VEP withName: 'ENSEMBLVEP_DOWNLOAD' { - ext.when = { params.tools && (params.tools.split(',').toLowerCase().contains('vep') || params.tools.split(',').toLowerCase().contains('merge')) } + ext.when = { params.tools && (checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge')) } ext.args = '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 90e6449126..48694fd128 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -56,7 +56,7 @@ process { } withName: 'MSISENSORPRO_SCAN' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('msisensorpro') } + ext.when = { params.tools && checkTools(params.tools, 'msisensorpro') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -76,7 +76,7 @@ process { } withName: 'TABIX_DBSNP' { - ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (params.tools.split(',').toLowerCase().contains('controlfreec') || params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper') || params.tools.split(',').toLowerCase().contains('mutect2'))) } + ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (checkTools(params.tools, 'controlfreec') || checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper') || checkTools(params.tools, 'mutect2'))) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -86,7 +86,7 @@ process { } withName: 'TABIX_GERMLINE_RESOURCE' { - ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } + ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && checkTools(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -96,7 +96,7 @@ process { } withName: 'TABIX_KNOWN_INDELS' { - ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) ) } + ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -106,7 +106,7 @@ process { } withName: 'TABIX_KNOWN_SNPS' { - ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) ) } + ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -116,7 +116,7 @@ process { } withName: 'TABIX_PON' { - ext.when = { !params.pon_tbi && params.pon && params.tools && params.tools.split(',').toLowerCase().contains('mutect2') } + ext.when = { !params.pon_tbi && params.pon && params.tools && checkTools(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -126,13 +126,13 @@ process { } withName: 'UNZIP_ALLELES|UNZIP_LOCI|UNZIP_GC|UNZIP_RT' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('ascat')} + ext.when = { params.tools && checkTools(params.tools, 'ascat')} publishDir = [ enabled: false ] } withName: 'UNTAR_CHR_DIR' { - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('controlfreec')} + ext.when = { params.tools && checkTools(params.tools, 'controlfreec')} } } diff --git a/conf/modules/recalibrate.config b/conf/modules/recalibrate.config index 8ae077854d..5608994626 100644 --- a/conf/modules/recalibrate.config +++ b/conf/modules/recalibrate.config @@ -26,7 +26,7 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:(BAM_APPLYBQSR|BAM_APPLYBQSR_SPARK):CRAM_MERGE_INDEX_SAMTOOLS:MERGE_CRAM' { ext.prefix = { "${meta.id}.recal" } ext.when = { meta.num_intervals > 1 } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index e43cad1320..1dab001284 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_DEDUP' { ext.prefix = { "${meta.id}.dedup" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup') } + ext.when = { params.tools && checkTools(params.tools, 'sentieon_dedup') } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -29,14 +29,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*{metrics,metrics.multiqc.tsv}", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && checkTools(params.skip_tools, 'sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} ] ] } if (params.tools && params.tools.contains('sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('samtools')) } + ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index 686e0e2977..dc9f78ba86 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_HAPLOTYPER' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.haplotyper" : "${meta.id}.haplotyper.${intervals.simpleName}" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('sentieon_haplotyper') } + ext.when = { params.tools && checkTools(params.tools, 'sentieon_haplotyper') } publishDir = [ enabled: !params.joint_germline, mode: params.publish_dir_mode, diff --git a/conf/modules/strelka.config b/conf/modules/strelka.config index a57570c5a4..a494cdccd3 100644 --- a/conf/modules/strelka.config +++ b/conf/modules/strelka.config @@ -18,7 +18,7 @@ process { withName: 'STRELKA_.*' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.strelka" : "${meta.id}.strelka.${target_bed.simpleName}" } ext.args = { params.wes ? "--exome" : "" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('strelka') } + ext.when = { params.tools && checkTools(params.tools, 'strelka') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/tiddit.config b/conf/modules/tiddit.config index 89b54a07ae..1f33c34888 100644 --- a/conf/modules/tiddit.config +++ b/conf/modules/tiddit.config @@ -18,7 +18,7 @@ process { withName: 'TIDDIT_SV' { ext.args = { bwa_index ? "" : "--skip_assembly" } ext.prefix = { "${meta.id}.tiddit" } - ext.when = { params.tools && params.tools.split(',').toLowerCase().contains('tiddit') } + ext.when = { params.tools && checkTools(params.tools, 'tiddit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/tiddit/${meta.id}/" }, @@ -36,7 +36,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && params.tools.split(',').toLowerCase().contains('tiddit')) { + if (params.tools && checkTools(params.tools, 'tiddit')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_SOMATIC_TIDDIT:TIDDIT_NORMAL:TABIX_BGZIP_TIDDIT_SV' { ext.prefix = {"${meta.id}.tiddit.normal"} } diff --git a/nextflow.config b/nextflow.config index 398570fd02..5c89398175 100644 --- a/nextflow.config +++ b/nextflow.config @@ -389,10 +389,8 @@ includeConfig 'conf/modules/post_variant_calling.config' //annotate includeConfig 'conf/modules/annotate.config' -// Function to check if a string appears in `--params.tools` -def checkTools(tool) { - def use_tool = !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains(tool)) - return use_tool +def checkTools(parameter, tool) { + parameter.split(',').any{ it.toUpperCase().contains(tool) } } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/sarek.nf b/workflows/sarek.nf index d157ac04ec..fd429c9b09 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -219,7 +219,7 @@ if (params.tools && params.tools.contains("sentieon_haplotyper") && params.joint } // Fails or warns when missing files or params for ascat -if (params.tools && params.tools.split(',').toLowerCase().contains('ascat')) { +if (params.tools && checkTools(params.tools, 'ascat')) { if (!params.ascat_alleles) { error("No allele files were provided for running ASCAT. Please provide a zip folder with allele files.") } @@ -235,7 +235,7 @@ if (params.tools && params.tools.split(',').toLowerCase().contains('ascat')) { } // Warns when missing files or params for mutect2 -if (params.tools && params.tools.split(',').toLowerCase().contains('mutect2')) { +if (params.tools && checkTools(params.tools, 'mutect2')) { if (!params.pon) { log.warn("No Panel-of-normal was specified for Mutect2.\nIt is highly recommended to use one: https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2\nFor more information on how to create one: https://gatk.broadinstitute.org/hc/en-us/articles/5358921041947-CreateSomaticPanelOfNormals-BETA-") } @@ -250,14 +250,14 @@ if (params.tools && params.tools.split(',').toLowerCase().contains('mutect2')) { // Fails when missing resources for baserecalibrator // Warns when missing resources for haplotypecaller if (!params.dbsnp && !params.known_indels) { - if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !params.skip_tools.split(',').toLowerCase().contains('baserecalibrator')))) { + if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !checkTools(params.skip_tools, 'baserecalibrator')))) { error("Base quality score recalibration requires at least one resource file. Please provide at least one of `--dbsnp` or `--known_indels`\nYou can skip this step in the workflow by adding `--skip_tools baserecalibrator` to the command.") } - if (params.tools && (params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper'))) { + if (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) { log.warn "If GATK's Haplotypecaller or Sentieon's Haplotyper is specified, without `--dbsnp` or `--known_indels no filtering will be done. For filtering, please provide at least one of `--dbsnp` or `--known_indels`.\nFor more information see FilterVariantTranches (single-sample, default): https://gatk.broadinstitute.org/hc/en-us/articles/5358928898971-FilterVariantTranches\nFor more information see VariantRecalibration (--joint_germline): https://gatk.broadinstitute.org/hc/en-us/articles/5358906115227-VariantRecalibrator\nFor more information on GATK Best practice germline variant calling: https://gatk.broadinstitute.org/hc/en-us/articles/360035535932-Germline-short-variant-discovery-SNPs-Indels-" } } -if (params.joint_germline && (!params.tools || !(params.tools.split(',').toLowerCase().contains('haplotypecaller') || params.tools.split(',').toLowerCase().contains('sentieon_haplotyper')))) { +if (params.joint_germline && (!params.tools || !(checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper')))) { error("The GATK's Haplotypecaller or Sentieon's Haplotyper should be specified as one of the tools when doing joint germline variant calling.) ") } @@ -266,7 +266,7 @@ if (params.joint_germline && (!params.dbsnp || !params.known_indels || !params.k } // Fails when --joint_mutect2 is used without enabling mutect2 -if (params.joint_mutect2 && (!params.tools || !params.tools.split(',').toLowerCase().contains('mutect2'))) { +if (params.joint_mutect2 && (!params.tools || !checkTools(params.tools, 'mutect2'))) { error("The mutect2 should be specified as one of the tools when doing joint somatic variant calling with Mutect2. (The mutect2 could be specified by adding `--tools mutect2` to the nextflow command.)") } @@ -276,7 +276,7 @@ if ((params.step == 'variant_calling' || params.step == 'annotate') && !params.t } // Fails when missing sex information for CNV tools -if (params.tools && (params.tools.split(',').toLowerCase().contains('ascat') || params.tools.split(',').toLowerCase().contains('controlfreec'))) { +if (params.tools && (checkTools(params.tools, 'ascat') || checkTools(params.tools, 'controlfreec'))) { input_sample.map{ if (it[0].sex == 'NA' ) { error("Please specify sex information for each sample in your samplesheet when using '--tools' with 'ascat' or 'controlfreec'.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") @@ -547,7 +547,7 @@ workflow SAREK { else [ intervals[0], intervals[1], num_intervals ] } - if (params.tools && params.tools.split(',').toLowerCase().contains('cnvkit')) { + if (params.tools && checkTools(params.tools, 'cnvkit')) { if (params.cnvkit_reference) { cnvkit_reference = Channel.fromPath(params.cnvkit_reference).collect() } else { @@ -596,7 +596,7 @@ workflow SAREK { // Additional options to be set up // QC - if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('fastqc'))) { + if (!(params.skip_tools && checkTools(params.skip_tools, 'fastqc'))) { FASTQC(input_fastq) reports = reports.mix(FASTQC.out.zip.collect{ meta, logs -> logs }) @@ -696,8 +696,8 @@ workflow SAREK { if ( params.save_mapped || ( - (params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('markduplicates')) && - !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) + (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && + !(params.tools && checkTools(params.tools, 'sentieon_dedup')) ) ) { // bams are merged (when multiple lanes from the same sample), indexed and then converted to cram @@ -738,8 +738,8 @@ workflow SAREK { if ( params.skip_tools && - params.skip_tools.split(',').toLowerCase().contains('markduplicates') && - !(params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) + checkTools(params.skip_tools, 'markduplicates') && + !(params.tools && checkTools(params.tools, 'sentieon_dedup')) ) { if (params.step == 'mapping') { cram_skip_markduplicates = BAM_TO_CRAM_MAPPING.out.alignment_index @@ -777,7 +777,7 @@ workflow SAREK { // Gather used softwares versions versions = versions.mix(BAM_MARKDUPLICATES_SPARK.out.versions) - } else if (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) { + } else if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { crai_for_markduplicates = params.step == 'mapping' ? bai_mapped : input_sample.map{ meta, input, index -> [ meta, index ] } BAM_SENTIEON_DEDUP( cram_for_markduplicates, @@ -824,7 +824,7 @@ workflow SAREK { // CSV should be written for the file actually out, either CRAM or BAM // Create CSV to restart from this step - csv_subfolder = (params.tools && params.tools.split(',').toLowerCase().contains('sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' + csv_subfolder = (params.tools && checkTools(params.tools, 'sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' params.save_output_as_bam ? CHANNEL_MARKDUPLICATES_CREATE_CSV(CRAM_TO_BAM.out.alignment_index, csv_subfolder, params.outdir, params.save_output_as_bam) : CHANNEL_MARKDUPLICATES_CREATE_CSV(ch_md_cram_for_restart, csv_subfolder, params.outdir, params.save_output_as_bam) } @@ -865,7 +865,7 @@ workflow SAREK { } // STEP 3: Create recalibration tables - if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator'))) { + if (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator'))) { ch_table_bqsr_no_spark = Channel.empty() ch_table_bqsr_spark = Channel.empty() @@ -944,7 +944,7 @@ workflow SAREK { .map{ meta, cram, crai, table -> [ meta + [data_type: "cram"], cram, crai, table ]} } - if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('baserecalibrator'))) { + if (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator'))) { cram_variant_calling_no_spark = Channel.empty() cram_variant_calling_spark = Channel.empty() @@ -1121,7 +1121,7 @@ workflow SAREK { known_sites_snps_tbi, known_snps_vqsr, params.joint_germline, - params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('haplotypecaller_filter'), // true if filtering should be skipped + params.skip_tools && checkTools(params.skip_tools, 'haplotypecaller_filter'), // true if filtering should be skipped params.sentieon_haplotyper_emit_mode) // TUMOR ONLY VARIANT CALLING @@ -1215,7 +1215,7 @@ workflow SAREK { // ANNOTATE if (params.step == 'annotate') vcf_to_annotate = input_sample - if (params.tools.split(',').toLowerCase().contains('merge') || params.tools.split(',').toLowerCase().contains('snpeff') || params.tools.split(',').toLowerCase().contains('vep')) { + if (checkTools(params.tools, 'merge') || checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'vep')) { vep_fasta = (params.vep_include_fasta) ? fasta.map{ fasta -> [ [ id:fasta.baseName ], fasta ] } : [[id: 'null'], []] @@ -1238,12 +1238,12 @@ workflow SAREK { } version_yaml = Channel.empty() - if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('versions'))) { + if (!(params.skip_tools && checkTools(params.skip_tools, 'versions'))) { CUSTOM_DUMPSOFTWAREVERSIONS(versions.unique().collectFile(name: 'collated_versions.yml')) version_yaml = CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect() } - if (!(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains('multiqc'))) { + if (!(params.skip_tools && checkTools(params.skip_tools, 'multiqc'))) { workflow_summary = WorkflowSarek.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) From 748735a9ef4da57a2e2400c2c92580ffd4fbc985 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 22 Aug 2023 17:06:29 +0000 Subject: [PATCH 07/21] minor fixups --- nextflow.config | 2 +- workflows/sarek.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index 5c89398175..6725f97d12 100644 --- a/nextflow.config +++ b/nextflow.config @@ -390,7 +390,7 @@ includeConfig 'conf/modules/post_variant_calling.config' includeConfig 'conf/modules/annotate.config' def checkTools(parameter, tool) { - parameter.split(',').any{ it.toUpperCase().contains(tool) } + parameter.split(',').any{ it.toLowerCase().contains(tool) } } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/sarek.nf b/workflows/sarek.nf index fd429c9b09..2386507b5f 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -181,7 +181,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_tumor = ['ascat', 'controlfreec', 'mutect2', 'msisensorpro'] def tools_tumor_asked = [] tools_tumor.each{ tool -> - if (params.tools.split(',').toLowerCase().contains(tool)) tools_tumor_asked.add(tool) + if (params.tools.split(',').any{ it.toLowerCase().contains(tool) } ) tools_tumor_asked.add(tool) } if (!tools_tumor_asked.isEmpty()) { error('The sample-sheet only contains normal-samples, but the following tools, which were requested with "--tools", expect at least one tumor-sample : ' + tools_tumor_asked.join(", ")) @@ -192,7 +192,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] def requested_tools_requiring_normal_samples = [] tools_requiring_normal_samples.each{ tool_requiring_normal_samples -> - if (params.tools.split(',').toLowerCase().contains(tool_requiring_normal_samples)) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) + if (params.tools.split(',').any{ it.toLowerCase().contains(tool_requiring_normal_samples) } ) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) } if (!requested_tools_requiring_normal_samples.isEmpty()) { error('The sample-sheet only contains tumor-samples, but the following tools, which were requested by the option "tools", expect at least one normal-sample : ' + requested_tools_requiring_normal_samples.join(", ")) @@ -206,7 +206,7 @@ if (params.wes && !params.step == 'annotate') { else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") -if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').toLowerCase().contains("baserecalibrator"))) { +if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').any{ toLowerCase().contains("baserecalibrator") } )) { log.warn("DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap\nhttps://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode") } From 247e3ceceb87789249467d072c9135307a0cdc71 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 22 Aug 2023 17:12:56 +0000 Subject: [PATCH 08/21] Add method to Nextflow script in addition to config --- workflows/sarek.nf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 2386507b5f..ca704b0558 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -1308,6 +1308,13 @@ def flowcellLaneFromFastq(path) { return fcid } +// Check the parameters tools or skip_tools, then compare it against the provided tool +// Returns true/false based on whether 'tool' is found in 'parameter' +def checkTools(parameter, tool) { + parameter.split(',').any{ it.toLowerCase().contains(tool) } +} + + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END From 264d5ac48160706c44bdf197c7e722d34755f9fd Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:40:03 +0000 Subject: [PATCH 09/21] Update all tools checks to use function --- conf/modules/joint_germline.config | 2 +- conf/modules/sentieon_dedup.config | 2 +- conf/modules/sentieon_haplotyper.config | 2 +- conf/modules/sentieon_joint_germline.config | 2 +- .../bam_variant_calling_germline_all/main.nf | 20 +++++++++---------- .../bam_variant_calling_somatic_all/main.nf | 20 +++++++++---------- .../main.nf | 16 +++++++-------- .../main.nf | 4 ++-- subworkflows/local/vcf_annotate_all/main.nf | 6 +++--- workflows/sarek.nf | 8 ++++---- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/conf/modules/joint_germline.config b/conf/modules/joint_germline.config index 5905c482fd..d9b5795862 100644 --- a/conf/modules/joint_germline.config +++ b/conf/modules/joint_germline.config @@ -30,7 +30,7 @@ process { ] } - if (params.tools && params.tools.contains('haplotypecaller') && params.joint_germline) { + if (params.tools && params.checkTools(params.tools, 'haplotypecaller') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_GATK:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index 1dab001284..2f1b6d5437 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -34,7 +34,7 @@ process { ] } - if (params.tools && params.tools.contains('sentieon_dedup')) { + if (params.tools && params.checkTools(params.tools, 'sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index dc9f78ba86..7da97810ba 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -45,7 +45,7 @@ process { ] } - if (params.tools && params.tools.contains('sentieon_haplotyper')) { + if (params.tools && params.checkTools(params.tools, 'sentieon_haplotyper')) { withName: '.*BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER:VCF_VARIANT_FILTERING_GATK:FILTERVARIANTTRANCHES' { ext.prefix = {"${meta.id}.haplotyper"} ext.args = { "--info-key CNN_1D" } diff --git a/conf/modules/sentieon_joint_germline.config b/conf/modules/sentieon_joint_germline.config index c956ccba83..b024fcd02a 100644 --- a/conf/modules/sentieon_joint_germline.config +++ b/conf/modules/sentieon_joint_germline.config @@ -23,7 +23,7 @@ process { ] } - if (params.tools && params.tools.contains('sentieon_haplotyper') && params.joint_germline) { + if (params.tools && checkTools(params.tools, 'sentieon_haplotyper') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_SENTIEON:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 6ce8e45aa2..fe9c37b33d 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -57,7 +57,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_tiddit = Channel.empty() // BCFTOOLS MPILEUP - if (tools.split(',').contains('mpileup')) { + if (checkTools(params.tools, 'mpileup')) { BAM_VARIANT_CALLING_MPILEUP( cram, dict, @@ -69,7 +69,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // CNVKIT - if (tools.split(',').contains('cnvkit')) { + if (checkTools(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, [], cram ] }, @@ -82,7 +82,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // DEEPVARIANT - if (tools.split(',').contains('deepvariant')) { + if (checkTools(params.tools, 'deepvariant')) { BAM_VARIANT_CALLING_DEEPVARIANT( cram, dict, @@ -96,7 +96,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // FREEBAYES - if (tools.split(',').contains('freebayes')) { + if (checkTools(params.tools, 'freebayes')) { // Input channel is remapped to match input of module/subworkflow BAM_VARIANT_CALLING_FREEBAYES( // Remap channel to match module/subworkflow @@ -112,7 +112,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // HAPLOTYPECALLER - if (tools.split(',').contains('haplotypecaller')) { + if (checkTools(params.tools, 'haplotypecaller')) { BAM_VARIANT_CALLING_HAPLOTYPECALLER( cram, fasta, @@ -168,7 +168,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // MANTA - if (tools.split(',').contains('manta')) { + if (checkTools(params.tools, 'manta')) { BAM_VARIANT_CALLING_GERMLINE_MANTA ( cram, fasta, @@ -181,7 +181,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // SENTIEON HAPLOTYPER - if (tools.split(',').contains('sentieon_haplotyper')) { + if (checkTools(params.tools, 'sentieon_haplotyper')) { BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER( cram, fasta, @@ -198,7 +198,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { known_snps_vqsr, intervals, intervals_bed_combined_haplotypec, - (skip_tools && skip_tools.split(',').contains('haplotyper_filter')), + (skip_tools && checkTools(params.skip_tools, 'haplotyper_filter')), joint_germline, sentieon_haplotyper_emit_mode) @@ -231,7 +231,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // STRELKA - if (tools.split(',').contains('strelka')) { + if (checkTools(params.tools, 'strelka')) { BAM_VARIANT_CALLING_SINGLE_STRELKA( cram, dict, @@ -245,7 +245,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // TIDDIT - if (tools.split(',').contains('tiddit')) { + if (checkTools(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SINGLE_TIDDIT( cram, // Remap channel to match module/subworkflow diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 280c2277e5..1fa59ff1ed 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -53,7 +53,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_mutect2 = Channel.empty() vcf_tiddit = Channel.empty() - if (tools.split(',').contains('ascat')) { + if (checkTools(params.tools, 'ascat')) { BAM_VARIANT_CALLING_SOMATIC_ASCAT( cram, allele_files, @@ -68,7 +68,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // CONTROLFREEC - if (tools.split(',').contains('controlfreec')) { + if (checkTools(params.tools, 'controlfreec')) { // Remap channels to match module/subworkflow cram_normal = cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai ] } cram_tumor = cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, tumor_cram, tumor_crai ] } @@ -111,7 +111,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // CNVKIT - if (tools.split(',').contains('cnvkit')) { + if (checkTools(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, tumor_cram, normal_cram ] }, @@ -125,7 +125,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // FREEBAYES - if (tools.split(',').contains('freebayes')) { + if (checkTools(params.tools, 'freebayes')) { BAM_VARIANT_CALLING_FREEBAYES( cram, dict, @@ -139,7 +139,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MANTA - if (tools.split(',').contains('manta')) { + if (checkTools(params.tools, 'manta')) { BAM_VARIANT_CALLING_SOMATIC_MANTA( cram, fasta, @@ -152,9 +152,9 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // STRELKA - if (tools.split(',').contains('strelka')) { + if (checkTools(params.tools, 'strelka')) { // Remap channel to match module/subworkflow - cram_strelka = (tools.split(',').contains('manta')) ? + cram_strelka = (checkTools(params.tools, 'manta')) ? cram.join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf, failOnDuplicate: true, failOnMismatch: true).join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf_tbi, failOnDuplicate: true, failOnMismatch: true) : cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai, tumor_cram, tumor_crai, [], [] ] } @@ -172,7 +172,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MSISENSOR - if (tools.split(',').contains('msisensorpro')) { + if (checkTools(params.tools, 'msisensorpro')) { MSISENSORPRO_MSISOMATIC(cram.combine(intervals_bed_combined), fasta, msisensorpro_scan) versions = versions.mix(MSISENSORPRO_MSISOMATIC.out.versions) @@ -180,7 +180,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MUTECT2 - if (tools.split(',').contains('mutect2')) { + if (checkTools(params.tools, 'mutect2')) { BAM_VARIANT_CALLING_SOMATIC_MUTECT2( // Remap channel to match module/subworkflow cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, [ normal_cram, tumor_cram ], [ normal_crai, tumor_crai ] ] }, @@ -202,7 +202,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // TIDDIT - if (tools.split(',').contains('tiddit')) { + if (checkTools(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SOMATIC_TIDDIT( // Remap channel to match module/subworkflow cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai ] }, diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 0362d8750a..9d06bebb3b 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -48,7 +48,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_tiddit = Channel.empty() // MPILEUP - if (tools.split(',').contains('mpileup') || tools.split(',').contains('controlfreec')) { + if (checkTools(params.tools, 'mpileup') || checkTools(params.tools, 'controlfreec')) { BAM_VARIANT_CALLING_MPILEUP( cram, dict, @@ -60,7 +60,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // CONTROLFREEC (depends on MPILEUP) - if (tools.split(',').contains('controlfreec')) { + if (checkTools(params.tools, 'controlfreec')) { length_file = cf_chrom_len ?: fasta_fai BAM_VARIANT_CALLING_TUMOR_ONLY_CONTROLFREEC( @@ -79,7 +79,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // CNVKIT - if (tools.split(',').contains('cnvkit')) { + if (checkTools(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT ( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, cram, [] ] }, @@ -93,7 +93,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // FREEBAYES - if (tools.split(',').contains('freebayes')) { + if (checkTools(params.tools, 'freebayes')) { BAM_VARIANT_CALLING_FREEBAYES( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, cram, crai, [], [] ] }, @@ -108,7 +108,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // MUTECT2 - if (tools.split(',').contains('mutect2')) { + if (checkTools(params.tools, 'mutect2')) { BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2( cram, // Remap channel to match module/subworkflow @@ -129,7 +129,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // MANTA - if (tools.split(',').contains('manta')) { + if (checkTools(params.tools, 'manta')) { BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA( cram, // Remap channel to match module/subworkflow @@ -145,7 +145,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // STRELKA - if (tools.split(',').contains('strelka')) { + if (checkTools(params.tools, 'strelka')) { BAM_VARIANT_CALLING_SINGLE_STRELKA( cram, dict, @@ -159,7 +159,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // TIDDIT - if (tools.split(',').contains('tiddit')) { + if (checkTools(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SINGLE_TIDDIT( cram, // Remap channel to match module/subworkflow diff --git a/subworkflows/local/channel_baserecalibrator_create_csv/main.nf b/subworkflows/local/channel_baserecalibrator_create_csv/main.nf index 8bbfacc85c..33a8f8be50 100644 --- a/subworkflows/local/channel_baserecalibrator_create_csv/main.nf +++ b/subworkflows/local/channel_baserecalibrator_create_csv/main.nf @@ -12,7 +12,7 @@ workflow CHANNEL_BASERECALIBRATOR_CREATE_CSV { main: // Creating csv files to restart from this step - if ( tools && tools.split(',').contains('sentieon_dedup') ) { + if ( tools && checkTools(params.tools, 'sentieon_dedup') ) { cram_table_bqsr.collectFile(keepHeader: true, skip: 1, sort: true, storeDir: "${outdir}/csv") { meta, cram, crai, table -> patient = meta.patient @@ -30,7 +30,7 @@ workflow CHANNEL_BASERECALIBRATOR_CREATE_CSV { ["markduplicates.csv", "patient,sex,status,sample,${type},${type_index},table\n${patient},${sex},${status},${sample},${cram},${crai},${table}\n"] } - } else if (!(skip_tools && (skip_tools.split(',').contains('markduplicates')))) { + } else if ( !(skip_tools && checkTools(params.skip_tools, 'markduplicates')) ) { cram_table_bqsr.collectFile(keepHeader: true, skip: 1, sort: true, storeDir: "${outdir}/csv") { meta, cram, crai, table -> patient = meta.patient diff --git a/subworkflows/local/vcf_annotate_all/main.nf b/subworkflows/local/vcf_annotate_all/main.nf index 5b759d8818..cb79014ca1 100644 --- a/subworkflows/local/vcf_annotate_all/main.nf +++ b/subworkflows/local/vcf_annotate_all/main.nf @@ -26,7 +26,7 @@ workflow VCF_ANNOTATE_ALL { json_ann = Channel.empty() versions = Channel.empty() - if (tools.split(',').contains('merge') || tools.split(',').contains('snpeff')) { + if (checkTools(params.tools, 'merge') || checkTools(params.tools, 'snpeff')) { VCF_ANNOTATE_SNPEFF(vcf, snpeff_db, snpeff_cache) reports = reports.mix(VCF_ANNOTATE_SNPEFF.out.reports) @@ -34,7 +34,7 @@ workflow VCF_ANNOTATE_ALL { versions = versions.mix(VCF_ANNOTATE_SNPEFF.out.versions) } - if (tools.split(',').contains('merge')) { + if (checkTools(params.tools, 'merge')) { vcf_ann_for_merge = VCF_ANNOTATE_SNPEFF.out.vcf_tbi.map{ meta, vcf, tbi -> [ meta, vcf, [] ] } VCF_ANNOTATE_MERGE(vcf_ann_for_merge, fasta, vep_genome, vep_species, vep_cache_version, vep_cache, vep_extra_files) @@ -43,7 +43,7 @@ workflow VCF_ANNOTATE_ALL { versions = versions.mix(VCF_ANNOTATE_MERGE.out.versions) } - if (tools.split(',').contains('vep')) { + if (checkTools(params.tools, 'vep')) { vcf_for_vep = vcf.map{ meta, vcf -> [ meta, vcf, [] ] } VCF_ANNOTATE_ENSEMBLVEP(vcf_for_vep, fasta, vep_genome, vep_species, vep_cache_version, vep_cache, vep_extra_files) diff --git a/workflows/sarek.nf b/workflows/sarek.nf index ca704b0558..c62b387369 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -181,7 +181,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_tumor = ['ascat', 'controlfreec', 'mutect2', 'msisensorpro'] def tools_tumor_asked = [] tools_tumor.each{ tool -> - if (params.tools.split(',').any{ it.toLowerCase().contains(tool) } ) tools_tumor_asked.add(tool) + if ( checkTools(params.tools, tool) ) tools_tumor_asked.add(tool) } if (!tools_tumor_asked.isEmpty()) { error('The sample-sheet only contains normal-samples, but the following tools, which were requested with "--tools", expect at least one tumor-sample : ' + tools_tumor_asked.join(", ")) @@ -192,7 +192,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] def requested_tools_requiring_normal_samples = [] tools_requiring_normal_samples.each{ tool_requiring_normal_samples -> - if (params.tools.split(',').any{ it.toLowerCase().contains(tool_requiring_normal_samples) } ) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) + if ( checkTools(params.tools, tool_requiring_normal_samples) ) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) } if (!requested_tools_requiring_normal_samples.isEmpty()) { error('The sample-sheet only contains tumor-samples, but the following tools, which were requested by the option "tools", expect at least one normal-sample : ' + requested_tools_requiring_normal_samples.join(", ")) @@ -206,7 +206,7 @@ if (params.wes && !params.step == 'annotate') { else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") -if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && params.skip_tools.split(',').any{ toLowerCase().contains("baserecalibrator") } )) { +if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && checkTools(params.skip_tools, "baserecalibrator") )) { log.warn("DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap\nhttps://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode") } @@ -214,7 +214,7 @@ if (params.step == 'mapping' && params.aligner.contains("sentieon-bwamem") && pa error("Sentieon BWA is currently not compatible with FGBio UMI handeling. Please choose a different aligner.") } -if (params.tools && params.tools.contains("sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { +if (params.tools && params.checkTools(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { error("When setting the option `--joint_germline` and including `sentieon_haplotyper` among the requested tools, please set `--sentieon_haplotyper_emit_mode` to include `gvcf`.") } From 3a702ac377761deda18df0fe7436793b80234dc0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:41:05 +0000 Subject: [PATCH 10/21] Replace 'contains' with 'equals' for tool checks --- nextflow.config | 2 +- workflows/sarek.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 6725f97d12..d6b183878e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -390,7 +390,7 @@ includeConfig 'conf/modules/post_variant_calling.config' includeConfig 'conf/modules/annotate.config' def checkTools(parameter, tool) { - parameter.split(',').any{ it.toLowerCase().contains(tool) } + parameter.split(',').any{ it.toLowerCase().equals(tool) } } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/sarek.nf b/workflows/sarek.nf index c62b387369..9b0a55be4a 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -1311,7 +1311,7 @@ def flowcellLaneFromFastq(path) { // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' def checkTools(parameter, tool) { - parameter.split(',').any{ it.toLowerCase().contains(tool) } + parameter.split(',').any{ it.toLowerCase().equals(tool) } } From 5ca3a85a378f694e323fe89e9d4da7de58b3864e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:44:28 +0000 Subject: [PATCH 11/21] Rename checkTools to checkInParam --- conf/modules/aligner.config | 8 +-- conf/modules/annotate.config | 14 ++--- conf/modules/ascat.config | 2 +- conf/modules/cnvkit.config | 6 +-- conf/modules/controlfreec.config | 2 +- conf/modules/deepvariant.config | 2 +- conf/modules/freebayes.config | 4 +- conf/modules/haplotypecaller.config | 4 +- conf/modules/joint_germline.config | 2 +- conf/modules/manta.config | 2 +- conf/modules/markduplicates.config | 14 ++--- conf/modules/modules.config | 18 +++---- conf/modules/mpileup.config | 6 +-- conf/modules/mutect2.config | 4 +- conf/modules/prepare_cache.config | 4 +- conf/modules/prepare_genome.config | 16 +++--- conf/modules/recalibrate.config | 2 +- conf/modules/sentieon_dedup.config | 8 +-- conf/modules/sentieon_haplotyper.config | 4 +- conf/modules/sentieon_joint_germline.config | 2 +- conf/modules/strelka.config | 2 +- conf/modules/tiddit.config | 4 +- nextflow.config | 4 +- .../bam_variant_calling_germline_all/main.nf | 20 +++---- .../bam_variant_calling_somatic_all/main.nf | 20 +++---- .../main.nf | 16 +++--- .../main.nf | 4 +- subworkflows/local/vcf_annotate_all/main.nf | 6 +-- workflows/sarek.nf | 54 +++++++++---------- 29 files changed, 127 insertions(+), 127 deletions(-) diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index 9667c0d832..704d9080da 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -46,8 +46,8 @@ process { if (params.save_output_as_bam && ( params.save_mapped || - (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && - !(params.tools && checkTools(params.tools, 'sentieon_dedup')) + (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && + !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) ) { "mapped/${meta.id}/${it}" } else { null } @@ -60,7 +60,7 @@ process { // However if it's skipped, reads need to be coordinate-sorted // Only name sort if Spark for Markduplicates + duplicate marking is not skipped // Currently SENTIEON_BWAMEM only supports coordinate sorting the reads. - ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !checkTools(params.skip_tools, 'markduplicates'))) ? '-n' : '' } + ext.args2 = { params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates') && (!params.skip_tools || (params.skip_tools && !checkInParam(params.skip_tools, 'markduplicates'))) ? '-n' : '' } } withName: "BWAMEM.*_MEM|SENTIEON_BWAMEM" { @@ -75,7 +75,7 @@ process { path: { "${params.outdir}/preprocessing/" }, pattern: "*{bam,bai}", // Only save if (save_output_as_bam AND (no_markduplicates OR save_mapped )) - saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && checkTools(params.skip_tools, 'markduplicates'))) ? "mapped/${meta.id}/${it}" : null } + saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && checkInParam(params.skip_tools, 'markduplicates'))) ? "mapped/${meta.id}/${it}" : null } ] } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index a3d3132866..7caca9262b 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -16,7 +16,7 @@ process { // SNPEFF - if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge'))) { + if (params.tools && (checkInParam(params.tools, 'snpeff') || checkInParam(params.tools, 'merge'))) { withName: 'SNPEFF_SNPEFF' { ext.prefix = { vcf.baseName - ".vcf" + "_snpEff" } ext.args = '-nodownload -canon -v' @@ -25,14 +25,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/snpeff/${meta.variantcaller}/${meta.id}/" }, pattern: "*{csv,html,genes.txt}", - saveAs: { checkTools(params.tools, 'snpeff') ? it : null } + saveAs: { checkInParam(params.tools, 'snpeff') ? it : null } ] ] } } // VEP - if (params.tools && (checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge'))) { + if (params.tools && (checkInParam(params.tools, 'vep') || checkInParam(params.tools, 'merge'))) { withName: 'ENSEMBLVEP_VEP' { ext.args = { [ (params.vep_dbnsfp && params.dbnsfp && !params.dbnsfp_consequence) ? "--plugin dbNSFP,${params.dbnsfp.split("/")[-1]},${params.dbnsfp_fields}" : '', @@ -61,7 +61,7 @@ process { } // SNPEFF THEN VEP - if (params.tools && checkTools(params.tools, 'merge')) { + if (params.tools && checkInParam(params.tools, 'merge')) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_MERGE:ENSEMBLVEP_VEP" { // If merge: Output file will have format *_snpEff_VEP.ann.vcf, *_snpEff_VEP.ann.json or *_snpEff_VEP.ann.tab ext.prefix = { vcf.baseName - ".ann.vcf" + "_VEP.ann" } @@ -69,7 +69,7 @@ process { } // ALL ANNOTATION TOOLS - if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge'))) { + if (params.tools && (checkInParam(params.tools, 'snpeff') || checkInParam(params.tools, 'vep') || checkInParam(params.tools, 'merge'))) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:.*:(TABIX_BGZIPTABIX|TABIX_TABIX)" { ext.prefix = { input.name - ".vcf" } publishDir = [ @@ -80,13 +80,13 @@ process { } } - if (params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge'))) { + if (params.tools && (checkInParam(params.tools, 'snpeff') || checkInParam(params.tools, 'merge'))) { withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_SNPEFF:TABIX_BGZIPTABIX' { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, pattern: "*{gz,gz.tbi}", - saveAs: { checkTools(params.tools, 'snpeff') ? it : null } + saveAs: { checkInParam(params.tools, 'snpeff') ? it : null } ] } } diff --git a/conf/modules/ascat.config b/conf/modules/ascat.config index 080f47da85..9e1942216c 100644 --- a/conf/modules/ascat.config +++ b/conf/modules/ascat.config @@ -26,7 +26,7 @@ process { "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual ]} - ext.when = { params.tools && checkTools(params.tools, 'ascat') } + ext.when = { params.tools && checkInParam(params.tools, 'ascat') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/ascat/${meta.id}/" }, diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index 85143e727a..51a26d88bb 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -17,7 +17,7 @@ process { // PREPARE REFERENCE CNVKIT withName: 'CNVKIT_ANTITARGET' { - ext.when = { params.tools && checkTools(params.tools, 'cnvkit') } + ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -28,7 +28,7 @@ process { withName: 'CNVKIT_REFERENCE' { ext.prefix = "cnvkit" - ext.when = { params.tools && checkTools(params.tools, 'cnvkit') && !params.cnvkit_reference } + ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') && !params.cnvkit_reference } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -40,7 +40,7 @@ process { // CNVKIT withName: 'CNVKIT_BATCH' { ext.args = { params.wes ? "--method hybrid --diagram --scatter" : "--method wgs --diagram --scatter" } - ext.when = { params.tools && checkTools(params.tools, 'cnvkit') } + ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, diff --git a/conf/modules/controlfreec.config b/conf/modules/controlfreec.config index 254eef8d27..70b7709a55 100644 --- a/conf/modules/controlfreec.config +++ b/conf/modules/controlfreec.config @@ -24,7 +24,7 @@ process { } withName: 'FREEC_.*' { - ext.when = { params.tools && checkTools(params.tools, 'controlfreec') } + ext.when = { params.tools && checkInParam(params.tools, 'controlfreec') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/controlfreec/${meta.id}/" }, diff --git a/conf/modules/deepvariant.config b/conf/modules/deepvariant.config index 3520f6fcab..e5c84ec939 100644 --- a/conf/modules/deepvariant.config +++ b/conf/modules/deepvariant.config @@ -18,7 +18,7 @@ process { withName: 'DEEPVARIANT' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.deepvariant" : "${meta.id}.deepvariant.${intervals.simpleName}" } ext.args = { params.wes ? "--model_type WES" : "--model_type WGS" } - ext.when = { params.tools && checkTools(params.tools, 'deepvariant') } + ext.when = { params.tools && checkInParam(params.tools, 'deepvariant') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 41960b3111..ba9a2342e0 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -28,7 +28,7 @@ process { ext.args = '--min-alternate-fraction 0.1 --min-mapping-quality 1' //To make sure no naming conflicts ensure with module BCFTOOLS_SORT & the naming being correct in the output folder ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}" : "${meta.id}.${target_bed.simpleName}" } - ext.when = { params.tools && checkTools(params.tools, 'freebayes') } + ext.when = { params.tools && checkInParam(params.tools, 'freebayes') } publishDir = [ enabled: false ] @@ -53,7 +53,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkTools(params.tools, 'freebayes')) { + if (params.tools && checkInParam(params.tools, 'freebayes')) { withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_FREEBAYES:FREEBAYES' { ext.args = "--pooled-continuous \ --pooled-discrete \ diff --git a/conf/modules/haplotypecaller.config b/conf/modules/haplotypecaller.config index f17853ced6..2ec07370e9 100644 --- a/conf/modules/haplotypecaller.config +++ b/conf/modules/haplotypecaller.config @@ -18,7 +18,7 @@ process { withName: 'GATK4_HAPLOTYPECALLER' { ext.args = { params.joint_germline ? "-ERC GVCF" : "" } ext.prefix = { meta.num_intervals <= 1 ? ( params.joint_germline ? "${meta.id}.haplotypecaller.g" : "${meta.id}.haplotypecaller" ) : ( params.joint_germline ? "${meta.id}.haplotypecaller.${intervals.simpleName}.g" :"${meta.id}.haplotypecaller.${intervals.simpleName}" ) } - ext.when = { params.tools && checkTools(params.tools, 'haplotypecaller') } + ext.when = { params.tools && checkInParam(params.tools, 'haplotypecaller') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, @@ -53,7 +53,7 @@ process { ] } - if (params.tools && checkTools(params.tools, 'haplotypecaller')) { + if (params.tools && checkInParam(params.tools, 'haplotypecaller')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_HAPLOTYPECALLER:BAM_MERGE_INDEX_SAMTOOLS:(MERGE_BAM|INDEX_MERGE_BAM)' { ext.prefix = { "${meta.id}.realigned" } publishDir = [ diff --git a/conf/modules/joint_germline.config b/conf/modules/joint_germline.config index d9b5795862..74c480eef3 100644 --- a/conf/modules/joint_germline.config +++ b/conf/modules/joint_germline.config @@ -30,7 +30,7 @@ process { ] } - if (params.tools && params.checkTools(params.tools, 'haplotypecaller') && params.joint_germline) { + if (params.tools && params.checkInParam(params.tools, 'haplotypecaller') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_GATK:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/manta.config b/conf/modules/manta.config index 3bee4b7bef..45717a3932 100644 --- a/conf/modules/manta.config +++ b/conf/modules/manta.config @@ -14,7 +14,7 @@ // MANTA process { - if (params.tools && checkTools(params.tools, 'manta')) { + if (params.tools && checkInParam(params.tools, 'manta')) { withName: 'MANTA_GERMLINE|MANTA_TUMORONLY|MANTA_SOMATIC' { ext.args = { params.wes ? "--exome" : "" } ext.prefix = { "${meta.id}.manta" } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index 0f35f9a51d..9d1840467e 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -34,7 +34,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:(BAM_MARKDUPLICATES|BAM_MARKDUPLICATES_SPARK):CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.md.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -47,8 +47,8 @@ process { // Run only when mapping should be saved as CRAM or when no MD is done ext.when = (params.save_mapped && !params.save_output_as_bam) || ( - (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && - !(params.tools && checkTools(params.tools, 'sentieon_dedup')) + (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && + !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) ) ext.prefix = { "${meta.id}.sorted" } publishDir = [ @@ -62,7 +62,7 @@ process { withName: 'GATK4_ESTIMATELIBRARYCOMPLEXITY' { ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates_report')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates_report')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/markduplicates/${meta.id}" }, @@ -73,7 +73,7 @@ process { withName: 'GATK4_MARKDUPLICATES' { ext.args = '-REMOVE_DUPLICATES false -VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -85,7 +85,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*metrics", - saveAs: { !(params.skip_tools && checkTools(params.skip_tools, 'markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} ] ] } @@ -112,7 +112,7 @@ process { withName: 'NFCORE_SAREK:SAREK:CRAM_TO_BAM' { ext.when = { params.save_output_as_bam } - if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { + if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { ext.prefix = { "${meta.id}.dedup" } publishDir = [ enabled: params.save_output_as_bam, diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 5c35b8bdbc..ff5cc2cfa1 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -30,7 +30,7 @@ process { // QC withName: 'FASTQC' { ext.args = '--quiet' - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'fastqc')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'fastqc')) } publishDir = [ [ path: { "${params.outdir}/reports/fastqc/${meta.id}" }, @@ -41,7 +41,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_NO_MD:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.sorted.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -53,15 +53,15 @@ process { withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { - if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { + if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { "${meta.id}.dedup" - } else if (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) { + } else if (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) { "${meta.id}.sorted" } else { "${meta.id}.md" } } - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'mosdepth')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'mosdepth')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/mosdepth/${meta.id}" }, @@ -69,14 +69,14 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:MOSDEPTH' { ext.prefix = { "${meta.id}.recal" } } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:SAMTOOLS_STATS' { ext.prefix = { "${meta.id}.recal.cram" } - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/samtools/${meta.id}" }, @@ -87,7 +87,7 @@ process { // VCF withName: 'BCFTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'bcftools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'bcftools')) } ext.prefix = { vcf.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, @@ -97,7 +97,7 @@ process { } withName: 'VCFTOOLS_.*' { - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'vcftools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'vcftools')) } ext.prefix = { variant_file.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/mpileup.config b/conf/modules/mpileup.config index e8cc547ea6..f2014dd3ef 100644 --- a/conf/modules/mpileup.config +++ b/conf/modules/mpileup.config @@ -23,7 +23,7 @@ process { withName: 'BCFTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.bcftools" : "${meta.id}_${intervals.simpleName}.bcftools" } - ext.when = { params.tools && checkTools(params.tools, 'mpileup') } + ext.when = { params.tools && checkInParam(params.tools, 'mpileup') } ext.args2 = "--multiallelic-caller" ext.args3 = "-i 'count(GT==\"RR\")==0'" // only report non homozygous reference variants publishDir = [ @@ -44,7 +44,7 @@ process { } withName: 'SAMTOOLS_MPILEUP' { - ext.when = { params.tools && checkTools(params.tools, 'controlfreec') } + ext.when = { params.tools && checkInParam(params.tools, 'controlfreec') } publishDir = [ enabled: false ] @@ -52,7 +52,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkTools(params.tools, 'controlfreec')) { + if (params.tools && checkInParam(params.tools, 'controlfreec')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_MPILEUP:SAMTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } } diff --git a/conf/modules/mutect2.config b/conf/modules/mutect2.config index b0c3767d05..329b3e151e 100644 --- a/conf/modules/mutect2.config +++ b/conf/modules/mutect2.config @@ -14,11 +14,11 @@ // MUTECT2 process { - if (params.tools && checkTools(params.tools, 'mutect2')) { + if (params.tools && checkInParam(params.tools, 'mutect2')) { withName: 'GATK4_MUTECT2' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.mutect2" : "${meta.id}.mutect2.${intervals.simpleName}" } - ext.when = { params.tools && checkTools(params.tools, 'mutect2') } + ext.when = { params.tools && checkInParam(params.tools, 'mutect2') } ext.args = { params.ignore_soft_clipped_bases ? "--dont-use-soft-clipped-bases true --f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" : "--f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_cache.config b/conf/modules/prepare_cache.config index 382f1f4f63..67aa847688 100644 --- a/conf/modules/prepare_cache.config +++ b/conf/modules/prepare_cache.config @@ -17,7 +17,7 @@ process { // SNPEFF withName: 'SNPEFF_DOWNLOAD' { - ext.when = { params.tools && (checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'merge')) } + ext.when = { params.tools && (checkInParam(params.tools, 'snpeff') || checkInParam(params.tools, 'merge')) } publishDir = [ mode: params.publish_dir_mode, path: { params.outdir_cache ? "${params.outdir_cache}/": "${params.outdir}/cache/" } @@ -26,7 +26,7 @@ process { // VEP withName: 'ENSEMBLVEP_DOWNLOAD' { - ext.when = { params.tools && (checkTools(params.tools, 'vep') || checkTools(params.tools, 'merge')) } + ext.when = { params.tools && (checkInParam(params.tools, 'vep') || checkInParam(params.tools, 'merge')) } ext.args = '--AUTO c --CONVERT --NO_BIOPERL --NO_HTSLIB --NO_TEST --NO_UPDATE' publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 48694fd128..273e453f27 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -56,7 +56,7 @@ process { } withName: 'MSISENSORPRO_SCAN' { - ext.when = { params.tools && checkTools(params.tools, 'msisensorpro') } + ext.when = { params.tools && checkInParam(params.tools, 'msisensorpro') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -76,7 +76,7 @@ process { } withName: 'TABIX_DBSNP' { - ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (checkTools(params.tools, 'controlfreec') || checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper') || checkTools(params.tools, 'mutect2'))) } + ext.when = { !params.dbsnp_tbi && params.dbsnp && ((params.step == "mapping" || params.step == "markduplicates" || params.step == "prepare_recalibration") || params.tools && (checkInParam(params.tools, 'controlfreec') || checkInParam(params.tools, 'haplotypecaller') || checkInParam(params.tools, 'sentieon_haplotyper') || checkInParam(params.tools, 'mutect2'))) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -86,7 +86,7 @@ process { } withName: 'TABIX_GERMLINE_RESOURCE' { - ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && checkTools(params.tools, 'mutect2') } + ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && checkInParam(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -96,7 +96,7 @@ process { } withName: 'TABIX_KNOWN_INDELS' { - ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) ) } + ext.when = { !params.known_indels_tbi && params.known_indels && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkInParam(params.tools, 'haplotypecaller') || checkInParam(params.tools, 'sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -106,7 +106,7 @@ process { } withName: 'TABIX_KNOWN_SNPS' { - ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) ) } + ext.when = { !params.known_snps_tbi && params.known_snps && (params.step == 'mapping' || params.step == "markduplicates" || params.step == 'prepare_recalibration' || (params.tools && (checkInParam(params.tools, 'haplotypecaller') || checkInParam(params.tools, 'sentieon_haplotyper'))) ) } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -116,7 +116,7 @@ process { } withName: 'TABIX_PON' { - ext.when = { !params.pon_tbi && params.pon && params.tools && checkTools(params.tools, 'mutect2') } + ext.when = { !params.pon_tbi && params.pon && params.tools && checkInParam(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -126,13 +126,13 @@ process { } withName: 'UNZIP_ALLELES|UNZIP_LOCI|UNZIP_GC|UNZIP_RT' { - ext.when = { params.tools && checkTools(params.tools, 'ascat')} + ext.when = { params.tools && checkInParam(params.tools, 'ascat')} publishDir = [ enabled: false ] } withName: 'UNTAR_CHR_DIR' { - ext.when = { params.tools && checkTools(params.tools, 'controlfreec')} + ext.when = { params.tools && checkInParam(params.tools, 'controlfreec')} } } diff --git a/conf/modules/recalibrate.config b/conf/modules/recalibrate.config index 5608994626..3ce904a35e 100644 --- a/conf/modules/recalibrate.config +++ b/conf/modules/recalibrate.config @@ -26,7 +26,7 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:(BAM_APPLYBQSR|BAM_APPLYBQSR_SPARK):CRAM_MERGE_INDEX_SAMTOOLS:MERGE_CRAM' { ext.prefix = { "${meta.id}.recal" } ext.when = { meta.num_intervals > 1 } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index 2f1b6d5437..e48ec89c20 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_DEDUP' { ext.prefix = { "${meta.id}.dedup" } - ext.when = { params.tools && checkTools(params.tools, 'sentieon_dedup') } + ext.when = { params.tools && checkInParam(params.tools, 'sentieon_dedup') } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -29,14 +29,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*{metrics,metrics.multiqc.tsv}", - saveAs: { !(params.skip_tools && checkTools(params.skip_tools, 'sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} + saveAs: { !(params.skip_tools && checkInParam(params.skip_tools, 'sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} ] ] } - if (params.tools && params.checkTools(params.tools, 'sentieon_dedup')) { + if (params.tools && params.checkInParam(params.tools, 'sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkTools(params.skip_tools, 'samtools')) } + ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index 7da97810ba..6690f151a4 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_HAPLOTYPER' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.haplotyper" : "${meta.id}.haplotyper.${intervals.simpleName}" } - ext.when = { params.tools && checkTools(params.tools, 'sentieon_haplotyper') } + ext.when = { params.tools && checkInParam(params.tools, 'sentieon_haplotyper') } publishDir = [ enabled: !params.joint_germline, mode: params.publish_dir_mode, @@ -45,7 +45,7 @@ process { ] } - if (params.tools && params.checkTools(params.tools, 'sentieon_haplotyper')) { + if (params.tools && params.checkInParam(params.tools, 'sentieon_haplotyper')) { withName: '.*BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER:VCF_VARIANT_FILTERING_GATK:FILTERVARIANTTRANCHES' { ext.prefix = {"${meta.id}.haplotyper"} ext.args = { "--info-key CNN_1D" } diff --git a/conf/modules/sentieon_joint_germline.config b/conf/modules/sentieon_joint_germline.config index b024fcd02a..95eea7ed39 100644 --- a/conf/modules/sentieon_joint_germline.config +++ b/conf/modules/sentieon_joint_germline.config @@ -23,7 +23,7 @@ process { ] } - if (params.tools && checkTools(params.tools, 'sentieon_haplotyper') && params.joint_germline) { + if (params.tools && checkInParam(params.tools, 'sentieon_haplotyper') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_SENTIEON:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/strelka.config b/conf/modules/strelka.config index a494cdccd3..0b23b2f0e7 100644 --- a/conf/modules/strelka.config +++ b/conf/modules/strelka.config @@ -18,7 +18,7 @@ process { withName: 'STRELKA_.*' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.strelka" : "${meta.id}.strelka.${target_bed.simpleName}" } ext.args = { params.wes ? "--exome" : "" } - ext.when = { params.tools && checkTools(params.tools, 'strelka') } + ext.when = { params.tools && checkInParam(params.tools, 'strelka') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/tiddit.config b/conf/modules/tiddit.config index 1f33c34888..d58e091e30 100644 --- a/conf/modules/tiddit.config +++ b/conf/modules/tiddit.config @@ -18,7 +18,7 @@ process { withName: 'TIDDIT_SV' { ext.args = { bwa_index ? "" : "--skip_assembly" } ext.prefix = { "${meta.id}.tiddit" } - ext.when = { params.tools && checkTools(params.tools, 'tiddit') } + ext.when = { params.tools && checkInParam(params.tools, 'tiddit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/tiddit/${meta.id}/" }, @@ -36,7 +36,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkTools(params.tools, 'tiddit')) { + if (params.tools && checkInParam(params.tools, 'tiddit')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_SOMATIC_TIDDIT:TIDDIT_NORMAL:TABIX_BGZIP_TIDDIT_SV' { ext.prefix = {"${meta.id}.tiddit.normal"} } diff --git a/nextflow.config b/nextflow.config index d6b183878e..be60d8bba0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -389,8 +389,8 @@ includeConfig 'conf/modules/post_variant_calling.config' //annotate includeConfig 'conf/modules/annotate.config' -def checkTools(parameter, tool) { - parameter.split(',').any{ it.toLowerCase().equals(tool) } +def checkInParam(parameter, checkValue) { + parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } } // Function to ensure that resource requirements don't go beyond diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index fe9c37b33d..21080be682 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -57,7 +57,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_tiddit = Channel.empty() // BCFTOOLS MPILEUP - if (checkTools(params.tools, 'mpileup')) { + if (checkInParam(params.tools, 'mpileup')) { BAM_VARIANT_CALLING_MPILEUP( cram, dict, @@ -69,7 +69,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // CNVKIT - if (checkTools(params.tools, 'cnvkit')) { + if (checkInParam(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, [], cram ] }, @@ -82,7 +82,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // DEEPVARIANT - if (checkTools(params.tools, 'deepvariant')) { + if (checkInParam(params.tools, 'deepvariant')) { BAM_VARIANT_CALLING_DEEPVARIANT( cram, dict, @@ -96,7 +96,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // FREEBAYES - if (checkTools(params.tools, 'freebayes')) { + if (checkInParam(params.tools, 'freebayes')) { // Input channel is remapped to match input of module/subworkflow BAM_VARIANT_CALLING_FREEBAYES( // Remap channel to match module/subworkflow @@ -112,7 +112,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // HAPLOTYPECALLER - if (checkTools(params.tools, 'haplotypecaller')) { + if (checkInParam(params.tools, 'haplotypecaller')) { BAM_VARIANT_CALLING_HAPLOTYPECALLER( cram, fasta, @@ -168,7 +168,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // MANTA - if (checkTools(params.tools, 'manta')) { + if (checkInParam(params.tools, 'manta')) { BAM_VARIANT_CALLING_GERMLINE_MANTA ( cram, fasta, @@ -181,7 +181,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // SENTIEON HAPLOTYPER - if (checkTools(params.tools, 'sentieon_haplotyper')) { + if (checkInParam(params.tools, 'sentieon_haplotyper')) { BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER( cram, fasta, @@ -198,7 +198,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { known_snps_vqsr, intervals, intervals_bed_combined_haplotypec, - (skip_tools && checkTools(params.skip_tools, 'haplotyper_filter')), + (skip_tools && checkInParam(params.skip_tools, 'haplotyper_filter')), joint_germline, sentieon_haplotyper_emit_mode) @@ -231,7 +231,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // STRELKA - if (checkTools(params.tools, 'strelka')) { + if (checkInParam(params.tools, 'strelka')) { BAM_VARIANT_CALLING_SINGLE_STRELKA( cram, dict, @@ -245,7 +245,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { } // TIDDIT - if (checkTools(params.tools, 'tiddit')) { + if (checkInParam(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SINGLE_TIDDIT( cram, // Remap channel to match module/subworkflow diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 1fa59ff1ed..bf5fdc2108 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -53,7 +53,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_mutect2 = Channel.empty() vcf_tiddit = Channel.empty() - if (checkTools(params.tools, 'ascat')) { + if (checkInParam(params.tools, 'ascat')) { BAM_VARIANT_CALLING_SOMATIC_ASCAT( cram, allele_files, @@ -68,7 +68,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // CONTROLFREEC - if (checkTools(params.tools, 'controlfreec')) { + if (checkInParam(params.tools, 'controlfreec')) { // Remap channels to match module/subworkflow cram_normal = cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai ] } cram_tumor = cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, tumor_cram, tumor_crai ] } @@ -111,7 +111,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // CNVKIT - if (checkTools(params.tools, 'cnvkit')) { + if (checkInParam(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, tumor_cram, normal_cram ] }, @@ -125,7 +125,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // FREEBAYES - if (checkTools(params.tools, 'freebayes')) { + if (checkInParam(params.tools, 'freebayes')) { BAM_VARIANT_CALLING_FREEBAYES( cram, dict, @@ -139,7 +139,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MANTA - if (checkTools(params.tools, 'manta')) { + if (checkInParam(params.tools, 'manta')) { BAM_VARIANT_CALLING_SOMATIC_MANTA( cram, fasta, @@ -152,9 +152,9 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // STRELKA - if (checkTools(params.tools, 'strelka')) { + if (checkInParam(params.tools, 'strelka')) { // Remap channel to match module/subworkflow - cram_strelka = (checkTools(params.tools, 'manta')) ? + cram_strelka = (checkInParam(params.tools, 'manta')) ? cram.join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf, failOnDuplicate: true, failOnMismatch: true).join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf_tbi, failOnDuplicate: true, failOnMismatch: true) : cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai, tumor_cram, tumor_crai, [], [] ] } @@ -172,7 +172,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MSISENSOR - if (checkTools(params.tools, 'msisensorpro')) { + if (checkInParam(params.tools, 'msisensorpro')) { MSISENSORPRO_MSISOMATIC(cram.combine(intervals_bed_combined), fasta, msisensorpro_scan) versions = versions.mix(MSISENSORPRO_MSISOMATIC.out.versions) @@ -180,7 +180,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // MUTECT2 - if (checkTools(params.tools, 'mutect2')) { + if (checkInParam(params.tools, 'mutect2')) { BAM_VARIANT_CALLING_SOMATIC_MUTECT2( // Remap channel to match module/subworkflow cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, [ normal_cram, tumor_cram ], [ normal_crai, tumor_crai ] ] }, @@ -202,7 +202,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { } // TIDDIT - if (checkTools(params.tools, 'tiddit')) { + if (checkInParam(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SOMATIC_TIDDIT( // Remap channel to match module/subworkflow cram.map{ meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [ meta, normal_cram, normal_crai ] }, diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 9d06bebb3b..602ba4db35 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -48,7 +48,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_tiddit = Channel.empty() // MPILEUP - if (checkTools(params.tools, 'mpileup') || checkTools(params.tools, 'controlfreec')) { + if (checkInParam(params.tools, 'mpileup') || checkInParam(params.tools, 'controlfreec')) { BAM_VARIANT_CALLING_MPILEUP( cram, dict, @@ -60,7 +60,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // CONTROLFREEC (depends on MPILEUP) - if (checkTools(params.tools, 'controlfreec')) { + if (checkInParam(params.tools, 'controlfreec')) { length_file = cf_chrom_len ?: fasta_fai BAM_VARIANT_CALLING_TUMOR_ONLY_CONTROLFREEC( @@ -79,7 +79,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // CNVKIT - if (checkTools(params.tools, 'cnvkit')) { + if (checkInParam(params.tools, 'cnvkit')) { BAM_VARIANT_CALLING_CNVKIT ( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, cram, [] ] }, @@ -93,7 +93,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // FREEBAYES - if (checkTools(params.tools, 'freebayes')) { + if (checkInParam(params.tools, 'freebayes')) { BAM_VARIANT_CALLING_FREEBAYES( // Remap channel to match module/subworkflow cram.map{ meta, cram, crai -> [ meta, cram, crai, [], [] ] }, @@ -108,7 +108,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // MUTECT2 - if (checkTools(params.tools, 'mutect2')) { + if (checkInParam(params.tools, 'mutect2')) { BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2( cram, // Remap channel to match module/subworkflow @@ -129,7 +129,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // MANTA - if (checkTools(params.tools, 'manta')) { + if (checkInParam(params.tools, 'manta')) { BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA( cram, // Remap channel to match module/subworkflow @@ -145,7 +145,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // STRELKA - if (checkTools(params.tools, 'strelka')) { + if (checkInParam(params.tools, 'strelka')) { BAM_VARIANT_CALLING_SINGLE_STRELKA( cram, dict, @@ -159,7 +159,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { } // TIDDIT - if (checkTools(params.tools, 'tiddit')) { + if (checkInParam(params.tools, 'tiddit')) { BAM_VARIANT_CALLING_SINGLE_TIDDIT( cram, // Remap channel to match module/subworkflow diff --git a/subworkflows/local/channel_baserecalibrator_create_csv/main.nf b/subworkflows/local/channel_baserecalibrator_create_csv/main.nf index 33a8f8be50..38f659c36d 100644 --- a/subworkflows/local/channel_baserecalibrator_create_csv/main.nf +++ b/subworkflows/local/channel_baserecalibrator_create_csv/main.nf @@ -12,7 +12,7 @@ workflow CHANNEL_BASERECALIBRATOR_CREATE_CSV { main: // Creating csv files to restart from this step - if ( tools && checkTools(params.tools, 'sentieon_dedup') ) { + if ( tools && checkInParam(params.tools, 'sentieon_dedup') ) { cram_table_bqsr.collectFile(keepHeader: true, skip: 1, sort: true, storeDir: "${outdir}/csv") { meta, cram, crai, table -> patient = meta.patient @@ -30,7 +30,7 @@ workflow CHANNEL_BASERECALIBRATOR_CREATE_CSV { ["markduplicates.csv", "patient,sex,status,sample,${type},${type_index},table\n${patient},${sex},${status},${sample},${cram},${crai},${table}\n"] } - } else if ( !(skip_tools && checkTools(params.skip_tools, 'markduplicates')) ) { + } else if ( !(skip_tools && checkInParam(params.skip_tools, 'markduplicates')) ) { cram_table_bqsr.collectFile(keepHeader: true, skip: 1, sort: true, storeDir: "${outdir}/csv") { meta, cram, crai, table -> patient = meta.patient diff --git a/subworkflows/local/vcf_annotate_all/main.nf b/subworkflows/local/vcf_annotate_all/main.nf index cb79014ca1..f1ad47a05d 100644 --- a/subworkflows/local/vcf_annotate_all/main.nf +++ b/subworkflows/local/vcf_annotate_all/main.nf @@ -26,7 +26,7 @@ workflow VCF_ANNOTATE_ALL { json_ann = Channel.empty() versions = Channel.empty() - if (checkTools(params.tools, 'merge') || checkTools(params.tools, 'snpeff')) { + if (checkInParam(params.tools, 'merge') || checkInParam(params.tools, 'snpeff')) { VCF_ANNOTATE_SNPEFF(vcf, snpeff_db, snpeff_cache) reports = reports.mix(VCF_ANNOTATE_SNPEFF.out.reports) @@ -34,7 +34,7 @@ workflow VCF_ANNOTATE_ALL { versions = versions.mix(VCF_ANNOTATE_SNPEFF.out.versions) } - if (checkTools(params.tools, 'merge')) { + if (checkInParam(params.tools, 'merge')) { vcf_ann_for_merge = VCF_ANNOTATE_SNPEFF.out.vcf_tbi.map{ meta, vcf, tbi -> [ meta, vcf, [] ] } VCF_ANNOTATE_MERGE(vcf_ann_for_merge, fasta, vep_genome, vep_species, vep_cache_version, vep_cache, vep_extra_files) @@ -43,7 +43,7 @@ workflow VCF_ANNOTATE_ALL { versions = versions.mix(VCF_ANNOTATE_MERGE.out.versions) } - if (checkTools(params.tools, 'vep')) { + if (checkInParam(params.tools, 'vep')) { vcf_for_vep = vcf.map{ meta, vcf -> [ meta, vcf, [] ] } VCF_ANNOTATE_ENSEMBLVEP(vcf_for_vep, fasta, vep_genome, vep_species, vep_cache_version, vep_cache, vep_extra_files) diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 9b0a55be4a..7292b7ccc9 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -181,7 +181,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_tumor = ['ascat', 'controlfreec', 'mutect2', 'msisensorpro'] def tools_tumor_asked = [] tools_tumor.each{ tool -> - if ( checkTools(params.tools, tool) ) tools_tumor_asked.add(tool) + if ( checkInParam(params.tools, tool) ) tools_tumor_asked.add(tool) } if (!tools_tumor_asked.isEmpty()) { error('The sample-sheet only contains normal-samples, but the following tools, which were requested with "--tools", expect at least one tumor-sample : ' + tools_tumor_asked.join(", ")) @@ -192,7 +192,7 @@ if (params.step != 'annotate' && params.tools && !params.build_only_index) { def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] def requested_tools_requiring_normal_samples = [] tools_requiring_normal_samples.each{ tool_requiring_normal_samples -> - if ( checkTools(params.tools, tool_requiring_normal_samples) ) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) + if ( checkInParam(params.tools, tool_requiring_normal_samples) ) requested_tools_requiring_normal_samples.add(tool_requiring_normal_samples) } if (!requested_tools_requiring_normal_samples.isEmpty()) { error('The sample-sheet only contains tumor-samples, but the following tools, which were requested by the option "tools", expect at least one normal-sample : ' + requested_tools_requiring_normal_samples.join(", ")) @@ -206,7 +206,7 @@ if (params.wes && !params.step == 'annotate') { else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") -if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && checkTools(params.skip_tools, "baserecalibrator") )) { +if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && checkInParam(params.skip_tools, "baserecalibrator") )) { log.warn("DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap\nhttps://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode") } @@ -214,12 +214,12 @@ if (params.step == 'mapping' && params.aligner.contains("sentieon-bwamem") && pa error("Sentieon BWA is currently not compatible with FGBio UMI handeling. Please choose a different aligner.") } -if (params.tools && params.checkTools(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { +if (params.tools && params.checkInParam(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { error("When setting the option `--joint_germline` and including `sentieon_haplotyper` among the requested tools, please set `--sentieon_haplotyper_emit_mode` to include `gvcf`.") } // Fails or warns when missing files or params for ascat -if (params.tools && checkTools(params.tools, 'ascat')) { +if (params.tools && checkInParam(params.tools, 'ascat')) { if (!params.ascat_alleles) { error("No allele files were provided for running ASCAT. Please provide a zip folder with allele files.") } @@ -235,7 +235,7 @@ if (params.tools && checkTools(params.tools, 'ascat')) { } // Warns when missing files or params for mutect2 -if (params.tools && checkTools(params.tools, 'mutect2')) { +if (params.tools && checkInParam(params.tools, 'mutect2')) { if (!params.pon) { log.warn("No Panel-of-normal was specified for Mutect2.\nIt is highly recommended to use one: https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2\nFor more information on how to create one: https://gatk.broadinstitute.org/hc/en-us/articles/5358921041947-CreateSomaticPanelOfNormals-BETA-") } @@ -250,14 +250,14 @@ if (params.tools && checkTools(params.tools, 'mutect2')) { // Fails when missing resources for baserecalibrator // Warns when missing resources for haplotypecaller if (!params.dbsnp && !params.known_indels) { - if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !checkTools(params.skip_tools, 'baserecalibrator')))) { + if (params.step in ['mapping', 'markduplicates', 'prepare_recalibration', 'recalibrate'] && (!params.skip_tools || (params.skip_tools && !checkInParam(params.skip_tools, 'baserecalibrator')))) { error("Base quality score recalibration requires at least one resource file. Please provide at least one of `--dbsnp` or `--known_indels`\nYou can skip this step in the workflow by adding `--skip_tools baserecalibrator` to the command.") } - if (params.tools && (checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper'))) { + if (params.tools && (checkInParam(params.tools, 'haplotypecaller') || checkInParam(params.tools, 'sentieon_haplotyper'))) { log.warn "If GATK's Haplotypecaller or Sentieon's Haplotyper is specified, without `--dbsnp` or `--known_indels no filtering will be done. For filtering, please provide at least one of `--dbsnp` or `--known_indels`.\nFor more information see FilterVariantTranches (single-sample, default): https://gatk.broadinstitute.org/hc/en-us/articles/5358928898971-FilterVariantTranches\nFor more information see VariantRecalibration (--joint_germline): https://gatk.broadinstitute.org/hc/en-us/articles/5358906115227-VariantRecalibrator\nFor more information on GATK Best practice germline variant calling: https://gatk.broadinstitute.org/hc/en-us/articles/360035535932-Germline-short-variant-discovery-SNPs-Indels-" } } -if (params.joint_germline && (!params.tools || !(checkTools(params.tools, 'haplotypecaller') || checkTools(params.tools, 'sentieon_haplotyper')))) { +if (params.joint_germline && (!params.tools || !(checkInParam(params.tools, 'haplotypecaller') || checkInParam(params.tools, 'sentieon_haplotyper')))) { error("The GATK's Haplotypecaller or Sentieon's Haplotyper should be specified as one of the tools when doing joint germline variant calling.) ") } @@ -266,7 +266,7 @@ if (params.joint_germline && (!params.dbsnp || !params.known_indels || !params.k } // Fails when --joint_mutect2 is used without enabling mutect2 -if (params.joint_mutect2 && (!params.tools || !checkTools(params.tools, 'mutect2'))) { +if (params.joint_mutect2 && (!params.tools || !checkInParam(params.tools, 'mutect2'))) { error("The mutect2 should be specified as one of the tools when doing joint somatic variant calling with Mutect2. (The mutect2 could be specified by adding `--tools mutect2` to the nextflow command.)") } @@ -276,7 +276,7 @@ if ((params.step == 'variant_calling' || params.step == 'annotate') && !params.t } // Fails when missing sex information for CNV tools -if (params.tools && (checkTools(params.tools, 'ascat') || checkTools(params.tools, 'controlfreec'))) { +if (params.tools && (checkInParam(params.tools, 'ascat') || checkInParam(params.tools, 'controlfreec'))) { input_sample.map{ if (it[0].sex == 'NA' ) { error("Please specify sex information for each sample in your samplesheet when using '--tools' with 'ascat' or 'controlfreec'.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") @@ -547,7 +547,7 @@ workflow SAREK { else [ intervals[0], intervals[1], num_intervals ] } - if (params.tools && checkTools(params.tools, 'cnvkit')) { + if (params.tools && checkInParam(params.tools, 'cnvkit')) { if (params.cnvkit_reference) { cnvkit_reference = Channel.fromPath(params.cnvkit_reference).collect() } else { @@ -596,7 +596,7 @@ workflow SAREK { // Additional options to be set up // QC - if (!(params.skip_tools && checkTools(params.skip_tools, 'fastqc'))) { + if (!(params.skip_tools && checkInParam(params.skip_tools, 'fastqc'))) { FASTQC(input_fastq) reports = reports.mix(FASTQC.out.zip.collect{ meta, logs -> logs }) @@ -696,8 +696,8 @@ workflow SAREK { if ( params.save_mapped || ( - (params.skip_tools && checkTools(params.skip_tools, 'markduplicates')) && - !(params.tools && checkTools(params.tools, 'sentieon_dedup')) + (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && + !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) ) ) { // bams are merged (when multiple lanes from the same sample), indexed and then converted to cram @@ -738,8 +738,8 @@ workflow SAREK { if ( params.skip_tools && - checkTools(params.skip_tools, 'markduplicates') && - !(params.tools && checkTools(params.tools, 'sentieon_dedup')) + checkInParam(params.skip_tools, 'markduplicates') && + !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) ) { if (params.step == 'mapping') { cram_skip_markduplicates = BAM_TO_CRAM_MAPPING.out.alignment_index @@ -777,7 +777,7 @@ workflow SAREK { // Gather used softwares versions versions = versions.mix(BAM_MARKDUPLICATES_SPARK.out.versions) - } else if (params.tools && checkTools(params.tools, 'sentieon_dedup')) { + } else if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { crai_for_markduplicates = params.step == 'mapping' ? bai_mapped : input_sample.map{ meta, input, index -> [ meta, index ] } BAM_SENTIEON_DEDUP( cram_for_markduplicates, @@ -824,7 +824,7 @@ workflow SAREK { // CSV should be written for the file actually out, either CRAM or BAM // Create CSV to restart from this step - csv_subfolder = (params.tools && checkTools(params.tools, 'sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' + csv_subfolder = (params.tools && checkInParam(params.tools, 'sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' params.save_output_as_bam ? CHANNEL_MARKDUPLICATES_CREATE_CSV(CRAM_TO_BAM.out.alignment_index, csv_subfolder, params.outdir, params.save_output_as_bam) : CHANNEL_MARKDUPLICATES_CREATE_CSV(ch_md_cram_for_restart, csv_subfolder, params.outdir, params.save_output_as_bam) } @@ -865,7 +865,7 @@ workflow SAREK { } // STEP 3: Create recalibration tables - if (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator'))) { + if (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator'))) { ch_table_bqsr_no_spark = Channel.empty() ch_table_bqsr_spark = Channel.empty() @@ -944,7 +944,7 @@ workflow SAREK { .map{ meta, cram, crai, table -> [ meta + [data_type: "cram"], cram, crai, table ]} } - if (!(params.skip_tools && checkTools(params.skip_tools, 'baserecalibrator'))) { + if (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator'))) { cram_variant_calling_no_spark = Channel.empty() cram_variant_calling_spark = Channel.empty() @@ -1121,7 +1121,7 @@ workflow SAREK { known_sites_snps_tbi, known_snps_vqsr, params.joint_germline, - params.skip_tools && checkTools(params.skip_tools, 'haplotypecaller_filter'), // true if filtering should be skipped + params.skip_tools && checkInParam(params.skip_tools, 'haplotypecaller_filter'), // true if filtering should be skipped params.sentieon_haplotyper_emit_mode) // TUMOR ONLY VARIANT CALLING @@ -1215,7 +1215,7 @@ workflow SAREK { // ANNOTATE if (params.step == 'annotate') vcf_to_annotate = input_sample - if (checkTools(params.tools, 'merge') || checkTools(params.tools, 'snpeff') || checkTools(params.tools, 'vep')) { + if (checkInParam(params.tools, 'merge') || checkInParam(params.tools, 'snpeff') || checkInParam(params.tools, 'vep')) { vep_fasta = (params.vep_include_fasta) ? fasta.map{ fasta -> [ [ id:fasta.baseName ], fasta ] } : [[id: 'null'], []] @@ -1238,12 +1238,12 @@ workflow SAREK { } version_yaml = Channel.empty() - if (!(params.skip_tools && checkTools(params.skip_tools, 'versions'))) { + if (!(params.skip_tools && checkInParam(params.skip_tools, 'versions'))) { CUSTOM_DUMPSOFTWAREVERSIONS(versions.unique().collectFile(name: 'collated_versions.yml')) version_yaml = CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect() } - if (!(params.skip_tools && checkTools(params.skip_tools, 'multiqc'))) { + if (!(params.skip_tools && checkInParam(params.skip_tools, 'multiqc'))) { workflow_summary = WorkflowSarek.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) @@ -1310,8 +1310,8 @@ def flowcellLaneFromFastq(path) { // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' -def checkTools(parameter, tool) { - parameter.split(',').any{ it.toLowerCase().equals(tool) } +def checkInParam(parameter, tool) {def checkInParam(parameter, checkValue) { + parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } } From 07c70a00d6c37f1acdd574e96aeb76601230a542 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:47:07 +0000 Subject: [PATCH 12/21] Add nullable check for parameter --- nextflow.config | 4 +++- workflows/sarek.nf | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index be60d8bba0..3f88cccd7a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -389,8 +389,10 @@ includeConfig 'conf/modules/post_variant_calling.config' //annotate includeConfig 'conf/modules/annotate.config' +// Check the parameters tools or skip_tools, then compare it against the provided tool +// Returns true/false based on whether 'tool' is found in 'parameter' def checkInParam(parameter, checkValue) { - parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } + ( parameter && parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } ) } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 7292b7ccc9..92f7b35c2e 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -1311,7 +1311,7 @@ def flowcellLaneFromFastq(path) { // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' def checkInParam(parameter, tool) {def checkInParam(parameter, checkValue) { - parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } + ( parameter && parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } ) } From efc70a6c79068cac5b241c1a0110ffef22eeca00 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:47:34 +0000 Subject: [PATCH 13/21] fixup --- workflows/sarek.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 92f7b35c2e..feae03a343 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -1310,7 +1310,7 @@ def flowcellLaneFromFastq(path) { // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' -def checkInParam(parameter, tool) {def checkInParam(parameter, checkValue) { +def checkInParam(parameter, tool) { ( parameter && parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } ) } From e62f96bd723ccbf6fcf2b1c33f23bc0c381c0271 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 23 Aug 2023 11:49:57 +0000 Subject: [PATCH 14/21] Method overloading for catching lists and strings --- nextflow.config | 16 +++++++++++++++- workflows/sarek.nf | 19 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 3f88cccd7a..544d374255 100644 --- a/nextflow.config +++ b/nextflow.config @@ -392,7 +392,21 @@ includeConfig 'conf/modules/annotate.config' // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' def checkInParam(parameter, checkValue) { - ( parameter && parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } ) + if (!parameter){ + false + } else { + def tokenized_parameter = parameter.tokenize(',') + switch (checkValue) { + // If checkValue is a list check if any appear in tokenized parameter + case checkValue instanceof List: + checkValue.any{ it.toLowerCase() in parameter.tokenize(',') } + // If checkValue is a string check it appears in parameter + case checkValue instanceof String: + checkValue.toLowerCase() in parameter.tokenize(',') + default: + false + } + } } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/sarek.nf b/workflows/sarek.nf index feae03a343..9442cd4330 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -1310,11 +1310,26 @@ def flowcellLaneFromFastq(path) { // Check the parameters tools or skip_tools, then compare it against the provided tool // Returns true/false based on whether 'tool' is found in 'parameter' -def checkInParam(parameter, tool) { - ( parameter && parameter.tokenize(',').any{ it.toLowerCase().equals(checkValue) } ) +def checkInParam(parameter, checkValue) { + if (!parameter){ + false + } else { + def tokenized_parameter = parameter.tokenize(',') + switch (checkValue) { + // If checkValue is a list check if any appear in tokenized parameter + case checkValue instanceof List: + checkValue.any{ it.toLowerCase() in parameter.tokenize(',') } + // If checkValue is a string check it appears in parameter + case checkValue instanceof String: + checkValue.toLowerCase() in parameter.tokenize(',') + default: + false + } + } } + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END From ed6fa7f0b44a581bb1ae73a3b54a970a562162e6 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 29 Aug 2023 17:28:36 +0100 Subject: [PATCH 15/21] Fix params.checkInParam to checkInParam --- conf/modules/joint_germline.config | 2 +- conf/modules/sentieon_dedup.config | 2 +- conf/modules/sentieon_haplotyper.config | 2 +- workflows/sarek.nf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules/joint_germline.config b/conf/modules/joint_germline.config index 74c480eef3..c5c90cd860 100644 --- a/conf/modules/joint_germline.config +++ b/conf/modules/joint_germline.config @@ -30,7 +30,7 @@ process { ] } - if (params.tools && params.checkInParam(params.tools, 'haplotypecaller') && params.joint_germline) { + if (params.tools && checkInParam(params.tools, 'haplotypecaller') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_GATK:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index e48ec89c20..f4efbb9d7d 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -34,7 +34,7 @@ process { ] } - if (params.tools && params.checkInParam(params.tools, 'sentieon_dedup')) { + if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index e2c5ce29f5..ac312fbb24 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -44,7 +44,7 @@ process { ] } - if (params.tools && params.checkInParam(params.tools, 'sentieon_haplotyper')) { + if (params.tools && checkInParam(params.tools, 'sentieon_haplotyper')) { withName: '.*FILTERVARIANTTRANCHES' { ext.prefix = {"${meta.id}.haplotyper"} ext.args = { "--info-key CNN_1D" } diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 9442cd4330..953fb55f4b 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -214,7 +214,7 @@ if (params.step == 'mapping' && params.aligner.contains("sentieon-bwamem") && pa error("Sentieon BWA is currently not compatible with FGBio UMI handeling. Please choose a different aligner.") } -if (params.tools && params.checkInParam(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { +if (params.tools && checkInParam(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { error("When setting the option `--joint_germline` and including `sentieon_haplotyper` among the requested tools, please set `--sentieon_haplotyper_emit_mode` to include `gvcf`.") } From e6c998f08088f5d1d47371bf76bb1f05269ab180 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 29 Aug 2023 18:36:30 +0100 Subject: [PATCH 16/21] Export checkInParam to external file - Move checkInParam to file checkInParam.nf - This allows it to be imported from everywhere - IMPORT EVERWHEEERRRREEE --- checkInParam.nf | 21 +++++++++ main.nf | 2 + nextflow_schema.json | 43 +++++++++++++++---- subworkflows/local/bam_applybqsr/main.nf | 2 + .../local/bam_applybqsr_spark/main.nf | 2 + .../local/bam_baserecalibrator/main.nf | 2 + .../local/bam_baserecalibrator_spark/main.nf | 2 + .../local/bam_convert_samtools/main.nf | 2 + .../bam_joint_calling_germline_gatk/main.nf | 2 + .../main.nf | 2 + subworkflows/local/bam_markduplicates/main.nf | 2 + .../local/bam_markduplicates_spark/main.nf | 2 + .../local/bam_merge_index_samtools/main.nf | 2 + subworkflows/local/bam_sentieon_dedup/main.nf | 2 + .../local/bam_variant_calling_cnvkit/main.nf | 2 + .../bam_variant_calling_deepvariant/main.nf | 2 + .../bam_variant_calling_freebayes/main.nf | 2 + .../bam_variant_calling_germline_all/main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../local/bam_variant_calling_mpileup/main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../bam_variant_calling_single_tiddit/main.nf | 2 + .../bam_variant_calling_somatic_all/main.nf | 2 + .../bam_variant_calling_somatic_ascat/main.nf | 2 + .../main.nf | 2 + .../bam_variant_calling_somatic_manta/main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../main.nf | 2 + .../local/channel_align_create_csv/main.nf | 2 + .../channel_applybqsr_create_csv/main.nf | 2 + .../main.nf | 2 + .../channel_markduplicates_create_csv/main.nf | 2 + .../main.nf | 2 + .../local/cram_merge_index_samtools/main.nf | 2 + .../local/cram_qc_mosdepth_samtools/main.nf | 2 + .../main.nf | 2 + .../fastq_create_umi_consensus_fgbio/main.nf | 2 + .../local/post_variantcalling/main.nf | 2 + subworkflows/local/prepare_cache/main.nf | 2 + subworkflows/local/prepare_genome/main.nf | 2 + subworkflows/local/prepare_intervals/main.nf | 2 + .../local/prepare_reference_cnvkit/main.nf | 2 + subworkflows/local/vcf_annotate_all/main.nf | 2 + .../local/vcf_concatenate_germline/main.nf | 2 + .../local/vcf_qc_bcftools_vcftools/main.nf | 2 + .../local/vcf_variant_filtering_gatk/main.nf | 2 + .../nf-core/vcf_annotate_ensemblvep/main.nf | 2 + .../nf-core/vcf_annotate_snpeff/main.nf | 2 + workflows/sarek.nf | 23 ++-------- 56 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 checkInParam.nf diff --git a/checkInParam.nf b/checkInParam.nf new file mode 100644 index 0000000000..18e2322451 --- /dev/null +++ b/checkInParam.nf @@ -0,0 +1,21 @@ + +// Global function +// Check the parameters tools or skip_tools, then compare it against the provided tool +// Returns true/false based on whether 'tool' is found in 'parameter' +def checkInParam(parameter, checkValue) { + if (!parameter){ + false + } else { + def tokenized_parameter = parameter.tokenize(',') + switch (checkValue) { + // If checkValue is a list check if any appear in tokenized parameter + case checkValue instanceof List: + checkValue.any{ it.toLowerCase() in parameter.tokenize(',') } + // If checkValue is a string check it appears in parameter + case checkValue instanceof String: + checkValue.toLowerCase() in parameter.tokenize(',') + default: + false + } + } +} \ No newline at end of file diff --git a/main.nf b/main.nf index 99ea7db553..67c7eeca2c 100644 --- a/main.nf +++ b/main.nf @@ -101,6 +101,8 @@ WorkflowMain.initialise(workflow, params, log) include { SAREK } from './workflows/sarek' // WORKFLOW: Run main nf-core/sarek analysis pipeline +include { checkInParam } from "${projectDir}/checkInParam" + workflow NFCORE_SAREK { SAREK () } diff --git a/nextflow_schema.json b/nextflow_schema.json index 4db215cae8..46d17ac47c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,7 +11,10 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "help_text": "Specify input samplesheet, step and output folder.", - "required": ["step", "outdir"], + "required": [ + "step", + "outdir" + ], "properties": { "input": { "description": "Path to comma-separated file containing information about the samples in the experiment.", @@ -28,7 +31,9 @@ }, { "type": "boolean", - "enum": ["false"] + "enum": [ + "false" + ] } ] }, @@ -107,14 +112,14 @@ "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).\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|cnvkit|controlfreec|deepvariant|freebayes|haplotypecaller|sentieon_haplotyper|manta|merge|mpileup|msisensorpro|mutect2|sentieon_dedup|snpeff|strelka|tiddit|vep)?,?)*(? **NB** `--skip_tools baserecalibrator_report` is actually just not saving the reports.\n> **NB** `--skip_tools markduplicates_report` does not skip `MarkDuplicates` but prevent the collection of duplicate metrics that slows down performance.", - "pattern": "^((baserecalibrator|baserecalibrator_report|bcftools|documentation|fastqc|haplotypecaller_filter|haplotyper_filter|markduplicates|markduplicates_report|mosdepth|multiqc|samtools|vcftools|versions)?,?)*(? Date: Tue, 29 Aug 2023 18:39:37 +0100 Subject: [PATCH 17/21] Remove explicit check for parameter not null outside of checkInParam statements --- conf/modules/aligner.config | 6 ++-- conf/modules/annotate.config | 2 +- conf/modules/ascat.config | 2 +- conf/modules/cnvkit.config | 6 ++-- conf/modules/controlfreec.config | 2 +- conf/modules/deepvariant.config | 2 +- conf/modules/freebayes.config | 4 +-- conf/modules/haplotypecaller.config | 4 +-- conf/modules/joint_germline.config | 2 +- conf/modules/manta.config | 2 +- conf/modules/markduplicates.config | 14 ++++----- conf/modules/modules.config | 18 ++++++------ conf/modules/mpileup.config | 6 ++-- conf/modules/mutect2.config | 4 +-- conf/modules/prepare_genome.config | 10 +++---- conf/modules/recalibrate.config | 2 +- conf/modules/sentieon_dedup.config | 8 +++--- conf/modules/sentieon_haplotyper.config | 4 +-- conf/modules/sentieon_joint_germline.config | 2 +- conf/modules/strelka.config | 2 +- conf/modules/tiddit.config | 4 +-- workflows/sarek.nf | 32 ++++++++++----------- 22 files changed, 69 insertions(+), 69 deletions(-) diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index 704d9080da..c57e3657f5 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -46,8 +46,8 @@ process { if (params.save_output_as_bam && ( params.save_mapped || - (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && - !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) + (checkInParam(params.skip_tools, 'markduplicates')) && + !(checkInParam(params.tools, 'sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) ) { "mapped/${meta.id}/${it}" } else { null } @@ -75,7 +75,7 @@ process { path: { "${params.outdir}/preprocessing/" }, pattern: "*{bam,bai}", // Only save if (save_output_as_bam AND (no_markduplicates OR save_mapped )) - saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && checkInParam(params.skip_tools, 'markduplicates'))) ? "mapped/${meta.id}/${it}" : null } + saveAs: { (params.save_output_as_bam && (params.save_mapped || checkInParam(params.skip_tools, 'markduplicates'))) ? "mapped/${meta.id}/${it}" : null } ] } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index 7caca9262b..b81fdca088 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -61,7 +61,7 @@ process { } // SNPEFF THEN VEP - if (params.tools && checkInParam(params.tools, 'merge')) { + if (checkInParam(params.tools, 'merge')) { withName: "NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_MERGE:ENSEMBLVEP_VEP" { // If merge: Output file will have format *_snpEff_VEP.ann.vcf, *_snpEff_VEP.ann.json or *_snpEff_VEP.ann.tab ext.prefix = { vcf.baseName - ".ann.vcf" + "_VEP.ann" } diff --git a/conf/modules/ascat.config b/conf/modules/ascat.config index 9e1942216c..4b3fd3a887 100644 --- a/conf/modules/ascat.config +++ b/conf/modules/ascat.config @@ -26,7 +26,7 @@ process { "min_base_qual": params.ascat_min_base_qual, "min_map_qual": params.ascat_min_map_qual ]} - ext.when = { params.tools && checkInParam(params.tools, 'ascat') } + ext.when = { checkInParam(params.tools, 'ascat') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/ascat/${meta.id}/" }, diff --git a/conf/modules/cnvkit.config b/conf/modules/cnvkit.config index 51a26d88bb..a17c684c56 100644 --- a/conf/modules/cnvkit.config +++ b/conf/modules/cnvkit.config @@ -17,7 +17,7 @@ process { // PREPARE REFERENCE CNVKIT withName: 'CNVKIT_ANTITARGET' { - ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') } + ext.when = { checkInParam(params.tools, 'cnvkit') } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -28,7 +28,7 @@ process { withName: 'CNVKIT_REFERENCE' { ext.prefix = "cnvkit" - ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') && !params.cnvkit_reference } + ext.when = { checkInParam(params.tools, 'cnvkit') && !params.cnvkit_reference } publishDir = [ enabled: params.save_reference, mode: params.publish_dir_mode, @@ -40,7 +40,7 @@ process { // CNVKIT withName: 'CNVKIT_BATCH' { ext.args = { params.wes ? "--method hybrid --diagram --scatter" : "--method wgs --diagram --scatter" } - ext.when = { params.tools && checkInParam(params.tools, 'cnvkit') } + ext.when = { checkInParam(params.tools, 'cnvkit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/cnvkit/${meta.id}/" }, diff --git a/conf/modules/controlfreec.config b/conf/modules/controlfreec.config index 70b7709a55..9a9387f865 100644 --- a/conf/modules/controlfreec.config +++ b/conf/modules/controlfreec.config @@ -24,7 +24,7 @@ process { } withName: 'FREEC_.*' { - ext.when = { params.tools && checkInParam(params.tools, 'controlfreec') } + ext.when = { checkInParam(params.tools, 'controlfreec') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/controlfreec/${meta.id}/" }, diff --git a/conf/modules/deepvariant.config b/conf/modules/deepvariant.config index e5c84ec939..a82b6791fd 100644 --- a/conf/modules/deepvariant.config +++ b/conf/modules/deepvariant.config @@ -18,7 +18,7 @@ process { withName: 'DEEPVARIANT' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.deepvariant" : "${meta.id}.deepvariant.${intervals.simpleName}" } ext.args = { params.wes ? "--model_type WES" : "--model_type WGS" } - ext.when = { params.tools && checkInParam(params.tools, 'deepvariant') } + ext.when = { checkInParam(params.tools, 'deepvariant') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index ba9a2342e0..a6eb34c041 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -28,7 +28,7 @@ process { ext.args = '--min-alternate-fraction 0.1 --min-mapping-quality 1' //To make sure no naming conflicts ensure with module BCFTOOLS_SORT & the naming being correct in the output folder ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}" : "${meta.id}.${target_bed.simpleName}" } - ext.when = { params.tools && checkInParam(params.tools, 'freebayes') } + ext.when = { checkInParam(params.tools, 'freebayes') } publishDir = [ enabled: false ] @@ -53,7 +53,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkInParam(params.tools, 'freebayes')) { + if (checkInParam(params.tools, 'freebayes')) { withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_FREEBAYES:FREEBAYES' { ext.args = "--pooled-continuous \ --pooled-discrete \ diff --git a/conf/modules/haplotypecaller.config b/conf/modules/haplotypecaller.config index 2ec07370e9..8078b79b23 100644 --- a/conf/modules/haplotypecaller.config +++ b/conf/modules/haplotypecaller.config @@ -18,7 +18,7 @@ process { withName: 'GATK4_HAPLOTYPECALLER' { ext.args = { params.joint_germline ? "-ERC GVCF" : "" } ext.prefix = { meta.num_intervals <= 1 ? ( params.joint_germline ? "${meta.id}.haplotypecaller.g" : "${meta.id}.haplotypecaller" ) : ( params.joint_germline ? "${meta.id}.haplotypecaller.${intervals.simpleName}.g" :"${meta.id}.haplotypecaller.${intervals.simpleName}" ) } - ext.when = { params.tools && checkInParam(params.tools, 'haplotypecaller') } + ext.when = { checkInParam(params.tools, 'haplotypecaller') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, @@ -53,7 +53,7 @@ process { ] } - if (params.tools && checkInParam(params.tools, 'haplotypecaller')) { + if (checkInParam(params.tools, 'haplotypecaller')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_HAPLOTYPECALLER:BAM_MERGE_INDEX_SAMTOOLS:(MERGE_BAM|INDEX_MERGE_BAM)' { ext.prefix = { "${meta.id}.realigned" } publishDir = [ diff --git a/conf/modules/joint_germline.config b/conf/modules/joint_germline.config index c5c90cd860..67519f2343 100644 --- a/conf/modules/joint_germline.config +++ b/conf/modules/joint_germline.config @@ -30,7 +30,7 @@ process { ] } - if (params.tools && checkInParam(params.tools, 'haplotypecaller') && params.joint_germline) { + if (checkInParam(params.tools, 'haplotypecaller') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_GATK:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/manta.config b/conf/modules/manta.config index 45717a3932..0568f07c2e 100644 --- a/conf/modules/manta.config +++ b/conf/modules/manta.config @@ -14,7 +14,7 @@ // MANTA process { - if (params.tools && checkInParam(params.tools, 'manta')) { + if (checkInParam(params.tools, 'manta')) { withName: 'MANTA_GERMLINE|MANTA_TUMORONLY|MANTA_SOMATIC' { ext.args = { params.wes ? "--exome" : "" } ext.prefix = { "${meta.id}.manta" } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index 9d1840467e..c2141a0603 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -34,7 +34,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:(BAM_MARKDUPLICATES|BAM_MARKDUPLICATES_SPARK):CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } + ext.when = { !(checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.md.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -47,8 +47,8 @@ process { // Run only when mapping should be saved as CRAM or when no MD is done ext.when = (params.save_mapped && !params.save_output_as_bam) || ( - (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && - !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) + (checkInParam(params.skip_tools, 'markduplicates')) && + !(checkInParam(params.tools, 'sentieon_dedup')) ) ext.prefix = { "${meta.id}.sorted" } publishDir = [ @@ -62,7 +62,7 @@ process { withName: 'GATK4_ESTIMATELIBRARYCOMPLEXITY' { ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates_report')) } + ext.when = { !(checkInParam(params.skip_tools, 'markduplicates_report')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/markduplicates/${meta.id}" }, @@ -73,7 +73,7 @@ process { withName: 'GATK4_MARKDUPLICATES' { ext.args = '-REMOVE_DUPLICATES false -VALIDATION_STRINGENCY LENIENT' ext.prefix = { "${meta.id}.md.cram" } - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) } + ext.when = { !(checkInParam(params.skip_tools, 'markduplicates')) } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -85,7 +85,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*metrics", - saveAs: { !(params.skip_tools && checkInParam(params.skip_tools, 'markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} + saveAs: { !(checkInParam(params.skip_tools, 'markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} ] ] } @@ -112,7 +112,7 @@ process { withName: 'NFCORE_SAREK:SAREK:CRAM_TO_BAM' { ext.when = { params.save_output_as_bam } - if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { + if (checkInParam(params.tools, 'sentieon_dedup')) { ext.prefix = { "${meta.id}.dedup" } publishDir = [ enabled: params.save_output_as_bam, diff --git a/conf/modules/modules.config b/conf/modules/modules.config index ff5cc2cfa1..cbf989135d 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -30,7 +30,7 @@ process { // QC withName: 'FASTQC' { ext.args = '--quiet' - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'fastqc')) } + ext.when = { !(checkInParam(params.skip_tools, 'fastqc')) } publishDir = [ [ path: { "${params.outdir}/reports/fastqc/${meta.id}" }, @@ -41,7 +41,7 @@ process { } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_NO_MD:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } + ext.when = { !(checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.sorted.cram" } publishDir = [ mode: params.publish_dir_mode, @@ -53,15 +53,15 @@ process { withName: 'MOSDEPTH' { ext.args = { !params.wes ? "-n --fast-mode --by 500" : ""} ext.prefix = { - if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { + if (checkInParam(params.tools, 'sentieon_dedup')) { "${meta.id}.dedup" - } else if (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) { + } else if (checkInParam(params.skip_tools, 'markduplicates')) { "${meta.id}.sorted" } else { "${meta.id}.md" } } - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'mosdepth')) } + ext.when = { !(checkInParam(params.skip_tools, 'mosdepth')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/mosdepth/${meta.id}" }, @@ -69,14 +69,14 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(checkInParam(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:MOSDEPTH' { ext.prefix = { "${meta.id}.recal" } } withName: 'NFCORE_SAREK:SAREK:CRAM_QC_RECAL:SAMTOOLS_STATS' { ext.prefix = { "${meta.id}.recal.cram" } - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } + ext.when = { !(checkInParam(params.skip_tools, 'samtools')) } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/samtools/${meta.id}" }, @@ -87,7 +87,7 @@ process { // VCF withName: 'BCFTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'bcftools')) } + ext.when = { !(checkInParam(params.skip_tools, 'bcftools')) } ext.prefix = { vcf.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, @@ -97,7 +97,7 @@ process { } withName: 'VCFTOOLS_.*' { - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'vcftools')) } + ext.when = { !(checkInParam(params.skip_tools, 'vcftools')) } ext.prefix = { variant_file.baseName - ".vcf" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/mpileup.config b/conf/modules/mpileup.config index f2014dd3ef..011bc3f449 100644 --- a/conf/modules/mpileup.config +++ b/conf/modules/mpileup.config @@ -23,7 +23,7 @@ process { withName: 'BCFTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.bcftools" : "${meta.id}_${intervals.simpleName}.bcftools" } - ext.when = { params.tools && checkInParam(params.tools, 'mpileup') } + ext.when = { checkInParam(params.tools, 'mpileup') } ext.args2 = "--multiallelic-caller" ext.args3 = "-i 'count(GT==\"RR\")==0'" // only report non homozygous reference variants publishDir = [ @@ -44,7 +44,7 @@ process { } withName: 'SAMTOOLS_MPILEUP' { - ext.when = { params.tools && checkInParam(params.tools, 'controlfreec') } + ext.when = { checkInParam(params.tools, 'controlfreec') } publishDir = [ enabled: false ] @@ -52,7 +52,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkInParam(params.tools, 'controlfreec')) { + if (checkInParam(params.tools, 'controlfreec')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_MPILEUP:SAMTOOLS_MPILEUP' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } } diff --git a/conf/modules/mutect2.config b/conf/modules/mutect2.config index 329b3e151e..de0b18b19b 100644 --- a/conf/modules/mutect2.config +++ b/conf/modules/mutect2.config @@ -14,11 +14,11 @@ // MUTECT2 process { - if (params.tools && checkInParam(params.tools, 'mutect2')) { + if (checkInParam(params.tools, 'mutect2')) { withName: 'GATK4_MUTECT2' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.mutect2" : "${meta.id}.mutect2.${intervals.simpleName}" } - ext.when = { params.tools && checkInParam(params.tools, 'mutect2') } + ext.when = { checkInParam(params.tools, 'mutect2') } ext.args = { params.ignore_soft_clipped_bases ? "--dont-use-soft-clipped-bases true --f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" : "--f1r2-tar-gz ${task.ext.prefix}.f1r2.tar.gz" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 273e453f27..e175980bfb 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -56,7 +56,7 @@ process { } withName: 'MSISENSORPRO_SCAN' { - ext.when = { params.tools && checkInParam(params.tools, 'msisensorpro') } + ext.when = { checkInParam(params.tools, 'msisensorpro') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -86,7 +86,7 @@ process { } withName: 'TABIX_GERMLINE_RESOURCE' { - ext.when = { !params.germline_resource_tbi && params.germline_resource && params.tools && checkInParam(params.tools, 'mutect2') } + ext.when = { !params.germline_resource_tbi && params.germline_resource && checkInParam(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -116,7 +116,7 @@ process { } withName: 'TABIX_PON' { - ext.when = { !params.pon_tbi && params.pon && params.tools && checkInParam(params.tools, 'mutect2') } + ext.when = { !params.pon_tbi && params.pon && checkInParam(params.tools, 'mutect2') } publishDir = [ enabled: (params.save_reference || params.build_only_index), mode: params.publish_dir_mode, @@ -126,13 +126,13 @@ process { } withName: 'UNZIP_ALLELES|UNZIP_LOCI|UNZIP_GC|UNZIP_RT' { - ext.when = { params.tools && checkInParam(params.tools, 'ascat')} + ext.when = { checkInParam(params.tools, 'ascat')} publishDir = [ enabled: false ] } withName: 'UNTAR_CHR_DIR' { - ext.when = { params.tools && checkInParam(params.tools, 'controlfreec')} + ext.when = { checkInParam(params.tools, 'controlfreec')} } } diff --git a/conf/modules/recalibrate.config b/conf/modules/recalibrate.config index 3ce904a35e..f98166cc2d 100644 --- a/conf/modules/recalibrate.config +++ b/conf/modules/recalibrate.config @@ -26,7 +26,7 @@ process { ] } - if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator')))) { + if ((params.step == 'mapping' || params.step == 'markduplicates'|| params.step == 'prepare_recalibration'|| params.step == 'recalibrate') && (!(checkInParam(params.skip_tools, 'baserecalibrator')))) { withName: 'NFCORE_SAREK:SAREK:(BAM_APPLYBQSR|BAM_APPLYBQSR_SPARK):CRAM_MERGE_INDEX_SAMTOOLS:MERGE_CRAM' { ext.prefix = { "${meta.id}.recal" } ext.when = { meta.num_intervals > 1 } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index f4efbb9d7d..74f67f6ae4 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_DEDUP' { ext.prefix = { "${meta.id}.dedup" } - ext.when = { params.tools && checkInParam(params.tools, 'sentieon_dedup') } + ext.when = { checkInParam(params.tools, 'sentieon_dedup') } publishDir = [ [ enabled: !params.save_output_as_bam, @@ -29,14 +29,14 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*{metrics,metrics.multiqc.tsv}", - saveAs: { !(params.skip_tools && checkInParam(params.skip_tools, 'sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} + saveAs: { !(checkInParam(params.skip_tools, 'sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} ] ] } - if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { + if (checkInParam(params.tools, 'sentieon_dedup')) { withName: 'NFCORE_SAREK:SAREK:BAM_SENTIEON_DEDUP:CRAM_QC_MOSDEPTH_SAMTOOLS:SAMTOOLS_STATS' { - ext.when = { !(params.skip_tools && checkInParam(params.skip_tools, 'samtools')) } + ext.when = { !(checkInParam(params.skip_tools, 'samtools')) } ext.prefix = { "${meta.id}.dedup.cram" } publishDir = [ mode: params.publish_dir_mode, diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index ac312fbb24..5935b7e418 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -17,7 +17,7 @@ process { withName: 'SENTIEON_HAPLOTYPER' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.haplotyper" : "${meta.id}.haplotyper.${intervals.simpleName}" } - ext.when = { params.tools && checkInParam(params.tools, 'sentieon_haplotyper') } + ext.when = { checkInParam(params.tools, 'sentieon_haplotyper') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, @@ -44,7 +44,7 @@ process { ] } - if (params.tools && checkInParam(params.tools, 'sentieon_haplotyper')) { + if (checkInParam(params.tools, 'sentieon_haplotyper')) { withName: '.*FILTERVARIANTTRANCHES' { ext.prefix = {"${meta.id}.haplotyper"} ext.args = { "--info-key CNN_1D" } diff --git a/conf/modules/sentieon_joint_germline.config b/conf/modules/sentieon_joint_germline.config index d6bdfdf48f..97cf211d27 100644 --- a/conf/modules/sentieon_joint_germline.config +++ b/conf/modules/sentieon_joint_germline.config @@ -23,7 +23,7 @@ process { ] } - if (params.tools && checkInParam(params.tools, 'sentieon_haplotyper') && params.joint_germline) { + if (checkInParam(params.tools, 'sentieon_haplotyper') && params.joint_germline) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_JOINT_CALLING_GERMLINE_SENTIEON:BCFTOOLS_SORT' { ext.prefix = { vcf.baseName - ".vcf" + ".sort" } publishDir = [ diff --git a/conf/modules/strelka.config b/conf/modules/strelka.config index 0b23b2f0e7..eb80748535 100644 --- a/conf/modules/strelka.config +++ b/conf/modules/strelka.config @@ -18,7 +18,7 @@ process { withName: 'STRELKA_.*' { ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.strelka" : "${meta.id}.strelka.${target_bed.simpleName}" } ext.args = { params.wes ? "--exome" : "" } - ext.when = { params.tools && checkInParam(params.tools, 'strelka') } + ext.when = { checkInParam(params.tools, 'strelka') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, diff --git a/conf/modules/tiddit.config b/conf/modules/tiddit.config index d58e091e30..0ca1fbbef6 100644 --- a/conf/modules/tiddit.config +++ b/conf/modules/tiddit.config @@ -18,7 +18,7 @@ process { withName: 'TIDDIT_SV' { ext.args = { bwa_index ? "" : "--skip_assembly" } ext.prefix = { "${meta.id}.tiddit" } - ext.when = { params.tools && checkInParam(params.tools, 'tiddit') } + ext.when = { checkInParam(params.tools, 'tiddit') } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/tiddit/${meta.id}/" }, @@ -36,7 +36,7 @@ process { } // PAIR_VARIANT_CALLING - if (params.tools && checkInParam(params.tools, 'tiddit')) { + if (checkInParam(params.tools, 'tiddit')) { withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_SOMATIC_TIDDIT:TIDDIT_NORMAL:TABIX_BGZIP_TIDDIT_SV' { ext.prefix = {"${meta.id}.tiddit.normal"} } diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 3b9a56480d..7bab981def 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -207,7 +207,7 @@ if (params.wes && !params.step == 'annotate') { else log.warn("Intervals file was provided without parameter `--wes`: Pipeline will assume this is Whole-Genome-Sequencing data.") } else if (params.intervals && !params.intervals.endsWith("bed") && !params.intervals.endsWith("list")) error("Intervals file must end with .bed, .list, or .interval_list") -if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(params.skip_tools && checkInParam(params.skip_tools, "baserecalibrator") )) { +if (params.step == 'mapping' && params.aligner.contains("dragmap") && !(checkInParam(params.skip_tools, "baserecalibrator") )) { log.warn("DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap\nhttps://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode") } @@ -215,12 +215,12 @@ if (params.step == 'mapping' && params.aligner.contains("sentieon-bwamem") && pa error("Sentieon BWA is currently not compatible with FGBio UMI handeling. Please choose a different aligner.") } -if (params.tools && checkInParam(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { +if (checkInParam(params.tools, "sentieon_haplotyper") && params.joint_germline && (!params.sentieon_haplotyper_emit_mode || !(params.sentieon_haplotyper_emit_mode.contains('gvcf')))) { error("When setting the option `--joint_germline` and including `sentieon_haplotyper` among the requested tools, please set `--sentieon_haplotyper_emit_mode` to include `gvcf`.") } // Fails or warns when missing files or params for ascat -if (params.tools && checkInParam(params.tools, 'ascat')) { +if (checkInParam(params.tools, 'ascat')) { if (!params.ascat_alleles) { error("No allele files were provided for running ASCAT. Please provide a zip folder with allele files.") } @@ -236,7 +236,7 @@ if (params.tools && checkInParam(params.tools, 'ascat')) { } // Warns when missing files or params for mutect2 -if (params.tools && checkInParam(params.tools, 'mutect2')) { +if (checkInParam(params.tools, 'mutect2')) { if (!params.pon) { log.warn("No Panel-of-normal was specified for Mutect2.\nIt is highly recommended to use one: https://gatk.broadinstitute.org/hc/en-us/articles/5358911630107-Mutect2\nFor more information on how to create one: https://gatk.broadinstitute.org/hc/en-us/articles/5358921041947-CreateSomaticPanelOfNormals-BETA-") } @@ -550,7 +550,7 @@ workflow SAREK { else [ intervals[0], intervals[1], num_intervals ] } - if (params.tools && checkInParam(params.tools, 'cnvkit')) { + if (checkInParam(params.tools, 'cnvkit')) { if (params.cnvkit_reference) { cnvkit_reference = Channel.fromPath(params.cnvkit_reference).collect() } else { @@ -599,7 +599,7 @@ workflow SAREK { // Additional options to be set up // QC - if (!(params.skip_tools && checkInParam(params.skip_tools, 'fastqc'))) { + if (!(checkInParam(params.skip_tools, 'fastqc'))) { FASTQC(input_fastq) reports = reports.mix(FASTQC.out.zip.collect{ meta, logs -> logs }) @@ -699,8 +699,8 @@ workflow SAREK { if ( params.save_mapped || ( - (params.skip_tools && checkInParam(params.skip_tools, 'markduplicates')) && - !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) + (checkInParam(params.skip_tools, 'markduplicates')) && + !(checkInParam(params.tools, 'sentieon_dedup')) ) ) { // bams are merged (when multiple lanes from the same sample), indexed and then converted to cram @@ -742,7 +742,7 @@ workflow SAREK { if ( params.skip_tools && checkInParam(params.skip_tools, 'markduplicates') && - !(params.tools && checkInParam(params.tools, 'sentieon_dedup')) + !(checkInParam(params.tools, 'sentieon_dedup')) ) { if (params.step == 'mapping') { cram_skip_markduplicates = BAM_TO_CRAM_MAPPING.out.alignment_index @@ -780,7 +780,7 @@ workflow SAREK { // Gather used softwares versions versions = versions.mix(BAM_MARKDUPLICATES_SPARK.out.versions) - } else if (params.tools && checkInParam(params.tools, 'sentieon_dedup')) { + } else if (checkInParam(params.tools, 'sentieon_dedup')) { crai_for_markduplicates = params.step == 'mapping' ? bai_mapped : input_sample.map{ meta, input, index -> [ meta, index ] } BAM_SENTIEON_DEDUP( cram_for_markduplicates, @@ -827,7 +827,7 @@ workflow SAREK { // CSV should be written for the file actually out, either CRAM or BAM // Create CSV to restart from this step - csv_subfolder = (params.tools && checkInParam(params.tools, 'sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' + csv_subfolder = (checkInParam(params.tools, 'sentieon_dedup')) ? 'sentieon_dedup' : 'markduplicates' params.save_output_as_bam ? CHANNEL_MARKDUPLICATES_CREATE_CSV(CRAM_TO_BAM.out.alignment_index, csv_subfolder, params.outdir, params.save_output_as_bam) : CHANNEL_MARKDUPLICATES_CREATE_CSV(ch_md_cram_for_restart, csv_subfolder, params.outdir, params.save_output_as_bam) } @@ -868,7 +868,7 @@ workflow SAREK { } // STEP 3: Create recalibration tables - if (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator'))) { + if (!(checkInParam(params.skip_tools, 'baserecalibrator'))) { ch_table_bqsr_no_spark = Channel.empty() ch_table_bqsr_spark = Channel.empty() @@ -947,7 +947,7 @@ workflow SAREK { .map{ meta, cram, crai, table -> [ meta + [data_type: "cram"], cram, crai, table ]} } - if (!(params.skip_tools && checkInParam(params.skip_tools, 'baserecalibrator'))) { + if (!(checkInParam(params.skip_tools, 'baserecalibrator'))) { cram_variant_calling_no_spark = Channel.empty() cram_variant_calling_spark = Channel.empty() @@ -1124,7 +1124,7 @@ workflow SAREK { known_sites_snps_tbi, known_snps_vqsr, params.joint_germline, - params.skip_tools && checkInParam(params.skip_tools, 'haplotypecaller_filter'), // true if filtering should be skipped + checkInParam(params.skip_tools, 'haplotypecaller_filter'), // true if filtering should be skipped params.sentieon_haplotyper_emit_mode) // TUMOR ONLY VARIANT CALLING @@ -1241,12 +1241,12 @@ workflow SAREK { } version_yaml = Channel.empty() - if (!(params.skip_tools && checkInParam(params.skip_tools, 'versions'))) { + if (!(checkInParam(params.skip_tools, 'versions'))) { CUSTOM_DUMPSOFTWAREVERSIONS(versions.unique().collectFile(name: 'collated_versions.yml')) version_yaml = CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect() } - if (!(params.skip_tools && checkInParam(params.skip_tools, 'multiqc'))) { + if (!(checkInParam(params.skip_tools, 'multiqc'))) { workflow_summary = WorkflowSarek.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) From 0a3b1cdc8325fad12043c32a4cc49c16b6f7aff0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:29:54 +0100 Subject: [PATCH 18/21] Setup Cache for Nextflow and Pip --- .github/workflows/pytest-workflow.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest-workflow.yml b/.github/workflows/pytest-workflow.yml index a33f8075aa..3900fe8075 100644 --- a/.github/workflows/pytest-workflow.yml +++ b/.github/workflows/pytest-workflow.yml @@ -108,23 +108,27 @@ jobs: python-version: "3.x" - uses: actions/cache@v3 + id: python-cache-setup with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | - ${{ runner.os }}-pip- + ${{ runner.os }}-pip - name: Install Python dependencies + if: steps.python-cache-setup.outputs.cache-hit != 'true' run: python -m pip install --upgrade pip pytest-workflow cryptography - uses: actions/cache@v3 + id: nextflow-cache-setup with: path: /usr/local/bin/nextflow key: ${{ runner.os }} restore-keys: | - ${{ runner.os }}-nextflow- + ${{ runner.os }}-nextflow - name: Install Nextflow ${{ matrix.NXF_VER }} + if: steps.nextflow-cache-setup.outputs.cache-hit != 'true' uses: nf-core/setup-nextflow@v1.2.0 with: version: "${{ matrix.NXF_VER }}" From 5ca82cb3ea5677e568af82d56ad626afee1684d5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:39:57 +0100 Subject: [PATCH 19/21] unique-ify the installation cache key --- .github/workflows/pytest-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest-workflow.yml b/.github/workflows/pytest-workflow.yml index 3900fe8075..9e79e757ea 100644 --- a/.github/workflows/pytest-workflow.yml +++ b/.github/workflows/pytest-workflow.yml @@ -113,7 +113,7 @@ jobs: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | - ${{ runner.os }}-pip + ${{ runner.os }}-pip-${{ github.event.repository.name }} - name: Install Python dependencies if: steps.python-cache-setup.outputs.cache-hit != 'true' @@ -125,7 +125,7 @@ jobs: path: /usr/local/bin/nextflow key: ${{ runner.os }} restore-keys: | - ${{ runner.os }}-nextflow + ${{ runner.os }}-nextflow-${{ github.event.repository.name }} - name: Install Nextflow ${{ matrix.NXF_VER }} if: steps.nextflow-cache-setup.outputs.cache-hit != 'true' From d142cbc42d718558b3bd64419d204be5a1a98aed Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:50:37 +0100 Subject: [PATCH 20/21] Add Nf version to nf-cache --- .github/workflows/pytest-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pytest-workflow.yml b/.github/workflows/pytest-workflow.yml index 9e79e757ea..b00c7c8329 100644 --- a/.github/workflows/pytest-workflow.yml +++ b/.github/workflows/pytest-workflow.yml @@ -125,7 +125,7 @@ jobs: path: /usr/local/bin/nextflow key: ${{ runner.os }} restore-keys: | - ${{ runner.os }}-nextflow-${{ github.event.repository.name }} + ${{ runner.os }}-nextflow-${{ matrix.NXF_VER }}-${{ github.event.repository.name }} - name: Install Nextflow ${{ matrix.NXF_VER }} if: steps.nextflow-cache-setup.outputs.cache-hit != 'true' From 81462b209b49dbdce7900251be79332bee67fe34 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 7 Sep 2023 12:31:12 +0100 Subject: [PATCH 21/21] lint --- checkInParam.nf | 2 +- nextflow_schema.json | 39 +++++++-------------------------------- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/checkInParam.nf b/checkInParam.nf index 18e2322451..2df385de71 100644 --- a/checkInParam.nf +++ b/checkInParam.nf @@ -18,4 +18,4 @@ def checkInParam(parameter, checkValue) { false } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 46d17ac47c..cc65b6390d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,10 +11,7 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "help_text": "Specify input samplesheet, step and output folder.", - "required": [ - "step", - "outdir" - ], + "required": ["step", "outdir"], "properties": { "input": { "description": "Path to comma-separated file containing information about the samples in the experiment.", @@ -31,9 +28,7 @@ }, { "type": "boolean", - "enum": [ - "false" - ] + "enum": ["false"] } ] }, @@ -215,12 +210,7 @@ "type": "string", "default": "bwa-mem", "fa_icon": "fas fa-puzzle-piece", - "enum": [ - "bwa-mem", - "bwa-mem2", - "dragmap", - "sentieon-bwamem" - ], + "enum": ["bwa-mem", "bwa-mem2", "dragmap", "sentieon-bwamem"], "description": "Specify aligner to be used to map reads to reference genome.", "help_text": "Sarek will build missing indices automatically if not provided. Set `--bwa false` if indices should be (re-)built.\nIf DragMap is selected as aligner, it is recommended to skip baserecalibration with `--skip_tools baserecalibrator`. For more info see [here](https://gatk.broadinstitute.org/hc/en-us/articles/4407897446939--How-to-Run-germline-single-sample-short-variant-discovery-in-DRAGEN-mode)." }, @@ -551,11 +541,7 @@ "type": "string", "default": "vcf", "description": "VEP output-file format.", - "enum": [ - "json", - "tab", - "vcf" - ], + "enum": ["json", "tab", "vcf"], "help_text": "Sets the format of the output-file from VEP. Available formats: json, tab and vcf.", "fa_icon": "fas fa-table", "hidden": true @@ -580,11 +566,7 @@ "fa_icon": "fa-solid fa-text", "description": "ASCAT genome.", "help_text": "If you use AWS iGenomes, this has already been set for you appropriately.\n\nMust be set to run ASCAT, either hg19 or hg38. If you use AWS iGenomes, this has already been set for you appropriately.", - "enum": [ - "None", - "hg19", - "hg38" - ], + "enum": ["None", "hg19", "hg38"], "hidden": true }, "ascat_alleles": { @@ -939,14 +921,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email": { @@ -1077,4 +1052,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +}